git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download mbox.gz: |
* [PATCH 5/6] submodule: fixup nested submodules after moving the submodule
  2018-03-28 17:24  4% ` [PATCHv2 0/6] Moving submodules with nested submodules Stefan Beller
@ 2018-03-28 17:24  9%   ` Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2018-03-28 17:24 UTC (permalink / raw)
  To: sbeller, gitster; +Cc: bmwill, git, hvoigt, jonathantanmy, seanwbehan

connect_work_tree_and_git_dir is used to connect a submodule worktree with
its git directory and vice versa after events that require a reconnection
such as moving around the working tree. As submodules can have nested
submodules themselves, we'd also want to fix the nested submodules when
asked to. Add an option to recurse into the nested submodules and connect
them as well.

As submodules are identified by their name (which determines their git
directory in relation to their superproject's git directory) internally
and by their path in the working tree of the superproject, we need to
make sure that the mapping of name <-> path is kept intact. We can do
that in the git-mv command by writing out the gitmodules file first
and then forcing a reload of the submodule config machinery.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 builtin/mv.c                |  6 ++--
 builtin/submodule--helper.c |  3 +-
 dir.c                       | 63 +++++++++++++++++++++++++++++++++++--
 dir.h                       | 12 ++++++-
 submodule.c                 |  6 ++--
 t/t7001-mv.sh               |  2 +-
 6 files changed, 80 insertions(+), 12 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 6d141f7a53..7a63667d64 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -276,10 +276,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			die_errno(_("renaming '%s' failed"), src);
 		}
 		if (submodule_gitfile[i]) {
-			if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
-				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
 			if (!update_path_in_gitmodules(src, dst))
 				gitmodules_modified = 1;
+			if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
+				connect_work_tree_and_git_dir(dst,
+							      submodule_gitfile[i],
+							      1);
 		}
 
 		if (mode == WORKING_DIRECTORY)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index a921fbbf56..05fd657f99 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1259,8 +1259,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
 		strbuf_reset(&sb);
 	}
 
-	/* Connect module worktree and git dir */
-	connect_work_tree_and_git_dir(path, sm_gitdir);
+	connect_work_tree_and_git_dir(path, sm_gitdir, 0);
 
 	p = git_pathdup_submodule(path, "config");
 	if (!p)
diff --git a/dir.c b/dir.c
index dedbf5d476..71947c0ef3 100644
--- a/dir.c
+++ b/dir.c
@@ -19,6 +19,7 @@
 #include "varint.h"
 #include "ewah/ewok.h"
 #include "fsmonitor.h"
+#include "submodule-config.h"
 
 /*
  * Tells read_directory_recursive how a file or directory should be treated.
@@ -3010,8 +3011,60 @@ void untracked_cache_add_to_index(struct index_state *istate,
 	untracked_cache_invalidate_path(istate, path, 1);
 }
 
-/* Update gitfile and core.worktree setting to connect work tree and git dir */
-void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
+static void connect_wt_gitdir_in_nested(const char *sub_worktree,
+					const char *sub_gitdir)
+{
+	int i;
+	struct repository subrepo;
+	struct strbuf sub_wt = STRBUF_INIT;
+	struct strbuf sub_gd = STRBUF_INIT;
+
+	const struct submodule *sub;
+
+	if (repo_init(&subrepo, sub_gitdir, sub_worktree))
+		return;
+
+	if (repo_read_index(&subrepo) < 0)
+		die("index file corrupt in repo %s", subrepo.gitdir);
+
+	for (i = 0; i < subrepo.index->cache_nr; i++) {
+		const struct cache_entry *ce = subrepo.index->cache[i];
+
+		if (!S_ISGITLINK(ce->ce_mode))
+			continue;
+
+		while (i + 1 < subrepo.index->cache_nr &&
+		       !strcmp(ce->name, subrepo.index->cache[i + 1]->name))
+			/*
+			 * Skip entries with the same name in different stages
+			 * to make sure an entry is returned only once.
+			 */
+			i++;
+
+		sub = submodule_from_path(&subrepo, &null_oid, ce->name);
+		if (!sub)
+			/* submodule not checked out? */
+			continue;
+
+		if (is_submodule_active(&subrepo, ce->name)) {
+			strbuf_addf(&sub_wt, "%s/%s", sub_worktree, sub->path);
+			strbuf_addf(&sub_gd, "%s/modules/%s", sub_gitdir, sub->name);
+
+			connect_work_tree_and_git_dir(sub_wt.buf, sub_gd.buf, 0);
+			connect_wt_gitdir_in_nested(sub_wt.buf, sub_gd.buf);
+
+			strbuf_reset(&sub_wt);
+			strbuf_reset(&sub_gd);
+		}
+	}
+	strbuf_release(&sub_wt);
+	strbuf_release(&sub_gd);
+	repo_clear(&subrepo);
+}
+
+void connect_work_tree_and_git_dir(const char *work_tree_,
+				   const char *git_dir_,
+				   int recurse_into_nested)
 {
 	struct strbuf gitfile_sb = STRBUF_INIT;
 	struct strbuf cfg_sb = STRBUF_INIT;
@@ -3041,6 +3094,10 @@ void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
 	strbuf_release(&gitfile_sb);
 	strbuf_release(&cfg_sb);
 	strbuf_release(&rel_path);
+
+	if (recurse_into_nested)
+		connect_wt_gitdir_in_nested(work_tree, git_dir);
+
 	free(work_tree);
 	free(git_dir);
 }
@@ -3054,5 +3111,5 @@ void relocate_gitdir(const char *path, const char *old_git_dir, const char *new_
 		die_errno(_("could not migrate git directory from '%s' to '%s'"),
 			old_git_dir, new_git_dir);
 
-	connect_work_tree_and_git_dir(path, new_git_dir);
+	connect_work_tree_and_git_dir(path, new_git_dir, 0);
 }
diff --git a/dir.h b/dir.h
index b0758b82a2..3870193e52 100644
--- a/dir.h
+++ b/dir.h
@@ -359,7 +359,17 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
 void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);
 void add_untracked_cache(struct index_state *istate);
 void remove_untracked_cache(struct index_state *istate);
-extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
+
+/*
+ * Connect a worktree to a git directory by creating (or overwriting) a
+ * '.git' file containing the location of the git directory. In the git
+ * directory set the core.worktree setting to indicate where the worktree is.
+ * When `recurse_into_nested` is set, recurse into any nested submodules,
+ * connecting them as well.
+ */
+extern void connect_work_tree_and_git_dir(const char *work_tree,
+					  const char *git_dir,
+					  int recurse_into_nested);
 extern void relocate_gitdir(const char *path,
 			    const char *old_git_dir,
 			    const char *new_git_dir);
diff --git a/submodule.c b/submodule.c
index 89d0aee086..c2dac6c00f 100644
--- a/submodule.c
+++ b/submodule.c
@@ -1624,7 +1624,7 @@ int submodule_move_head(const char *path,
 		} else {
 			char *gitdir = xstrfmt("%s/modules/%s",
 				    get_git_common_dir(), sub->name);
-			connect_work_tree_and_git_dir(path, gitdir);
+			connect_work_tree_and_git_dir(path, gitdir, 0);
 			free(gitdir);
 
 			/* make sure the index is clean as well */
@@ -1634,7 +1634,7 @@ int submodule_move_head(const char *path,
 		if (old_head && (flags & SUBMODULE_MOVE_HEAD_FORCE)) {
 			char *gitdir = xstrfmt("%s/modules/%s",
 				    get_git_common_dir(), sub->name);
-			connect_work_tree_and_git_dir(path, gitdir);
+			connect_work_tree_and_git_dir(path, gitdir, 1);
 			free(gitdir);
 		}
 	}
@@ -1947,7 +1947,7 @@ void absorb_git_dir_into_superproject(const char *prefix,
 		if (!sub)
 			die(_("could not lookup name for submodule '%s'"), path);
 		connect_work_tree_and_git_dir(path,
-			git_path("modules/%s", sub->name));
+			git_path("modules/%s", sub->name), 0);
 	} else {
 		/* Is it already absorbed into the superprojects git dir? */
 		char *real_sub_git_dir = real_pathdup(sub_git_dir, 1);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index d4e6485a26..ff70244620 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -497,7 +497,7 @@ test_expect_success 'moving a submodule in nested directories' '
 	test_cmp expect actual
 '
 
-test_expect_failure 'moving nested submodules' '
+test_expect_success 'moving nested submodules' '
 	git commit -am "cleanup commit" &&
 	mkdir sub_nested_nested &&
 	(cd sub_nested_nested &&
-- 
2.17.0.rc1.321.gba9d0f2565-goog


^ permalink raw reply related	[relevance 9%]

* [PATCHv2 0/6] Moving submodules with nested submodules
  @ 2018-03-28 17:24  4% ` Stefan Beller
  2018-03-28 17:24  9%   ` [PATCH 5/6] submodule: fixup nested submodules after moving the submodule Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2018-03-28 17:24 UTC (permalink / raw)
  To: sbeller, gitster; +Cc: bmwill, git, hvoigt, jonathantanmy, seanwbehan

v2:
* addressed memleaks and messy code in patch 5
* removed the extern keyword where applicable
* extended the commit message, stating we want to rename submodule_free
  in the future.
* picked up Jonathans patch and added it as a nice finish of the series.
  I did not see the need or aesthetic desire to put that patch earlier
  in the series.
  
Thanks,
Stefan

v1:

This fixes the bug reported in [1] ("Bug: moving submodules that have submodules
inside them causes a fatal error in git status")

[1] https://public-inbox.org/git/20180306192017.GA5797@riseup.net/

Thanks,
Stefan

Jonathan Tan (1):
  grep: remove "repo" arg from non-supporting funcs

Stefan Beller (5):
  submodule.h: drop declaration of connect_work_tree_and_git_dir
  submodule-config: allow submodule_free to handle arbitrary
    repositories
  submodule-config: add repository argument to submodule_from_{name,
    path}
  submodule-config: remove submodule_from_cache
  submodule: fixup nested submodules after moving the submodule

 .../technical/api-submodule-config.txt        |  2 +-
 builtin/grep.c                                | 14 ++---
 builtin/mv.c                                  |  6 +-
 builtin/submodule--helper.c                   | 17 +++--
 dir.c                                         | 63 ++++++++++++++++++-
 dir.h                                         | 12 +++-
 repository.c                                  |  2 +-
 submodule-config.c                            | 29 ++++-----
 submodule-config.h                            | 15 +++--
 submodule.c                                   | 40 ++++++------
 submodule.h                                   |  1 -
 t/helper/test-submodule-config.c              |  8 ++-
 t/t7001-mv.sh                                 |  2 +-
 unpack-trees.c                                |  2 +-
 14 files changed, 137 insertions(+), 76 deletions(-)

-- 
2.17.0.rc1.321.gba9d0f2565-goog


^ permalink raw reply	[relevance 4%]

* Re: [PATCH 5/5] submodule: fixup nested submodules after moving the submodule
  2018-03-27 21:39  9% ` [PATCH 5/5] submodule: fixup nested submodules after moving the submodule Stefan Beller
@ 2018-03-27 23:25  0%   ` Brandon Williams
  0 siblings, 0 replies; 200+ results
From: Brandon Williams @ 2018-03-27 23:25 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git, seanwbehan, hvoigt

On 03/27, Stefan Beller wrote:
> connect_work_tree_and_git_dir is used to connect a submodule worktree with
> its git directory and vice versa after events that require a reconnection
> such as moving around the working tree. As submodules can have nested
> submoduled themselves, we'd also want to fix the nested submodules when
> asked to. Add an option to recurse into the nested submodules and connect
> them as well.
> 
> As submodules are identified by their name (which determines their git
> directory in relation to their superprojects git directory) internally
> and by their path in the working tree of the superproject, we need to
> make sure that the mapping of name <-> path is kept intact. We can do
> that in the git-mv command by writing out the gitmodules file and first
> and then force a reload of the submodule config machinery.
> 
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  builtin/mv.c                |  6 ++--
>  builtin/submodule--helper.c |  3 +-
>  dir.c                       | 70 +++++++++++++++++++++++++++++++++++--
>  dir.h                       | 12 ++++++-
>  submodule.c                 |  6 ++--
>  t/t7001-mv.sh               |  2 +-
>  6 files changed, 87 insertions(+), 12 deletions(-)
> 
> diff --git a/builtin/mv.c b/builtin/mv.c
> index 6d141f7a53..7a63667d64 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -276,10 +276,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>  			die_errno(_("renaming '%s' failed"), src);
>  		}
>  		if (submodule_gitfile[i]) {
> -			if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
> -				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
>  			if (!update_path_in_gitmodules(src, dst))
>  				gitmodules_modified = 1;
> +			if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
> +				connect_work_tree_and_git_dir(dst,
> +							      submodule_gitfile[i],
> +							      1);
>  		}
>  
>  		if (mode == WORKING_DIRECTORY)
> diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
> index a921fbbf56..05fd657f99 100644
> --- a/builtin/submodule--helper.c
> +++ b/builtin/submodule--helper.c
> @@ -1259,8 +1259,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
>  		strbuf_reset(&sb);
>  	}
>  
> -	/* Connect module worktree and git dir */
> -	connect_work_tree_and_git_dir(path, sm_gitdir);
> +	connect_work_tree_and_git_dir(path, sm_gitdir, 0);
>  
>  	p = git_pathdup_submodule(path, "config");
>  	if (!p)
> diff --git a/dir.c b/dir.c
> index dedbf5d476..313176e291 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -19,6 +19,7 @@
>  #include "varint.h"
>  #include "ewah/ewok.h"
>  #include "fsmonitor.h"
> +#include "submodule-config.h"
>  
>  /*
>   * Tells read_directory_recursive how a file or directory should be treated.
> @@ -3010,8 +3011,67 @@ void untracked_cache_add_to_index(struct index_state *istate,
>  	untracked_cache_invalidate_path(istate, path, 1);
>  }
>  
> -/* Update gitfile and core.worktree setting to connect work tree and git dir */
> -void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
> +static void connect_wt_gitdir_in_nested(const char *sub_worktree,
> +					const char *sub_gitdir,
> +					struct repository *superproject)
> +{
> +	int i;
> +	struct repository subrepo;

You never clear this struct which means it leaks the memory it points
to.

> +	struct strbuf sub_wt = STRBUF_INIT;
> +	struct strbuf sub_gd = STRBUF_INIT;
> +	const struct submodule *sub;
> +	const char *super_worktree,
> +		   *sub_path; /* path inside the superproject */
> +
> +	/* subrepo got moved, so superproject has outdated information */
> +	submodule_free(superproject);
> +
> +	super_worktree = real_pathdup(superproject->worktree, 1);
> +
> +	sub_path = sub_worktree + strlen(super_worktree) + 1;
> +
> +	if (repo_submodule_init(&subrepo, superproject, sub_path))
> +		return;
> +
> +	repo_read_index(&subrepo);

You may want to check the return value to see if reading the index was
successful.

> +
> +	for (i = 0; i < subrepo.index->cache_nr; i++) {
> +		const struct cache_entry *ce = subrepo.index->cache[i];
> +
> +		if (!S_ISGITLINK(ce->ce_mode))
> +			continue;
> +
> +		while (i + 1 < subrepo.index->cache_nr &&
> +		       !strcmp(ce->name, subrepo.index->cache[i + 1]->name))
> +			/*
> +			 * Skip entries with the same name in different stages
> +			 * to make sure an entry is returned only once.
> +			 */
> +			i++;
> +
> +		sub = submodule_from_path(&subrepo, &null_oid, ce->name);
> +		if (!sub)
> +			/* submodule not checked out? */
> +			continue;
> +
> +		strbuf_reset(&sub_wt);
> +		strbuf_addf(&sub_wt, "%s/%s/.git", sub_worktree, sub->path);
> +
> +		strbuf_reset(&sub_gd);
> +		strbuf_addf(&sub_gd, "%s/modules/%s", sub_gitdir, sub->name);
> +
> +		strbuf_setlen(&sub_wt, sub_wt.len - strlen("/.git"));
> +
> +		if (is_submodule_active(&subrepo, ce->name)) {
> +			connect_work_tree_and_git_dir(sub_wt.buf, sub_gd.buf, 0);
> +			connect_wt_gitdir_in_nested(sub_wt.buf, sub_gd.buf, &subrepo);
> +		}
> +	}
> +}
> +
> +void connect_work_tree_and_git_dir(const char *work_tree_,
> +				   const char *git_dir_,
> +				   int recurse_into_nested)
>  {
>  	struct strbuf gitfile_sb = STRBUF_INIT;
>  	struct strbuf cfg_sb = STRBUF_INIT;
> @@ -3041,6 +3101,10 @@ void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
>  	strbuf_release(&gitfile_sb);
>  	strbuf_release(&cfg_sb);
>  	strbuf_release(&rel_path);
> +
> +	if (recurse_into_nested)
> +		connect_wt_gitdir_in_nested(work_tree, git_dir, the_repository);
> +
>  	free(work_tree);
>  	free(git_dir);
>  }
> @@ -3054,5 +3118,5 @@ void relocate_gitdir(const char *path, const char *old_git_dir, const char *new_
>  		die_errno(_("could not migrate git directory from '%s' to '%s'"),
>  			old_git_dir, new_git_dir);
>  
> -	connect_work_tree_and_git_dir(path, new_git_dir);
> +	connect_work_tree_and_git_dir(path, new_git_dir, 0);
>  }
> diff --git a/dir.h b/dir.h
> index b0758b82a2..3870193e52 100644
> --- a/dir.h
> +++ b/dir.h
> @@ -359,7 +359,17 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
>  void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);
>  void add_untracked_cache(struct index_state *istate);
>  void remove_untracked_cache(struct index_state *istate);
> -extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
> +
> +/*
> + * Connect a worktree to a git directory by creating (or overwriting) a
> + * '.git' file containing the location of the git directory. In the git
> + * directory set the core.worktree setting to indicate where the worktree is.
> + * When `recurse_into_nested` is set, recurse into any nested submodules,
> + * connecting them as well.
> + */
> +extern void connect_work_tree_and_git_dir(const char *work_tree,
> +					  const char *git_dir,
> +					  int recurse_into_nested);
>  extern void relocate_gitdir(const char *path,
>  			    const char *old_git_dir,
>  			    const char *new_git_dir);
> diff --git a/submodule.c b/submodule.c
> index 89d0aee086..c2dac6c00f 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -1624,7 +1624,7 @@ int submodule_move_head(const char *path,
>  		} else {
>  			char *gitdir = xstrfmt("%s/modules/%s",
>  				    get_git_common_dir(), sub->name);
> -			connect_work_tree_and_git_dir(path, gitdir);
> +			connect_work_tree_and_git_dir(path, gitdir, 0);
>  			free(gitdir);
>  
>  			/* make sure the index is clean as well */
> @@ -1634,7 +1634,7 @@ int submodule_move_head(const char *path,
>  		if (old_head && (flags & SUBMODULE_MOVE_HEAD_FORCE)) {
>  			char *gitdir = xstrfmt("%s/modules/%s",
>  				    get_git_common_dir(), sub->name);
> -			connect_work_tree_and_git_dir(path, gitdir);
> +			connect_work_tree_and_git_dir(path, gitdir, 1);
>  			free(gitdir);
>  		}
>  	}
> @@ -1947,7 +1947,7 @@ void absorb_git_dir_into_superproject(const char *prefix,
>  		if (!sub)
>  			die(_("could not lookup name for submodule '%s'"), path);
>  		connect_work_tree_and_git_dir(path,
> -			git_path("modules/%s", sub->name));
> +			git_path("modules/%s", sub->name), 0);
>  	} else {
>  		/* Is it already absorbed into the superprojects git dir? */
>  		char *real_sub_git_dir = real_pathdup(sub_git_dir, 1);
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index d4e6485a26..ff70244620 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -497,7 +497,7 @@ test_expect_success 'moving a submodule in nested directories' '
>  	test_cmp expect actual
>  '
>  
> -test_expect_failure 'moving nested submodules' '
> +test_expect_success 'moving nested submodules' '
>  	git commit -am "cleanup commit" &&
>  	mkdir sub_nested_nested &&
>  	(cd sub_nested_nested &&
> -- 
> 2.17.0.rc1.321.gba9d0f2565-goog
> 

-- 
Brandon Williams

^ permalink raw reply	[relevance 0%]

* [PATCH 5/5] submodule: fixup nested submodules after moving the submodule
  2018-03-27 21:39  5% [PATCH 0/5] Moving submodules with nested submodules Stefan Beller
@ 2018-03-27 21:39  9% ` Stefan Beller
  2018-03-27 23:25  0%   ` Brandon Williams
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2018-03-27 21:39 UTC (permalink / raw)
  To: git; +Cc: seanwbehan, bmwill, hvoigt, Stefan Beller

connect_work_tree_and_git_dir is used to connect a submodule worktree with
its git directory and vice versa after events that require a reconnection
such as moving around the working tree. As submodules can have nested
submoduled themselves, we'd also want to fix the nested submodules when
asked to. Add an option to recurse into the nested submodules and connect
them as well.

As submodules are identified by their name (which determines their git
directory in relation to their superprojects git directory) internally
and by their path in the working tree of the superproject, we need to
make sure that the mapping of name <-> path is kept intact. We can do
that in the git-mv command by writing out the gitmodules file and first
and then force a reload of the submodule config machinery.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 builtin/mv.c                |  6 ++--
 builtin/submodule--helper.c |  3 +-
 dir.c                       | 70 +++++++++++++++++++++++++++++++++++--
 dir.h                       | 12 ++++++-
 submodule.c                 |  6 ++--
 t/t7001-mv.sh               |  2 +-
 6 files changed, 87 insertions(+), 12 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 6d141f7a53..7a63667d64 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -276,10 +276,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			die_errno(_("renaming '%s' failed"), src);
 		}
 		if (submodule_gitfile[i]) {
-			if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
-				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
 			if (!update_path_in_gitmodules(src, dst))
 				gitmodules_modified = 1;
+			if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
+				connect_work_tree_and_git_dir(dst,
+							      submodule_gitfile[i],
+							      1);
 		}
 
 		if (mode == WORKING_DIRECTORY)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index a921fbbf56..05fd657f99 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1259,8 +1259,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
 		strbuf_reset(&sb);
 	}
 
-	/* Connect module worktree and git dir */
-	connect_work_tree_and_git_dir(path, sm_gitdir);
+	connect_work_tree_and_git_dir(path, sm_gitdir, 0);
 
 	p = git_pathdup_submodule(path, "config");
 	if (!p)
diff --git a/dir.c b/dir.c
index dedbf5d476..313176e291 100644
--- a/dir.c
+++ b/dir.c
@@ -19,6 +19,7 @@
 #include "varint.h"
 #include "ewah/ewok.h"
 #include "fsmonitor.h"
+#include "submodule-config.h"
 
 /*
  * Tells read_directory_recursive how a file or directory should be treated.
@@ -3010,8 +3011,67 @@ void untracked_cache_add_to_index(struct index_state *istate,
 	untracked_cache_invalidate_path(istate, path, 1);
 }
 
-/* Update gitfile and core.worktree setting to connect work tree and git dir */
-void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
+static void connect_wt_gitdir_in_nested(const char *sub_worktree,
+					const char *sub_gitdir,
+					struct repository *superproject)
+{
+	int i;
+	struct repository subrepo;
+	struct strbuf sub_wt = STRBUF_INIT;
+	struct strbuf sub_gd = STRBUF_INIT;
+	const struct submodule *sub;
+	const char *super_worktree,
+		   *sub_path; /* path inside the superproject */
+
+	/* subrepo got moved, so superproject has outdated information */
+	submodule_free(superproject);
+
+	super_worktree = real_pathdup(superproject->worktree, 1);
+
+	sub_path = sub_worktree + strlen(super_worktree) + 1;
+
+	if (repo_submodule_init(&subrepo, superproject, sub_path))
+		return;
+
+	repo_read_index(&subrepo);
+
+	for (i = 0; i < subrepo.index->cache_nr; i++) {
+		const struct cache_entry *ce = subrepo.index->cache[i];
+
+		if (!S_ISGITLINK(ce->ce_mode))
+			continue;
+
+		while (i + 1 < subrepo.index->cache_nr &&
+		       !strcmp(ce->name, subrepo.index->cache[i + 1]->name))
+			/*
+			 * Skip entries with the same name in different stages
+			 * to make sure an entry is returned only once.
+			 */
+			i++;
+
+		sub = submodule_from_path(&subrepo, &null_oid, ce->name);
+		if (!sub)
+			/* submodule not checked out? */
+			continue;
+
+		strbuf_reset(&sub_wt);
+		strbuf_addf(&sub_wt, "%s/%s/.git", sub_worktree, sub->path);
+
+		strbuf_reset(&sub_gd);
+		strbuf_addf(&sub_gd, "%s/modules/%s", sub_gitdir, sub->name);
+
+		strbuf_setlen(&sub_wt, sub_wt.len - strlen("/.git"));
+
+		if (is_submodule_active(&subrepo, ce->name)) {
+			connect_work_tree_and_git_dir(sub_wt.buf, sub_gd.buf, 0);
+			connect_wt_gitdir_in_nested(sub_wt.buf, sub_gd.buf, &subrepo);
+		}
+	}
+}
+
+void connect_work_tree_and_git_dir(const char *work_tree_,
+				   const char *git_dir_,
+				   int recurse_into_nested)
 {
 	struct strbuf gitfile_sb = STRBUF_INIT;
 	struct strbuf cfg_sb = STRBUF_INIT;
@@ -3041,6 +3101,10 @@ void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
 	strbuf_release(&gitfile_sb);
 	strbuf_release(&cfg_sb);
 	strbuf_release(&rel_path);
+
+	if (recurse_into_nested)
+		connect_wt_gitdir_in_nested(work_tree, git_dir, the_repository);
+
 	free(work_tree);
 	free(git_dir);
 }
@@ -3054,5 +3118,5 @@ void relocate_gitdir(const char *path, const char *old_git_dir, const char *new_
 		die_errno(_("could not migrate git directory from '%s' to '%s'"),
 			old_git_dir, new_git_dir);
 
-	connect_work_tree_and_git_dir(path, new_git_dir);
+	connect_work_tree_and_git_dir(path, new_git_dir, 0);
 }
diff --git a/dir.h b/dir.h
index b0758b82a2..3870193e52 100644
--- a/dir.h
+++ b/dir.h
@@ -359,7 +359,17 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
 void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);
 void add_untracked_cache(struct index_state *istate);
 void remove_untracked_cache(struct index_state *istate);
-extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
+
+/*
+ * Connect a worktree to a git directory by creating (or overwriting) a
+ * '.git' file containing the location of the git directory. In the git
+ * directory set the core.worktree setting to indicate where the worktree is.
+ * When `recurse_into_nested` is set, recurse into any nested submodules,
+ * connecting them as well.
+ */
+extern void connect_work_tree_and_git_dir(const char *work_tree,
+					  const char *git_dir,
+					  int recurse_into_nested);
 extern void relocate_gitdir(const char *path,
 			    const char *old_git_dir,
 			    const char *new_git_dir);
diff --git a/submodule.c b/submodule.c
index 89d0aee086..c2dac6c00f 100644
--- a/submodule.c
+++ b/submodule.c
@@ -1624,7 +1624,7 @@ int submodule_move_head(const char *path,
 		} else {
 			char *gitdir = xstrfmt("%s/modules/%s",
 				    get_git_common_dir(), sub->name);
-			connect_work_tree_and_git_dir(path, gitdir);
+			connect_work_tree_and_git_dir(path, gitdir, 0);
 			free(gitdir);
 
 			/* make sure the index is clean as well */
@@ -1634,7 +1634,7 @@ int submodule_move_head(const char *path,
 		if (old_head && (flags & SUBMODULE_MOVE_HEAD_FORCE)) {
 			char *gitdir = xstrfmt("%s/modules/%s",
 				    get_git_common_dir(), sub->name);
-			connect_work_tree_and_git_dir(path, gitdir);
+			connect_work_tree_and_git_dir(path, gitdir, 1);
 			free(gitdir);
 		}
 	}
@@ -1947,7 +1947,7 @@ void absorb_git_dir_into_superproject(const char *prefix,
 		if (!sub)
 			die(_("could not lookup name for submodule '%s'"), path);
 		connect_work_tree_and_git_dir(path,
-			git_path("modules/%s", sub->name));
+			git_path("modules/%s", sub->name), 0);
 	} else {
 		/* Is it already absorbed into the superprojects git dir? */
 		char *real_sub_git_dir = real_pathdup(sub_git_dir, 1);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index d4e6485a26..ff70244620 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -497,7 +497,7 @@ test_expect_success 'moving a submodule in nested directories' '
 	test_cmp expect actual
 '
 
-test_expect_failure 'moving nested submodules' '
+test_expect_success 'moving nested submodules' '
 	git commit -am "cleanup commit" &&
 	mkdir sub_nested_nested &&
 	(cd sub_nested_nested &&
-- 
2.17.0.rc1.321.gba9d0f2565-goog


^ permalink raw reply related	[relevance 9%]

* [PATCH 0/5] Moving submodules with nested submodules
@ 2018-03-27 21:39  5% Stefan Beller
  2018-03-27 21:39  9% ` [PATCH 5/5] submodule: fixup nested submodules after moving the submodule Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2018-03-27 21:39 UTC (permalink / raw)
  To: git; +Cc: seanwbehan, bmwill, hvoigt, Stefan Beller

This fixes the bug reported in [1] ("Bug: moving submodules that have submodules
inside them causes a fatal error in git status")

[1] https://public-inbox.org/git/20180306192017.GA5797@riseup.net/

Thanks,
Stefan

Stefan Beller (5):
  submodule.h: drop declaration of connect_work_tree_and_git_dir
  submodule-config: allow submodule_free to handle arbitrary
    repositories
  submodule-config: add repository argument to submodule_from_{name,
    path}
  submodule-config: remove submodule_from_cache
  submodule: fixup nested submodules after moving the submodule

 .../technical/api-submodule-config.txt        |  2 +-
 builtin/grep.c                                |  2 +-
 builtin/mv.c                                  |  6 +-
 builtin/submodule--helper.c                   | 17 +++--
 dir.c                                         | 70 ++++++++++++++++++-
 dir.h                                         | 12 +++-
 repository.c                                  |  2 +-
 submodule-config.c                            | 29 +++-----
 submodule-config.h                            |  9 +--
 submodule.c                                   | 40 ++++++-----
 submodule.h                                   |  1 -
 t/helper/test-submodule-config.c              |  8 ++-
 t/t7001-mv.sh                                 |  2 +-
 unpack-trees.c                                |  2 +-
 14 files changed, 135 insertions(+), 67 deletions(-)

-- 
2.17.0.rc1.321.gba9d0f2565-goog


^ permalink raw reply	[relevance 5%]

* [GSoC][PATCH v5] test: avoid pipes in git related commands for test
  @ 2018-03-27 17:31  3% ` Pratik Karki
  0 siblings, 0 replies; 200+ results
From: Pratik Karki @ 2018-03-27 17:31 UTC (permalink / raw)
  To: Git List; +Cc: Pratik Karki, Eric Sunshine

Thank you Eric, I made changes according to your review.


Cheers,
Pratik

-- >8 --

Avoid using pipes downstream of Git commands since the exit codes
of commands upstream of pipes get swallowed, thus potentially
hiding failure of those commands. Instead, capture Git command
output to a file and apply the downstream command(s) to that file.


Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
---
 t/t5300-pack-object.sh                     |  8 ++---
 t/t5510-fetch.sh                           |  8 ++---
 t/t7001-mv.sh                              | 22 ++++++-------
 t/t7003-filter-branch.sh                   |  9 ++++--
 t/t9104-git-svn-follow-parent.sh           | 16 +++++-----
 t/t9108-git-svn-glob.sh                    | 14 +++++----
 t/t9109-git-svn-multi-glob.sh              | 24 ++++++++------
 t/t9110-git-svn-use-svm-props.sh           | 40 ++++++++++++------------
 t/t9111-git-svn-use-svnsync-props.sh       | 36 ++++++++++-----------
 t/t9114-git-svn-dcommit-merge.sh           | 10 +++---
 t/t9130-git-svn-authors-file.sh            | 28 ++++++++++-------
 t/t9138-git-svn-authors-prog.sh            | 31 +++++++++---------
 t/t9153-git-svn-rewrite-uuid.sh            |  8 ++---
 t/t9168-git-svn-partially-globbed-names.sh | 34 +++++++++++---------
 t/t9350-fast-export.sh                     | 50 ++++++++++++++----------------
 15 files changed, 179 insertions(+), 159 deletions(-)

diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 9c68b9925..156beb2d5 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -311,8 +311,8 @@ test_expect_success 'unpacking with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$( git pack-objects test-5 <actual ) &&
 	PACK6=$( (
 			echo "$LIST"
 			echo "$LI"
@@ -358,8 +358,8 @@ test_expect_success 'index-pack with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$( git pack-objects test-5 <actual ) &&
 	PACK6=$( (
 			echo "$LIST"
 			echo "$LI"
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index da9ac0055..ae5a530a2 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -840,8 +840,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch aligned output' '
 	test_commit looooooooooooong-tag &&
 	(
 		cd full-output &&
-		git -c fetch.output=full fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=full fetch origin >actual 2>&1 &&
+		grep -e "->" actual | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master               -> origin/master
@@ -855,8 +855,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch compact output' '
 	test_commit extraaa &&
 	(
 		cd compact &&
-		git -c fetch.output=compact fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=compact fetch origin >actual 2>&1 &&
+		grep -e "->" actual | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master     -> origin/*
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index d4e6485a2..e96cbdb10 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -21,8 +21,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path0/COPYING..*path1/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path0/COPYING..*path1/COPYING" actual'
 
 test_expect_success \
     'moving the file back into subdirectory' \
@@ -35,8 +35,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path1/COPYING..*path0/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path1/COPYING..*path0/COPYING" actual'
 
 test_expect_success \
     'mv --dry-run does not move file' \
@@ -122,10 +122,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/COPYING..*path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/README..*path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path0/COPYING..*path2/COPYING" actual &&
+     grep "^R100..*path0/README..*path2/README" actual'
 
 test_expect_success \
     'succeed when source is a prefix of destination' \
@@ -141,10 +140,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/COPYING..*path1/path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/README..*path1/path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path2/COPYING..*path1/path2/COPYING" actual &&
+     grep "^R100..*path2/README..*path1/path2/README" actual'
 
 test_expect_success \
     'do not move directory over existing directory' \
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 7cb60799b..6a28b6cce 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -187,7 +187,8 @@ test_expect_success 'author information is preserved' '
 			test \$GIT_COMMIT != $(git rev-parse master) || \
 			echo Hallo" \
 		preserved-author) &&
-	test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
+	git rev-list --author="B V Uips" preserved-author >actual &&
+	test_line_count = 1 actual
 '
 
 test_expect_success "remove a certain author's commits" '
@@ -205,7 +206,8 @@ test_expect_success "remove a certain author's commits" '
 	cnt1=$(git rev-list master | wc -l) &&
 	cnt2=$(git rev-list removed-author | wc -l) &&
 	test $cnt1 -eq $(($cnt2 + 1)) &&
-	test 0 = $(git rev-list --author="B V Uips" removed-author | wc -l)
+	git rev-list --author="B V Uips" removed-author >actual &&
+	test_line_count = 0 actual
 '
 
 test_expect_success 'barf on invalid name' '
@@ -258,7 +260,8 @@ test_expect_success 'Subdirectory filter with disappearing trees' '
 	git commit -m "Re-adding foo" &&
 
 	git filter-branch -f --subdirectory-filter foo &&
-	test $(git rev-list master | wc -l) = 3
+	git rev-list master >actual &&
+	test_line_count = 3 actual
 '
 
 test_expect_success 'Tag name filtering retains tag message' '
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index cd480edf1..a735fa371 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -33,8 +33,8 @@ test_expect_success 'init and fetch a moved directory' '
 	git svn fetch -i thunk &&
 	test "$(git rev-parse --verify refs/remotes/thunk@2)" \
 	   = "$(git rev-parse --verify refs/remotes/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/thunk:readme |\
-		 sed -n -e "3p")" = goodbye &&
+	git cat-file blob refs/remotes/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye &&
 	test -z "$(git config --get svn-remote.svn.fetch \
 		 "^trunk:refs/remotes/thunk@2$")"
 	'
@@ -48,8 +48,8 @@ test_expect_success 'init and fetch from one svn-remote' '
         git svn fetch -i svn/thunk &&
 	test "$(git rev-parse --verify refs/remotes/svn/trunk)" \
 	   = "$(git rev-parse --verify refs/remotes/svn/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/svn/thunk:readme |\
-		 sed -n -e "3p")" = goodbye
+	git cat-file blob refs/remotes/svn/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye
         '
 
 test_expect_success 'follow deleted parent' '
@@ -107,7 +107,8 @@ test_expect_success 'follow deleted directory' '
 	git svn init --minimize-url -i glob "$svnrepo"/glob &&
 	git svn fetch -i glob &&
 	test "$(git cat-file blob refs/remotes/glob:blob/bye)" = hi &&
-	test "$(git ls-tree refs/remotes/glob | wc -l )" -eq 1
+	git ls-tree refs/remotes/glob >actual &&
+	test_line_count = 1 actual
 	'
 
 # ref: r9270 of the Subversion repository: (http://svn.collab.net/repos/svn)
@@ -204,8 +205,9 @@ test_expect_success "follow-parent is atomic" '
 test_expect_success "track multi-parent paths" '
 	svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
 	git svn multi-fetch &&
-	test $(git cat-file commit refs/remotes/glob | \
-	       grep "^parent " | wc -l) -eq 2
+	git cat-file commit refs/remotes/glob >actual &&
+	grep "^parent " actual >actual2 &&
+	test_line_count = 2 actual2
 	'
 
 test_expect_success "multi-fetch continues to work" "
diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh
index a94286c8e..6990f6436 100755
--- a/t/t9108-git-svn-glob.sh
+++ b/t/t9108-git-svn-glob.sh
@@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
 	git config --add svn-remote.svn.tags\
 	                 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/start)" &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 
diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh
index 8d99e848d..c1e7542a3 100755
--- a/t/t9109-git-svn-multi-glob.sh
+++ b/t/t9109-git-svn-multi-glob.sh
@@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
 	git config --add svn-remote.svn.tags\
 	                 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/v1/start)" &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/v1/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/v1/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/v1/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/v1/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 cat > expect.four <<EOF
@@ -124,14 +126,16 @@ test_expect_success 'test another branch' '
 	git config --add svn-remote.four.tags \
 	                 "tags/*:refs/remotes/four/tags/*" &&
 	git svn fetch four &&
-	test $(git rev-list refs/remotes/four/tags/next | wc -l) -eq 5 &&
-	test $(git rev-list refs/remotes/four/branches/v2/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/four/tags/next >actual &&
+	test_line_count = 5 actual &&
+	git rev-list refs/remotes/four/branches/v2/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/four/branches/v2/start~2) = \
 	     $(git rev-parse refs/remotes/four/trunk) &&
 	test $(git rev-parse refs/remotes/four/tags/next~2) = \
 	     $(git rev-parse refs/remotes/four/branches/v2/start) &&
-	git log --pretty=oneline refs/remotes/four/tags/next | \
-	    sed -e "s/^.\{41\}//" > output.four &&
+	git log --pretty=oneline refs/remotes/four/tags/next >actual &&
+	sed -e "s/^.\{41\}//" actual >output.four &&
 	test_cmp expect.four output.four
 	'
 
diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
index dde0a3c22..ad37d980c 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/t/t9110-git-svn-use-svm-props.sh
@@ -21,37 +21,37 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~2 >actual &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~3 >actual &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~4 >actual &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~5 >actual &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual
 	"
 
 test_expect_success 'find commit based on SVN revision number' "
-        git svn find-rev r12 |
-	    grep $(git rev-parse HEAD)
+	git svn find-rev r12 >actual &&
+	grep $(git rev-parse HEAD) actual
         "
 
 test_expect_success 'empty rebase' "
diff --git a/t/t9111-git-svn-use-svnsync-props.sh b/t/t9111-git-svn-use-svnsync-props.sh
index 22b6e5ee7..6c9307355 100755
--- a/t/t9111-git-svn-use-svnsync-props.sh
+++ b/t/t9111-git-svn-use-svnsync-props.sh
@@ -20,32 +20,32 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~2 >actual &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~3 >actual &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~4 >actual &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~5 >actual &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual
 	"
 
 test_done
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index 50bca62de..32317d6bc 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -68,7 +68,8 @@ test_debug 'gitk --all & sleep 1'
 test_expect_success 'verify pre-merge ancestry' "
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'git svn dcommit merges' "
@@ -82,12 +83,13 @@ test_expect_success 'verify post-merge ancestry' "
 	     x\$(git rev-parse --verify refs/remotes/origin/trunk) &&
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'verify merge commit message' "
-	git rev-list --pretty=raw -1 refs/heads/svn | \
-	  grep \"    Merge branch 'merge' into svn\"
+	git rev-list --pretty=raw -1 refs/heads/svn >actual &&
+	grep \"    Merge branch 'merge' into svn\" actual
 	"
 
 test_done
diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
index 41264818c..7752a1fae 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/t/t9130-git-svn-authors-file.sh
@@ -26,11 +26,12 @@ test_expect_success 'start import with incomplete authors file' '
 test_expect_success 'imported 2 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 2 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author BBBBBBB BBBBBBB <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author AAAAAAA AAAAAAA <aa@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 2 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author BBBBBBB BBBBBBB <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author AAAAAAA AAAAAAA <aa@example\.com> " actual
 	)
 	'
 
@@ -43,11 +44,12 @@ test_expect_success 'continues to import once authors have been added' '
 	(
 		cd x
 		git svn fetch --authors-file=../svn-authors &&
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 4 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author DDDDDDD DDDDDDD <dd@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author CCCCCCC CCCCCCC <cc@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 4 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author DDDDDDD DDDDDDD <dd@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author CCCCCCC CCCCCCC <cc@example\.com> " actual
 	)
 	'
 
@@ -102,8 +104,10 @@ test_expect_success !MINGW 'fresh clone with svn.authors-file in config' '
 		test x"$HOME"/svn-authors = x"$(git config svn.authorsfile)" &&
 		git svn clone "$svnrepo" gitconfig.clone &&
 		cd gitconfig.clone &&
-		nr_ex=$(git log | grep "^Author:.*example.com" | wc -l) &&
-		nr_rev=$(git rev-list HEAD | wc -l) &&
+		git log >actual &&
+		nr_ex=$(grep "^Author:.*example.com" actual | wc -l) &&
+		git rev-list HEAD >actual &&
+		nr_rev=$(wc -l <actual) &&
 		test $nr_rev -eq $nr_ex
 	)
 '
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46b..48109f949 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -37,31 +37,32 @@ test_expect_success 'import authors with prog and file' '
 test_expect_success 'imported 6 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 6
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 6 actual
 	)
 '
 
 test_expect_success 'authors-prog ran correctly' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author ee-foo <ee-foo@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 | \
-		  grep "^author dd <dd@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 | \
-		  grep "^author cc <cc@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 | \
-		  grep "^author bb <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 | \
-		  grep "^author aa <aa@example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author ee-foo <ee-foo@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 >actual &&
+		grep "^author dd <dd@sub\.example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 >actual &&
+		grep "^author cc <cc@sub\.example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 >actual &&
+		grep "^author bb <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 >actual &&
+		grep "^author aa <aa@example\.com> " actual
 	)
 '
 
 test_expect_success 'authors-file overrode authors-prog' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> " actual
 	)
 '
 
@@ -73,8 +74,8 @@ test_expect_success 'authors-prog handled special characters in username' '
 	(
 		cd x &&
 		git svn --authors-prog=../svn-authors-prog fetch &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn |
-		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " actual &&
 		! test -f evil
 	)
 '
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/t/t9153-git-svn-rewrite-uuid.sh
index 372ef1568..8cb2b5c69 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/t/t9153-git-svn-rewrite-uuid.sh
@@ -16,10 +16,10 @@ test_expect_success 'load svn repo' "
 	"
 
 test_expect_success 'verify uuid' "
-	git cat-file commit refs/remotes/git-svn~0 | \
-	   grep '^git-svn-id: .*@2 $uuid$' &&
-	git cat-file commit refs/remotes/git-svn~1 | \
-	   grep '^git-svn-id: .*@1 $uuid$'
+	git cat-file commit refs/remotes/git-svn~0 >actual &&
+	grep '^git-svn-id: .*@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/git-svn~1 >actual &&
+	grep '^git-svn-id: .*@1 $uuid$' actual
 	"
 
 test_done
diff --git a/t/t9168-git-svn-partially-globbed-names.sh b/t/t9168-git-svn-partially-globbed-names.sh
index 8b22f2272..bdf6e8499 100755
--- a/t/t9168-git-svn-partially-globbed-names.sh
+++ b/t/t9168-git-svn-partially-globbed-names.sh
@@ -48,8 +48,8 @@ test_expect_success 'test refspec prefixed globbing' '
 	git config --add svn-remote.svn.tags\
 			 "tags/t_*/src/a:refs/remotes/tags/t_*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.end &&
+	git log --pretty=oneline refs/remotes/tags/t_end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/t_end~1)" = \
 		"$(git rev-parse refs/remotes/branches/b_start)" &&
@@ -78,14 +78,16 @@ test_expect_success 'test left-hand-side only prefixed globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/t_end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/b_start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/t_end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/b_start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/b_start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/t_end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/b_start) &&
-	git log --pretty=oneline refs/remotes/two/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/t_end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 
@@ -118,14 +120,16 @@ test_expect_success 'test prefixed globs match just prefix' '
 		svn_cmd up
 	) &&
 	git svn fetch three &&
-	test $(git rev-list refs/remotes/three/branches/b_ | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/three/tags/t_ | wc -l) -eq 3 &&
+	git rev-list refs/remotes/three/branches/b_ >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/three/tags/t_ >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/three/branches/b_~1) = \
 	     $(git rev-parse refs/remotes/three/trunk) &&
 	test $(git rev-parse refs/remotes/three/tags/t_~1) = \
 	     $(git rev-parse refs/remotes/three/branches/b_) &&
-	git log --pretty=oneline refs/remotes/three/tags/t_ | \
-	    sed -e "s/^.\{41\}//" >output.three &&
+	git log --pretty=oneline refs/remotes/three/tags/t_ >actual &&
+	sed -e "s/^.\{41\}//" actual >output.three &&
 	test_cmp expect.three output.three
 	'
 
@@ -186,14 +190,16 @@ test_expect_success 'test globbing in the middle of the word' '
 		svn_cmd up
 	) &&
 	git svn fetch five &&
-	test $(git rev-list refs/remotes/five/branches/abcde | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/five/tags/fghij | wc -l) -eq 3 &&
+	git rev-list refs/remotes/five/branches/abcde >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/five/tags/fghij >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/five/branches/abcde~1) = \
 	     $(git rev-parse refs/remotes/five/trunk) &&
 	test $(git rev-parse refs/remotes/five/tags/fghij~1) = \
 	     $(git rev-parse refs/remotes/five/branches/abcde) &&
-	git log --pretty=oneline refs/remotes/five/tags/fghij | \
-	    sed -e "s/^.\{41\}//" >output.five &&
+	git log --pretty=oneline refs/remotes/five/tags/fghij >actual &&
+	sed -e "s/^.\{41\}//" actual >output.five &&
 	test_cmp expect.five output.five
 	'
 
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 866ddf605..d5679ffb8 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -43,20 +43,20 @@ test_expect_success 'fast-export | fast-import' '
 	MUSS=$(git rev-parse --verify muss) &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --all |
+	git fast-export --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test $MASTER = $(git rev-parse --verify refs/heads/master) &&
 	 test $REIN = $(git rev-parse --verify refs/tags/rein) &&
 	 test $WER = $(git rev-parse --verify refs/heads/wer) &&
-	 test $MUSS = $(git rev-parse --verify refs/tags/muss))
+	 test $MUSS = $(git rev-parse --verify refs/tags/muss)) <actual
 
 '
 
 test_expect_success 'fast-export master~2..master' '
 
-	git fast-export master~2..master |
-		sed "s/master/partial/" |
+	git fast-export master~2..master >actual &&
+	sed "s/master/partial/" actual |
 		(cd new &&
 		 git fast-import &&
 		 test $MASTER != $(git rev-parse --verify refs/heads/partial) &&
@@ -74,11 +74,12 @@ test_expect_success 'iso-8859-1' '
 	test_tick &&
 	echo rosten >file &&
 	git commit -s -m den file &&
-	git fast-export wer^..wer |
-		sed "s/wer/i18n/" |
+	git fast-export wer^..wer >iso8859-1.fi &&
+	sed "s/wer/i18n/" iso8859-1.fi |
 		(cd new &&
 		 git fast-import &&
-		 git cat-file commit i18n | grep "Áéí óú")
+		 git cat-file commit i18n >actual &&
+		 grep "Áéí óú" actual)
 
 '
 test_expect_success 'import/export-marks' '
@@ -87,20 +88,14 @@ test_expect_success 'import/export-marks' '
 	git fast-export --export-marks=tmp-marks HEAD &&
 	test -s tmp-marks &&
 	test_line_count = 3 tmp-marks &&
-	test $(
-		git fast-export --import-marks=tmp-marks\
-		--export-marks=tmp-marks HEAD |
-		grep ^commit |
-		wc -l) \
-	-eq 0 &&
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks HEAD >actual &&
+	test $(grep ^commit actual | wc -l) -eq 0 &&
 	echo change > file &&
 	git commit -m "last commit" file &&
-	test $(
-		git fast-export --import-marks=tmp-marks \
-		--export-marks=tmp-marks HEAD |
-		grep ^commit\  |
-		wc -l) \
-	-eq 1 &&
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks HEAD >actual &&
+	test $(grep ^commit\  actual | wc -l) -eq 1 &&
 	test_line_count = 4 tmp-marks
 
 '
@@ -184,7 +179,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	rm -rf new &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --signed-tags=strip --all |
+	git fast-export --signed-tags=strip --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test "$SUBENT1" = "$(git ls-tree refs/heads/master^ sub)" &&
@@ -192,7 +187,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	 git checkout master &&
 	 git submodule init &&
 	 git submodule update &&
-	 cmp sub/file ../sub/file)
+	 cmp sub/file ../sub/file) <actual
 
 '
 
@@ -367,12 +362,14 @@ test_expect_success 'path limiting with import-marks does not lose unmodified fi
 	echo more content >> file &&
 	test_tick &&
 	git commit -mnext file &&
-	git fast-export --import-marks=marks simple -- file file0 | grep file0
+	git fast-export --import-marks=marks simple -- file file0 >actual &&
+	grep file0 actual
 '
 
 test_expect_success 'full-tree re-shows unmodified files'        '
 	git checkout -f simple &&
-	test $(git fast-export --full-tree simple | grep -c file0) -eq 3
+	git fast-export --full-tree simple >actual &&
+	test $(grep -c file0 actual) -eq 3
 '
 
 test_expect_success 'set-up a few more tags for tag export tests' '
@@ -505,8 +502,8 @@ test_expect_success 'refs are updated even if no commits need to be exported' '
 '
 
 test_expect_success 'use refspec' '
-	git fast-export --refspec refs/heads/master:refs/heads/foobar master | \
-		grep "^commit " | sort | uniq > actual &&
+	git fast-export --refspec refs/heads/master:refs/heads/foobar master >actual2 &&
+	grep "^commit " actual2 | sort | uniq >actual &&
 	echo "commit refs/heads/foobar" > expected &&
 	test_cmp expected actual
 '
@@ -534,7 +531,8 @@ test_expect_success 'when using -C, do not declare copy when source of copy is a
 	git -C src commit -m 2nd_commit &&
 
 	test_create_repo dst &&
-	git -C src fast-export --all -C | git -C dst fast-import &&
+	git -C src fast-export --all -C >actual &&
+	git -C dst fast-import <actual &&
 	git -C src show >expected &&
 	git -C dst show >actual &&
 	test_cmp expected actual
-- 
2.16.2


^ permalink raw reply related	[relevance 3%]

* [GSoC][PATCH v4] test: avoid pipes in git related commands for test
  @ 2018-03-23 15:01  3% ` Pratik Karki
  0 siblings, 0 replies; 200+ results
From: Pratik Karki @ 2018-03-23 15:01 UTC (permalink / raw)
  To: Git List; +Cc: Pratik Karki, Eric Sunshine, Junio C Hamano

Thank you Eric and Junio for the review.

I hope this follow-on patch[1] is ready for merge.

[1]: https://public-inbox.org/git/20180321152356.10754-1-predatoramigo@gmail.com/

-- >8 --

Avoid using pipes downstream of Git commands since the exit codes
of commands upstream of pipes get swallowed, thus potentially
hiding failure of those commands. Instead, capture Git command
output to a file and apply the downstream command(s) to that file.

Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
---
 t/t5300-pack-object.sh                     |  8 ++---
 t/t5510-fetch.sh                           |  8 ++---
 t/t7001-mv.sh                              | 22 +++++++-------
 t/t7003-filter-branch.sh                   |  9 ++++--
 t/t9104-git-svn-follow-parent.sh           | 16 +++++-----
 t/t9108-git-svn-glob.sh                    | 14 +++++----
 t/t9109-git-svn-multi-glob.sh              | 24 ++++++++-------
 t/t9110-git-svn-use-svm-props.sh           | 40 ++++++++++++-------------
 t/t9111-git-svn-use-svnsync-props.sh       | 36 +++++++++++-----------
 t/t9114-git-svn-dcommit-merge.sh           | 10 ++++---
 t/t9130-git-svn-authors-file.sh            | 28 +++++++++--------
 t/t9138-git-svn-authors-prog.sh            | 31 +++++++++----------
 t/t9153-git-svn-rewrite-uuid.sh            |  8 ++---
 t/t9168-git-svn-partially-globbed-names.sh | 34 ++++++++++++---------
 t/t9350-fast-export.sh                     | 48 ++++++++++++++++--------------
 15 files changed, 180 insertions(+), 156 deletions(-)

diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 9c68b9925..156beb2d5 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -311,8 +311,8 @@ test_expect_success 'unpacking with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$( git pack-objects test-5 <actual ) &&
 	PACK6=$( (
 			echo "$LIST"
 			echo "$LI"
@@ -358,8 +358,8 @@ test_expect_success 'index-pack with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$( git pack-objects test-5 <actual ) &&
 	PACK6=$( (
 			echo "$LIST"
 			echo "$LI"
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index da9ac0055..f6d28ed7f 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -840,8 +840,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch aligned output' '
 	test_commit looooooooooooong-tag &&
 	(
 		cd full-output &&
-		git -c fetch.output=full fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=full fetch origin >actual2 2>&1 &&
+		grep -e "->" actual2 | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master               -> origin/master
@@ -855,8 +855,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch compact output' '
 	test_commit extraaa &&
 	(
 		cd compact &&
-		git -c fetch.output=compact fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=compact fetch origin >actual2 2>&1 &&
+		grep -e "->" actual2 | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master     -> origin/*
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index d4e6485a2..e96cbdb10 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -21,8 +21,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path0/COPYING..*path1/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path0/COPYING..*path1/COPYING" actual'
 
 test_expect_success \
     'moving the file back into subdirectory' \
@@ -35,8 +35,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path1/COPYING..*path0/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path1/COPYING..*path0/COPYING" actual'
 
 test_expect_success \
     'mv --dry-run does not move file' \
@@ -122,10 +122,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/COPYING..*path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/README..*path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path0/COPYING..*path2/COPYING" actual &&
+     grep "^R100..*path0/README..*path2/README" actual'
 
 test_expect_success \
     'succeed when source is a prefix of destination' \
@@ -141,10 +140,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/COPYING..*path1/path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/README..*path1/path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path2/COPYING..*path1/path2/COPYING" actual &&
+     grep "^R100..*path2/README..*path1/path2/README" actual'
 
 test_expect_success \
     'do not move directory over existing directory' \
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 7cb60799b..6a28b6cce 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -187,7 +187,8 @@ test_expect_success 'author information is preserved' '
 			test \$GIT_COMMIT != $(git rev-parse master) || \
 			echo Hallo" \
 		preserved-author) &&
-	test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
+	git rev-list --author="B V Uips" preserved-author >actual &&
+	test_line_count = 1 actual
 '
 
 test_expect_success "remove a certain author's commits" '
@@ -205,7 +206,8 @@ test_expect_success "remove a certain author's commits" '
 	cnt1=$(git rev-list master | wc -l) &&
 	cnt2=$(git rev-list removed-author | wc -l) &&
 	test $cnt1 -eq $(($cnt2 + 1)) &&
-	test 0 = $(git rev-list --author="B V Uips" removed-author | wc -l)
+	git rev-list --author="B V Uips" removed-author >actual &&
+	test_line_count = 0 actual
 '
 
 test_expect_success 'barf on invalid name' '
@@ -258,7 +260,8 @@ test_expect_success 'Subdirectory filter with disappearing trees' '
 	git commit -m "Re-adding foo" &&
 
 	git filter-branch -f --subdirectory-filter foo &&
-	test $(git rev-list master | wc -l) = 3
+	git rev-list master >actual &&
+	test_line_count = 3 actual
 '
 
 test_expect_success 'Tag name filtering retains tag message' '
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index cd480edf1..a735fa371 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -33,8 +33,8 @@ test_expect_success 'init and fetch a moved directory' '
 	git svn fetch -i thunk &&
 	test "$(git rev-parse --verify refs/remotes/thunk@2)" \
 	   = "$(git rev-parse --verify refs/remotes/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/thunk:readme |\
-		 sed -n -e "3p")" = goodbye &&
+	git cat-file blob refs/remotes/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye &&
 	test -z "$(git config --get svn-remote.svn.fetch \
 		 "^trunk:refs/remotes/thunk@2$")"
 	'
@@ -48,8 +48,8 @@ test_expect_success 'init and fetch from one svn-remote' '
         git svn fetch -i svn/thunk &&
 	test "$(git rev-parse --verify refs/remotes/svn/trunk)" \
 	   = "$(git rev-parse --verify refs/remotes/svn/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/svn/thunk:readme |\
-		 sed -n -e "3p")" = goodbye
+	git cat-file blob refs/remotes/svn/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye
         '
 
 test_expect_success 'follow deleted parent' '
@@ -107,7 +107,8 @@ test_expect_success 'follow deleted directory' '
 	git svn init --minimize-url -i glob "$svnrepo"/glob &&
 	git svn fetch -i glob &&
 	test "$(git cat-file blob refs/remotes/glob:blob/bye)" = hi &&
-	test "$(git ls-tree refs/remotes/glob | wc -l )" -eq 1
+	git ls-tree refs/remotes/glob >actual &&
+	test_line_count = 1 actual
 	'
 
 # ref: r9270 of the Subversion repository: (http://svn.collab.net/repos/svn)
@@ -204,8 +205,9 @@ test_expect_success "follow-parent is atomic" '
 test_expect_success "track multi-parent paths" '
 	svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
 	git svn multi-fetch &&
-	test $(git cat-file commit refs/remotes/glob | \
-	       grep "^parent " | wc -l) -eq 2
+	git cat-file commit refs/remotes/glob >actual &&
+	grep "^parent " actual >actual2 &&
+	test_line_count = 2 actual2
 	'
 
 test_expect_success "multi-fetch continues to work" "
diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh
index a94286c8e..6990f6436 100755
--- a/t/t9108-git-svn-glob.sh
+++ b/t/t9108-git-svn-glob.sh
@@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
 	git config --add svn-remote.svn.tags\
 	                 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/start)" &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 
diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh
index 8d99e848d..c1e7542a3 100755
--- a/t/t9109-git-svn-multi-glob.sh
+++ b/t/t9109-git-svn-multi-glob.sh
@@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
 	git config --add svn-remote.svn.tags\
 	                 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/v1/start)" &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/v1/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/v1/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/v1/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/v1/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 cat > expect.four <<EOF
@@ -124,14 +126,16 @@ test_expect_success 'test another branch' '
 	git config --add svn-remote.four.tags \
 	                 "tags/*:refs/remotes/four/tags/*" &&
 	git svn fetch four &&
-	test $(git rev-list refs/remotes/four/tags/next | wc -l) -eq 5 &&
-	test $(git rev-list refs/remotes/four/branches/v2/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/four/tags/next >actual &&
+	test_line_count = 5 actual &&
+	git rev-list refs/remotes/four/branches/v2/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/four/branches/v2/start~2) = \
 	     $(git rev-parse refs/remotes/four/trunk) &&
 	test $(git rev-parse refs/remotes/four/tags/next~2) = \
 	     $(git rev-parse refs/remotes/four/branches/v2/start) &&
-	git log --pretty=oneline refs/remotes/four/tags/next | \
-	    sed -e "s/^.\{41\}//" > output.four &&
+	git log --pretty=oneline refs/remotes/four/tags/next >actual &&
+	sed -e "s/^.\{41\}//" actual >output.four &&
 	test_cmp expect.four output.four
 	'
 
diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
index dde0a3c22..ad37d980c 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/t/t9110-git-svn-use-svm-props.sh
@@ -21,37 +21,37 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~2 >actual &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~3 >actual &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~4 >actual &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~5 >actual &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual
 	"
 
 test_expect_success 'find commit based on SVN revision number' "
-        git svn find-rev r12 |
-	    grep $(git rev-parse HEAD)
+	git svn find-rev r12 >actual &&
+	grep $(git rev-parse HEAD) actual
         "
 
 test_expect_success 'empty rebase' "
diff --git a/t/t9111-git-svn-use-svnsync-props.sh b/t/t9111-git-svn-use-svnsync-props.sh
index 22b6e5ee7..6c9307355 100755
--- a/t/t9111-git-svn-use-svnsync-props.sh
+++ b/t/t9111-git-svn-use-svnsync-props.sh
@@ -20,32 +20,32 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~2 >actual &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~3 >actual &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~4 >actual &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~5 >actual &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual
 	"
 
 test_done
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index 50bca62de..32317d6bc 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -68,7 +68,8 @@ test_debug 'gitk --all & sleep 1'
 test_expect_success 'verify pre-merge ancestry' "
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'git svn dcommit merges' "
@@ -82,12 +83,13 @@ test_expect_success 'verify post-merge ancestry' "
 	     x\$(git rev-parse --verify refs/remotes/origin/trunk) &&
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'verify merge commit message' "
-	git rev-list --pretty=raw -1 refs/heads/svn | \
-	  grep \"    Merge branch 'merge' into svn\"
+	git rev-list --pretty=raw -1 refs/heads/svn >actual &&
+	grep \"    Merge branch 'merge' into svn\" actual
 	"
 
 test_done
diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
index 41264818c..7752a1fae 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/t/t9130-git-svn-authors-file.sh
@@ -26,11 +26,12 @@ test_expect_success 'start import with incomplete authors file' '
 test_expect_success 'imported 2 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 2 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author BBBBBBB BBBBBBB <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author AAAAAAA AAAAAAA <aa@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 2 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author BBBBBBB BBBBBBB <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author AAAAAAA AAAAAAA <aa@example\.com> " actual
 	)
 	'
 
@@ -43,11 +44,12 @@ test_expect_success 'continues to import once authors have been added' '
 	(
 		cd x
 		git svn fetch --authors-file=../svn-authors &&
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 4 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author DDDDDDD DDDDDDD <dd@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author CCCCCCC CCCCCCC <cc@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 4 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author DDDDDDD DDDDDDD <dd@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author CCCCCCC CCCCCCC <cc@example\.com> " actual
 	)
 	'
 
@@ -102,8 +104,10 @@ test_expect_success !MINGW 'fresh clone with svn.authors-file in config' '
 		test x"$HOME"/svn-authors = x"$(git config svn.authorsfile)" &&
 		git svn clone "$svnrepo" gitconfig.clone &&
 		cd gitconfig.clone &&
-		nr_ex=$(git log | grep "^Author:.*example.com" | wc -l) &&
-		nr_rev=$(git rev-list HEAD | wc -l) &&
+		git log >actual &&
+		nr_ex=$(grep "^Author:.*example.com" actual | wc -l) &&
+		git rev-list HEAD >actual &&
+		nr_rev=$(wc -l <actual) &&
 		test $nr_rev -eq $nr_ex
 	)
 '
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46b..48109f949 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -37,31 +37,32 @@ test_expect_success 'import authors with prog and file' '
 test_expect_success 'imported 6 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 6
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 6 actual
 	)
 '
 
 test_expect_success 'authors-prog ran correctly' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author ee-foo <ee-foo@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 | \
-		  grep "^author dd <dd@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 | \
-		  grep "^author cc <cc@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 | \
-		  grep "^author bb <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 | \
-		  grep "^author aa <aa@example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author ee-foo <ee-foo@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 >actual &&
+		grep "^author dd <dd@sub\.example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 >actual &&
+		grep "^author cc <cc@sub\.example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 >actual &&
+		grep "^author bb <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 >actual &&
+		grep "^author aa <aa@example\.com> " actual
 	)
 '
 
 test_expect_success 'authors-file overrode authors-prog' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> " actual
 	)
 '
 
@@ -73,8 +74,8 @@ test_expect_success 'authors-prog handled special characters in username' '
 	(
 		cd x &&
 		git svn --authors-prog=../svn-authors-prog fetch &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn |
-		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " actual &&
 		! test -f evil
 	)
 '
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/t/t9153-git-svn-rewrite-uuid.sh
index 372ef1568..8cb2b5c69 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/t/t9153-git-svn-rewrite-uuid.sh
@@ -16,10 +16,10 @@ test_expect_success 'load svn repo' "
 	"
 
 test_expect_success 'verify uuid' "
-	git cat-file commit refs/remotes/git-svn~0 | \
-	   grep '^git-svn-id: .*@2 $uuid$' &&
-	git cat-file commit refs/remotes/git-svn~1 | \
-	   grep '^git-svn-id: .*@1 $uuid$'
+	git cat-file commit refs/remotes/git-svn~0 >actual &&
+	grep '^git-svn-id: .*@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/git-svn~1 >actual &&
+	grep '^git-svn-id: .*@1 $uuid$' actual
 	"
 
 test_done
diff --git a/t/t9168-git-svn-partially-globbed-names.sh b/t/t9168-git-svn-partially-globbed-names.sh
index 8b22f2272..bdf6e8499 100755
--- a/t/t9168-git-svn-partially-globbed-names.sh
+++ b/t/t9168-git-svn-partially-globbed-names.sh
@@ -48,8 +48,8 @@ test_expect_success 'test refspec prefixed globbing' '
 	git config --add svn-remote.svn.tags\
 			 "tags/t_*/src/a:refs/remotes/tags/t_*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.end &&
+	git log --pretty=oneline refs/remotes/tags/t_end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/t_end~1)" = \
 		"$(git rev-parse refs/remotes/branches/b_start)" &&
@@ -78,14 +78,16 @@ test_expect_success 'test left-hand-side only prefixed globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/t_end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/b_start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/t_end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/b_start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/b_start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/t_end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/b_start) &&
-	git log --pretty=oneline refs/remotes/two/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/t_end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 
@@ -118,14 +120,16 @@ test_expect_success 'test prefixed globs match just prefix' '
 		svn_cmd up
 	) &&
 	git svn fetch three &&
-	test $(git rev-list refs/remotes/three/branches/b_ | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/three/tags/t_ | wc -l) -eq 3 &&
+	git rev-list refs/remotes/three/branches/b_ >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/three/tags/t_ >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/three/branches/b_~1) = \
 	     $(git rev-parse refs/remotes/three/trunk) &&
 	test $(git rev-parse refs/remotes/three/tags/t_~1) = \
 	     $(git rev-parse refs/remotes/three/branches/b_) &&
-	git log --pretty=oneline refs/remotes/three/tags/t_ | \
-	    sed -e "s/^.\{41\}//" >output.three &&
+	git log --pretty=oneline refs/remotes/three/tags/t_ >actual &&
+	sed -e "s/^.\{41\}//" actual >output.three &&
 	test_cmp expect.three output.three
 	'
 
@@ -186,14 +190,16 @@ test_expect_success 'test globbing in the middle of the word' '
 		svn_cmd up
 	) &&
 	git svn fetch five &&
-	test $(git rev-list refs/remotes/five/branches/abcde | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/five/tags/fghij | wc -l) -eq 3 &&
+	git rev-list refs/remotes/five/branches/abcde >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/five/tags/fghij >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/five/branches/abcde~1) = \
 	     $(git rev-parse refs/remotes/five/trunk) &&
 	test $(git rev-parse refs/remotes/five/tags/fghij~1) = \
 	     $(git rev-parse refs/remotes/five/branches/abcde) &&
-	git log --pretty=oneline refs/remotes/five/tags/fghij | \
-	    sed -e "s/^.\{41\}//" >output.five &&
+	git log --pretty=oneline refs/remotes/five/tags/fghij >actual &&
+	sed -e "s/^.\{41\}//" actual >output.five &&
 	test_cmp expect.five output.five
 	'
 
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 866ddf605..b5f9ef6ff 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -43,20 +43,20 @@ test_expect_success 'fast-export | fast-import' '
 	MUSS=$(git rev-parse --verify muss) &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --all |
+	git fast-export --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test $MASTER = $(git rev-parse --verify refs/heads/master) &&
 	 test $REIN = $(git rev-parse --verify refs/tags/rein) &&
 	 test $WER = $(git rev-parse --verify refs/heads/wer) &&
-	 test $MUSS = $(git rev-parse --verify refs/tags/muss))
+	 test $MUSS = $(git rev-parse --verify refs/tags/muss)) <actual
 
 '
 
 test_expect_success 'fast-export master~2..master' '
 
-	git fast-export master~2..master |
-		sed "s/master/partial/" |
+	git fast-export master~2..master >actual &&
+	sed "s/master/partial/" actual |
 		(cd new &&
 		 git fast-import &&
 		 test $MASTER != $(git rev-parse --verify refs/heads/partial) &&
@@ -74,11 +74,12 @@ test_expect_success 'iso-8859-1' '
 	test_tick &&
 	echo rosten >file &&
 	git commit -s -m den file &&
-	git fast-export wer^..wer |
-		sed "s/wer/i18n/" |
+	git fast-export wer^..wer >actual &&
+	sed "s/wer/i18n/" actual |
 		(cd new &&
 		 git fast-import &&
-		 git cat-file commit i18n | grep "Áéí óú")
+		 git cat-file commit i18n >actual &&
+		 grep "Áéí óú" actual)
 
 '
 test_expect_success 'import/export-marks' '
@@ -87,18 +88,16 @@ test_expect_success 'import/export-marks' '
 	git fast-export --export-marks=tmp-marks HEAD &&
 	test -s tmp-marks &&
 	test_line_count = 3 tmp-marks &&
-	test $(
-		git fast-export --import-marks=tmp-marks\
-		--export-marks=tmp-marks HEAD |
-		grep ^commit |
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks HEAD >actual &&
+	test $(grep ^commit actual |
 		wc -l) \
 	-eq 0 &&
 	echo change > file &&
 	git commit -m "last commit" file &&
-	test $(
-		git fast-export --import-marks=tmp-marks \
-		--export-marks=tmp-marks HEAD |
-		grep ^commit\  |
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks HEAD >actual &&
+	test $(grep ^commit\  actual |
 		wc -l) \
 	-eq 1 &&
 	test_line_count = 4 tmp-marks
@@ -184,7 +183,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	rm -rf new &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --signed-tags=strip --all |
+	git fast-export --signed-tags=strip --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test "$SUBENT1" = "$(git ls-tree refs/heads/master^ sub)" &&
@@ -192,7 +191,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	 git checkout master &&
 	 git submodule init &&
 	 git submodule update &&
-	 cmp sub/file ../sub/file)
+	 cmp sub/file ../sub/file) <actual
 
 '
 
@@ -367,12 +366,14 @@ test_expect_success 'path limiting with import-marks does not lose unmodified fi
 	echo more content >> file &&
 	test_tick &&
 	git commit -mnext file &&
-	git fast-export --import-marks=marks simple -- file file0 | grep file0
+	git fast-export --import-marks=marks simple -- file file0 >actual &&
+	grep file0 actual
 '
 
 test_expect_success 'full-tree re-shows unmodified files'        '
 	git checkout -f simple &&
-	test $(git fast-export --full-tree simple | grep -c file0) -eq 3
+	git fast-export --full-tree simple >actual &&
+	test $(grep -c file0 actual) -eq 3
 '
 
 test_expect_success 'set-up a few more tags for tag export tests' '
@@ -500,13 +501,13 @@ test_expect_success 'refs are updated even if no commits need to be exported' '
 	git fast-export --import-marks=tmp-marks \
 		--export-marks=tmp-marks master > /dev/null &&
 	git fast-export --import-marks=tmp-marks \
-		--export-marks=tmp-marks master > actual &&
+		--export-marks=tmp-marks master >actual &&
 	test_cmp expected actual
 '
 
 test_expect_success 'use refspec' '
-	git fast-export --refspec refs/heads/master:refs/heads/foobar master | \
-		grep "^commit " | sort | uniq > actual &&
+	git fast-export --refspec refs/heads/master:refs/heads/foobar master >actual2 &&
+	grep "^commit " actual2 | sort | uniq >actual &&
 	echo "commit refs/heads/foobar" > expected &&
 	test_cmp expected actual
 '
@@ -534,7 +535,8 @@ test_expect_success 'when using -C, do not declare copy when source of copy is a
 	git -C src commit -m 2nd_commit &&
 
 	test_create_repo dst &&
-	git -C src fast-export --all -C | git -C dst fast-import &&
+	git -C src fast-export --all -C >actual &&
+	git -C dst fast-import <actual &&
 	git -C src show >expected &&
 	git -C dst show >actual &&
 	test_cmp expected actual
-- 
2.16.2


^ permalink raw reply related	[relevance 3%]

* [ANNOUNCE] Git v2.16.3
@ 2018-03-22 22:11  3% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2018-03-22 22:11 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel, git-packagers

The latest maintenance release Git v2.16.3 is now available at
the usual places.  It merges many small fixes and documentation
updates that have been in the 'master' branch for a few weeks.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/

The following public repositories all have a copy of the 'v2.16.3'
tag and the 'maint' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git

----------------------------------------------------------------

Git v2.16.3 Release Notes
=========================

Fixes since v2.16.2
-------------------

 * "git status" after moving a path in the working tree (hence making
   it appear "removed") and then adding with the -N option (hence
   making that appear "added") detected it as a rename, but did not
   report the  old and new pathnames correctly.

 * "git commit --fixup" did not allow "-m<message>" option to be used
   at the same time; allow it to annotate resulting commit with more
   text.

 * When resetting the working tree files recursively, the working tree
   of submodules are now also reset to match.

 * Fix for a commented-out code to adjust it to a rather old API change
   around object ID.

 * When there are too many changed paths, "git diff" showed a warning
   message but in the middle of a line.

 * The http tracing code, often used to debug connection issues,
   learned to redact potentially sensitive information from its output
   so that it can be more safely sharable.

 * Crash fix for a corner case where an error codepath tried to unlock
   what it did not acquire lock on.

 * The split-index mode had a few corner case bugs fixed.

 * Assorted fixes to "git daemon".

 * Completion of "git merge -s<strategy>" (in contrib/) did not work
   well in non-C locale.

 * Workaround for segfault with more recent versions of SVN.

 * Recently introduced leaks in fsck have been plugged.

 * Travis CI integration now builds the executable in 'script' phase
   to follow the established practice, rather than during
   'before_script' phase.  This allows the CI categorize the failures
   better ('failed' is project's fault, 'errored' is build
   environment's).

Also contains various documentation updates and code clean-ups.

----------------------------------------------------------------

Changes since v2.16.2 are as follows:

Ben Peart (1):
      fsmonitor: update documentation to remove reference to invalid config settings

Brandon Williams (1):
      oidmap: ensure map is initialized

Christian Ludwig (1):
      t9001: use existing helper in send-email test

Eric Sunshine (2):
      git-worktree.txt: fix missing ")" typo
      git-worktree.txt: fix indentation of example and text of 'add' command

Eric Wong (2):
      fsck: fix leak when traversing trees
      git-svn: control destruction order to avoid segfault

Genki Sky (1):
      test-lib.sh: unset XDG_CACHE_HOME

Jeff King (10):
      t5570: use ls-remote instead of clone for interp tests
      t/lib-git-daemon: record daemon log
      daemon: fix off-by-one in logging extended attributes
      daemon: handle NULs in extended attribute string
      t/lib-git-daemon: add network-protocol helpers
      daemon: fix length computation in newline stripping
      t0205: drop redundant test
      git-sh-i18n: check GETTEXT_POISON before USE_GETTEXT_SCHEME
      commit: drop uses of get_cached_commit_buffer()
      revision: drop --show-all option

Jonathan Tan (2):
      http: support cookie redaction when tracing
      http: support omitting data from traces

Juan F. Codagnone (1):
      mailinfo: avoid segfault when can't open files

Junio C Hamano (2):
      worktree: say that "add" takes an arbitrary commit in short-help
      Git 2.16.3

Kaartic Sivaraam (2):
      Doc/gitsubmodules: make some changes to improve readability and syntax
      Doc/git-submodule: improve readability and grammar of a sentence

Mathias Rav (1):
      files_initial_transaction_commit(): only unlock if locked

Motoki Seki (1):
      Documentation/gitsubmodules.txt: avoid non-ASCII apostrophes

Nguyễn Thái Ngọc Duy (12):
      t2203: test status output with porcelain v2 format
      Use DIFF_DETECT_RENAME for detect_rename assignments
      wt-status.c: coding style fix
      wt-status.c: catch unhandled diff status codes
      wt-status.c: rename rename-related fields in wt_status_change_data
      wt-status.c: handle worktree renames
      read-cache.c: change type of "temp" in write_shared_index()
      read-cache.c: move tempfile creation/cleanup out of write_shared_index
      diff.c: flush stdout before printing rename warnings
      read-cache: don't write index twice if we can't write shared index
      completion: fix completing merge strategies on non-C locales
      gitignore.txt: elaborate shell glob syntax

Ramsay Jones (2):
      config.mak.uname: remove SPARSE_FLAGS setting for cygwin
      Makefile: suppress a sparse warning for pack-revindex.c

Randall S. Becker (1):
      hashmap.h: remove unused variable

René Scharfe (2):
      describe: use strbuf_add_unique_abbrev() for adding short hashes
      cocci: simplify check for trivial format strings

Robert P. J. Day (2):
      t/: correct obvious typo "detahced"
      Correct mispellings of ".gitmodule" to ".gitmodules"

SZEDER Gábor (11):
      travis-ci: build Git during the 'script' phase
      t5541: add 'test_i18ngrep's missing filename parameter
      t5812: add 'test_i18ngrep's missing filename parameter
      t6022: don't run 'git merge' upstream of a pipe
      t4001: don't run 'git status' upstream of a pipe
      t5510: consolidate 'grep' and 'test_i18ngrep' patterns
      t5536: let 'test_i18ngrep' read the file without redirection
      t: move 'test_i18ncmp' and 'test_i18ngrep' to 'test-lib-functions.sh'
      t: validate 'test_i18ngrep's parameters
      t: make 'test_i18ngrep' more informative on failure
      t: document 'test_must_fail ok=<signal-name>'

Stefan Beller (5):
      t/lib-submodule-update.sh: clarify test
      t/lib-submodule-update.sh: fix test ignoring ignored files in submodules
      unpack-trees: oneway_merge to update submodules
      submodule: submodule_move_head omits old argument in forced case
      Documentation/git-status: clarify status table for porcelain mode

Stefan Moch (2):
      t7001: add test case for --dry-run
      mv: remove unneeded 'if (!show_only)'

Thomas Gummerer (3):
      read-cache: fix reading the shared index for other repos
      split-index: don't write cache tree with null oid entries
      travis: run tests with GIT_TEST_SPLIT_INDEX

Todd Zullinger (1):
      doc: mention 'git show' defaults to HEAD

Yasushi SHOJI (1):
      bisect: debug: convert struct object to object_id

brian m. carlson (1):
      docs/interpret-trailers: fix agreement error

Ævar Arnfjörð Bjarmason (2):
      commit doc: document that -c, -C, -F and --fixup with -m error
      commit: add support for --fixup <commit> -m"<extra message>"


^ permalink raw reply	[relevance 3%]

* [GSoC][PATCH v3] test: avoid pipes in git related commands for test
  2018-03-21 11:02  0%   ` Eric Sunshine
@ 2018-03-21 15:23  3%     ` Pratik Karki
  0 siblings, 0 replies; 200+ results
From: Pratik Karki @ 2018-03-21 15:23 UTC (permalink / raw)
  To: Git List; +Cc: Pratik Karki, Eric Sunshine

Thank you Eric, for the review. This is follow on patch[1].

The changes in patch increased from v1 to v2 because I
got excited to work in Git codebase and I tried to
fix the exisiting problems as much as possible.
Hence, the large number of changes.


>>         test_cmp expect.two output.two
>> @@ -120,18 +122,20 @@ test_expect_success 'test another branch' '
>>         git config --add svn-remote.four.url "$svnrepo" &&
>>         git config --add svn-remote.four.fetch trunk:refs/remotes/four/trunk &&
>>         git config --add svn-remote.four.branches \
>> -                        "branches/*/*:refs/remotes/four/branches/*/*" &&
>> +                        "branches/*/*:refs/remotes/four/branches/*/*" &&
>>         git config --add svn-remote.four.tags \
>> -                        "tags/*:refs/remotes/four/tags/*" &&
>> +                        "tags/*:refs/remotes/four/tags/*" &&

>I guess you sneaked in a whitespace change here which is unrelated to
>the stated purpose of this patch, thus acted as a speed bump during
>review. If this was the only instance in this test script of
>whitespace needing correction, then it _might_ be okay to include it
>in this patch, however, that's not the case. There are many other such
>instance in this test script which could be corrected, so it doesn't
>make sense to single out these two and ignore all the others.
>Therefore, you should omit this change.

I used tabify in Emacs and it must have messed up the whitespace
change. I read SubmittingPatches guideline[2] for git where it
is said that whitespace check must be done and git community is
picky about it and 'git diff --check' must be done before commit.
If I change this change back to original the 'git diff --check'
reports whitespace identation with space. So, isn't this
supposedly a fix?

[1]: https://public-inbox.org/git/20180319173204.31952-1-predatoramigo@gmail.com/
[2]: https://github.com/git/git/blob/master/Documentation/SubmittingPatches

------------------------------------- >8----------------------------------------

 Avoid using pipes downstream of Git commands since the exit
 codes of commands upstream of pipes get swallowed, thus potentially hiding
 failure of those commands. Instead, capture Git command output to a file and
 apply the downstream command(s) to that file.

Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
---
 t/t5300-pack-object.sh                     | 10 +++---
 t/t5510-fetch.sh                           |  8 ++---
 t/t7001-mv.sh                              | 22 ++++++------
 t/t7003-filter-branch.sh                   |  9 +++--
 t/t9104-git-svn-follow-parent.sh           | 16 +++++----
 t/t9108-git-svn-glob.sh                    | 14 ++++----
 t/t9109-git-svn-multi-glob.sh              | 38 +++++++++++----------
 t/t9110-git-svn-use-svm-props.sh           | 42 +++++++++++------------
 t/t9111-git-svn-use-svnsync-props.sh       | 36 ++++++++++----------
 t/t9114-git-svn-dcommit-merge.sh           | 10 +++---
 t/t9130-git-svn-authors-file.sh            | 28 +++++++++-------
 t/t9138-git-svn-authors-prog.sh            | 31 ++++++++---------
 t/t9153-git-svn-rewrite-uuid.sh            |  8 ++---
 t/t9168-git-svn-partially-globbed-names.sh | 34 +++++++++++--------
 t/t9350-fast-export.sh                     | 54 ++++++++++++++++--------------
 15 files changed, 193 insertions(+), 167 deletions(-)

diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 9c68b9925..707208284 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -311,9 +311,9 @@ test_expect_success 'unpacking with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
-	PACK6=$( (
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$( git pack-objects test-5 <actual ) &&
+	PACK6=$((
 			echo "$LIST"
 			echo "$LI"
 			echo "$ST"
@@ -358,8 +358,8 @@ test_expect_success 'index-pack with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$( git pack-objects test-5 <actual ) &&
 	PACK6=$( (
 			echo "$LIST"
 			echo "$LI"
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 668c54be4..c7b284138 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -693,8 +693,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch aligned output' '
 	test_commit looooooooooooong-tag &&
 	(
 		cd full-output &&
-		git -c fetch.output=full fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=full fetch origin >actual2 2>&1 &&
+		grep -e "->" actual2 | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master               -> origin/master
@@ -708,8 +708,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch compact output' '
 	test_commit extraaa &&
 	(
 		cd compact &&
-		git -c fetch.output=compact fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=compact fetch origin >actual2 2>&1 &&
+		grep -e "->" actual2 | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master     -> origin/*
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 6e5031f56..00aa9e45b 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -21,8 +21,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path0/COPYING..*path1/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path0/COPYING..*path1/COPYING" actual'
 
 test_expect_success \
     'moving the file back into subdirectory' \
@@ -35,8 +35,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path1/COPYING..*path0/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path1/COPYING..*path0/COPYING" actual'
 
 test_expect_success \
     'checking -k on non-existing file' \
@@ -116,10 +116,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/COPYING..*path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/README..*path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path0/COPYING..*path2/COPYING" actual &&
+     grep "^R100..*path0/README..*path2/README" actual'
 
 test_expect_success \
     'succeed when source is a prefix of destination' \
@@ -135,10 +134,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/COPYING..*path1/path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/README..*path1/path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path2/COPYING..*path1/path2/COPYING" actual &&
+     grep "^R100..*path2/README..*path1/path2/README" actual'
 
 test_expect_success \
     'do not move directory over existing directory' \
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 7cb60799b..6a28b6cce 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -187,7 +187,8 @@ test_expect_success 'author information is preserved' '
 			test \$GIT_COMMIT != $(git rev-parse master) || \
 			echo Hallo" \
 		preserved-author) &&
-	test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
+	git rev-list --author="B V Uips" preserved-author >actual &&
+	test_line_count = 1 actual
 '
 
 test_expect_success "remove a certain author's commits" '
@@ -205,7 +206,8 @@ test_expect_success "remove a certain author's commits" '
 	cnt1=$(git rev-list master | wc -l) &&
 	cnt2=$(git rev-list removed-author | wc -l) &&
 	test $cnt1 -eq $(($cnt2 + 1)) &&
-	test 0 = $(git rev-list --author="B V Uips" removed-author | wc -l)
+	git rev-list --author="B V Uips" removed-author >actual &&
+	test_line_count = 0 actual
 '
 
 test_expect_success 'barf on invalid name' '
@@ -258,7 +260,8 @@ test_expect_success 'Subdirectory filter with disappearing trees' '
 	git commit -m "Re-adding foo" &&
 
 	git filter-branch -f --subdirectory-filter foo &&
-	test $(git rev-list master | wc -l) = 3
+	git rev-list master >actual &&
+	test_line_count = 3 actual
 '
 
 test_expect_success 'Tag name filtering retains tag message' '
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index cd480edf1..a735fa371 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -33,8 +33,8 @@ test_expect_success 'init and fetch a moved directory' '
 	git svn fetch -i thunk &&
 	test "$(git rev-parse --verify refs/remotes/thunk@2)" \
 	   = "$(git rev-parse --verify refs/remotes/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/thunk:readme |\
-		 sed -n -e "3p")" = goodbye &&
+	git cat-file blob refs/remotes/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye &&
 	test -z "$(git config --get svn-remote.svn.fetch \
 		 "^trunk:refs/remotes/thunk@2$")"
 	'
@@ -48,8 +48,8 @@ test_expect_success 'init and fetch from one svn-remote' '
         git svn fetch -i svn/thunk &&
 	test "$(git rev-parse --verify refs/remotes/svn/trunk)" \
 	   = "$(git rev-parse --verify refs/remotes/svn/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/svn/thunk:readme |\
-		 sed -n -e "3p")" = goodbye
+	git cat-file blob refs/remotes/svn/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye
         '
 
 test_expect_success 'follow deleted parent' '
@@ -107,7 +107,8 @@ test_expect_success 'follow deleted directory' '
 	git svn init --minimize-url -i glob "$svnrepo"/glob &&
 	git svn fetch -i glob &&
 	test "$(git cat-file blob refs/remotes/glob:blob/bye)" = hi &&
-	test "$(git ls-tree refs/remotes/glob | wc -l )" -eq 1
+	git ls-tree refs/remotes/glob >actual &&
+	test_line_count = 1 actual
 	'
 
 # ref: r9270 of the Subversion repository: (http://svn.collab.net/repos/svn)
@@ -204,8 +205,9 @@ test_expect_success "follow-parent is atomic" '
 test_expect_success "track multi-parent paths" '
 	svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
 	git svn multi-fetch &&
-	test $(git cat-file commit refs/remotes/glob | \
-	       grep "^parent " | wc -l) -eq 2
+	git cat-file commit refs/remotes/glob >actual &&
+	grep "^parent " actual >actual2 &&
+	test_line_count = 2 actual2
 	'
 
 test_expect_success "multi-fetch continues to work" "
diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh
index a94286c8e..6990f6436 100755
--- a/t/t9108-git-svn-glob.sh
+++ b/t/t9108-git-svn-glob.sh
@@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
 	git config --add svn-remote.svn.tags\
 	                 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/start)" &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 
diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh
index 8d99e848d..5abffe1a4 100755
--- a/t/t9109-git-svn-multi-glob.sh
+++ b/t/t9109-git-svn-multi-glob.sh
@@ -41,14 +41,14 @@ test_expect_success 'test refspec globbing' '
 	) &&
 	git config --add svn-remote.svn.url "$svnrepo" &&
 	git config --add svn-remote.svn.fetch \
-	                 "trunk/src/a:refs/remotes/trunk" &&
+			 "trunk/src/a:refs/remotes/trunk" &&
 	git config --add svn-remote.svn.branches \
-	                 "branches/*/*/src/a:refs/remotes/branches/*/*" &&
+			 "branches/*/*/src/a:refs/remotes/branches/*/*" &&
 	git config --add svn-remote.svn.tags\
-	                 "tags/*/src/a:refs/remotes/tags/*" &&
+			 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/v1/start)" &&
@@ -65,9 +65,9 @@ test_expect_success 'test left-hand-side only globbing' '
 	git config --add svn-remote.two.url "$svnrepo" &&
 	git config --add svn-remote.two.fetch trunk:refs/remotes/two/trunk &&
 	git config --add svn-remote.two.branches \
-	                 "branches/*/*:refs/remotes/two/branches/*/*" &&
+			 "branches/*/*:refs/remotes/two/branches/*/*" &&
 	git config --add svn-remote.two.tags \
-	                 "tags/*:refs/remotes/two/tags/*" &&
+			 "tags/*:refs/remotes/two/tags/*" &&
 	(
 		cd tmp &&
 		echo "try try" >> tags/end/src/b/readme &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/v1/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/v1/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/two/branches/v1/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/v1/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.two &&
 	test_cmp expect.two output.two
 	'
 cat > expect.four <<EOF
@@ -120,18 +122,20 @@ test_expect_success 'test another branch' '
 	git config --add svn-remote.four.url "$svnrepo" &&
 	git config --add svn-remote.four.fetch trunk:refs/remotes/four/trunk &&
 	git config --add svn-remote.four.branches \
-	                 "branches/*/*:refs/remotes/four/branches/*/*" &&
+			 "branches/*/*:refs/remotes/four/branches/*/*" &&
 	git config --add svn-remote.four.tags \
-	                 "tags/*:refs/remotes/four/tags/*" &&
+			 "tags/*:refs/remotes/four/tags/*" &&
 	git svn fetch four &&
-	test $(git rev-list refs/remotes/four/tags/next | wc -l) -eq 5 &&
-	test $(git rev-list refs/remotes/four/branches/v2/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/four/tags/next >actual &&
+	test_line_count = 5 actual &&
+	git rev-list refs/remotes/four/branches/v2/start >actual &&
+	test_line_count = 3 actual &&
 	test $(git rev-parse refs/remotes/four/branches/v2/start~2) = \
 	     $(git rev-parse refs/remotes/four/trunk) &&
 	test $(git rev-parse refs/remotes/four/tags/next~2) = \
 	     $(git rev-parse refs/remotes/four/branches/v2/start) &&
-	git log --pretty=oneline refs/remotes/four/tags/next | \
-	    sed -e "s/^.\{41\}//" > output.four &&
+	git log --pretty=oneline refs/remotes/four/tags/next >actual &&
+	sed -e "s/^.\{41\}//" actual >output.four &&
 	test_cmp expect.four output.four
 	'
 
diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
index dde0a3c22..dbd9590a7 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/t/t9110-git-svn-use-svm-props.sh
@@ -21,38 +21,38 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~2 >actual &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~3 >actual &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~4 >actual &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~5 >actual &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual
 	"
 
 test_expect_success 'find commit based on SVN revision number' "
-        git svn find-rev r12 |
-	    grep $(git rev-parse HEAD)
-        "
+	git svn find-rev r12 >actual &&
+	grep $(git rev-parse HEAD) actual
+	"
 
 test_expect_success 'empty rebase' "
 	git svn rebase
diff --git a/t/t9111-git-svn-use-svnsync-props.sh b/t/t9111-git-svn-use-svnsync-props.sh
index 22b6e5ee7..a4225c9f6 100755
--- a/t/t9111-git-svn-use-svnsync-props.sh
+++ b/t/t9111-git-svn-use-svnsync-props.sh
@@ -20,32 +20,32 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual1 &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual1 &&
+	git cat-file commit refs/remotes/bar~2 >actual2 &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual2 &&
+	git cat-file commit refs/remotes/bar~3 >actual3 &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual3 &&
+	git cat-file commit refs/remotes/bar~4 >actual4 &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual4 &&
+	git cat-file commit refs/remotes/bar~5 >actual5 &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual5
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual1 &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual1
 	"
 
 test_done
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index 50bca62de..32317d6bc 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -68,7 +68,8 @@ test_debug 'gitk --all & sleep 1'
 test_expect_success 'verify pre-merge ancestry' "
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'git svn dcommit merges' "
@@ -82,12 +83,13 @@ test_expect_success 'verify post-merge ancestry' "
 	     x\$(git rev-parse --verify refs/remotes/origin/trunk) &&
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'verify merge commit message' "
-	git rev-list --pretty=raw -1 refs/heads/svn | \
-	  grep \"    Merge branch 'merge' into svn\"
+	git rev-list --pretty=raw -1 refs/heads/svn >actual &&
+	grep \"    Merge branch 'merge' into svn\" actual
 	"
 
 test_done
diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
index 41264818c..7752a1fae 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/t/t9130-git-svn-authors-file.sh
@@ -26,11 +26,12 @@ test_expect_success 'start import with incomplete authors file' '
 test_expect_success 'imported 2 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 2 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author BBBBBBB BBBBBBB <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author AAAAAAA AAAAAAA <aa@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 2 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author BBBBBBB BBBBBBB <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author AAAAAAA AAAAAAA <aa@example\.com> " actual
 	)
 	'
 
@@ -43,11 +44,12 @@ test_expect_success 'continues to import once authors have been added' '
 	(
 		cd x
 		git svn fetch --authors-file=../svn-authors &&
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 4 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author DDDDDDD DDDDDDD <dd@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author CCCCCCC CCCCCCC <cc@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 4 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author DDDDDDD DDDDDDD <dd@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author CCCCCCC CCCCCCC <cc@example\.com> " actual
 	)
 	'
 
@@ -102,8 +104,10 @@ test_expect_success !MINGW 'fresh clone with svn.authors-file in config' '
 		test x"$HOME"/svn-authors = x"$(git config svn.authorsfile)" &&
 		git svn clone "$svnrepo" gitconfig.clone &&
 		cd gitconfig.clone &&
-		nr_ex=$(git log | grep "^Author:.*example.com" | wc -l) &&
-		nr_rev=$(git rev-list HEAD | wc -l) &&
+		git log >actual &&
+		nr_ex=$(grep "^Author:.*example.com" actual | wc -l) &&
+		git rev-list HEAD >actual &&
+		nr_rev=$(wc -l <actual) &&
 		test $nr_rev -eq $nr_ex
 	)
 '
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46b..f684f5578 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -37,31 +37,32 @@ test_expect_success 'import authors with prog and file' '
 test_expect_success 'imported 6 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 6
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 6 actual
 	)
 '
 
 test_expect_success 'authors-prog ran correctly' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author ee-foo <ee-foo@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 | \
-		  grep "^author dd <dd@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 | \
-		  grep "^author cc <cc@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 | \
-		  grep "^author bb <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 | \
-		  grep "^author aa <aa@example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author ee-foo <ee-foo@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 >actual2 &&
+		grep "^author dd <dd@sub\.example\.com> " actual2 &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 >actual3 &&
+		grep "^author cc <cc@sub\.example\.com> " actual3 &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 >actual4 &&
+		grep "^author bb <bb@example\.com> " actual4 &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 >actual5 &&
+		grep "^author aa <aa@example\.com> " actual5
 	)
 '
 
 test_expect_success 'authors-file overrode authors-prog' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> " actual
 	)
 '
 
@@ -73,8 +74,8 @@ test_expect_success 'authors-prog handled special characters in username' '
 	(
 		cd x &&
 		git svn --authors-prog=../svn-authors-prog fetch &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn |
-		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " actual &&
 		! test -f evil
 	)
 '
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/t/t9153-git-svn-rewrite-uuid.sh
index 372ef1568..6cd28bb9a 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/t/t9153-git-svn-rewrite-uuid.sh
@@ -16,10 +16,10 @@ test_expect_success 'load svn repo' "
 	"
 
 test_expect_success 'verify uuid' "
-	git cat-file commit refs/remotes/git-svn~0 | \
-	   grep '^git-svn-id: .*@2 $uuid$' &&
-	git cat-file commit refs/remotes/git-svn~1 | \
-	   grep '^git-svn-id: .*@1 $uuid$'
+	git cat-file commit refs/remotes/git-svn~0 >actual &&
+	grep '^git-svn-id: .*@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/git-svn~1 >actual1 &&
+	grep '^git-svn-id: .*@1 $uuid$' actual1
 	"
 
 test_done
diff --git a/t/t9168-git-svn-partially-globbed-names.sh b/t/t9168-git-svn-partially-globbed-names.sh
index 8b22f2272..df6f3a974 100755
--- a/t/t9168-git-svn-partially-globbed-names.sh
+++ b/t/t9168-git-svn-partially-globbed-names.sh
@@ -48,8 +48,8 @@ test_expect_success 'test refspec prefixed globbing' '
 	git config --add svn-remote.svn.tags\
 			 "tags/t_*/src/a:refs/remotes/tags/t_*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.end &&
+	git log --pretty=oneline refs/remotes/tags/t_end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/t_end~1)" = \
 		"$(git rev-parse refs/remotes/branches/b_start)" &&
@@ -78,14 +78,16 @@ test_expect_success 'test left-hand-side only prefixed globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/t_end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/b_start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/t_end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/b_start >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/two/branches/b_start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/t_end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/b_start) &&
-	git log --pretty=oneline refs/remotes/two/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/t_end >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 >output.two &&
 	test_cmp expect.two output.two
 	'
 
@@ -118,14 +120,16 @@ test_expect_success 'test prefixed globs match just prefix' '
 		svn_cmd up
 	) &&
 	git svn fetch three &&
-	test $(git rev-list refs/remotes/three/branches/b_ | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/three/tags/t_ | wc -l) -eq 3 &&
+	git rev-list refs/remotes/three/branches/b_ >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/three/tags/t_ >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/three/branches/b_~1) = \
 	     $(git rev-parse refs/remotes/three/trunk) &&
 	test $(git rev-parse refs/remotes/three/tags/t_~1) = \
 	     $(git rev-parse refs/remotes/three/branches/b_) &&
-	git log --pretty=oneline refs/remotes/three/tags/t_ | \
-	    sed -e "s/^.\{41\}//" >output.three &&
+	git log --pretty=oneline refs/remotes/three/tags/t_ >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 >output.three &&
 	test_cmp expect.three output.three
 	'
 
@@ -186,14 +190,16 @@ test_expect_success 'test globbing in the middle of the word' '
 		svn_cmd up
 	) &&
 	git svn fetch five &&
-	test $(git rev-list refs/remotes/five/branches/abcde | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/five/tags/fghij | wc -l) -eq 3 &&
+	git rev-list refs/remotes/five/branches/abcde >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/five/tags/fghij >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/five/branches/abcde~1) = \
 	     $(git rev-parse refs/remotes/five/trunk) &&
 	test $(git rev-parse refs/remotes/five/tags/fghij~1) = \
 	     $(git rev-parse refs/remotes/five/branches/abcde) &&
-	git log --pretty=oneline refs/remotes/five/tags/fghij | \
-	    sed -e "s/^.\{41\}//" >output.five &&
+	git log --pretty=oneline refs/remotes/five/tags/fghij >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 >output.five &&
 	test_cmp expect.five output.five
 	'
 
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 866ddf605..116b4e5f8 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -43,20 +43,20 @@ test_expect_success 'fast-export | fast-import' '
 	MUSS=$(git rev-parse --verify muss) &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --all |
+	git fast-export --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test $MASTER = $(git rev-parse --verify refs/heads/master) &&
 	 test $REIN = $(git rev-parse --verify refs/tags/rein) &&
 	 test $WER = $(git rev-parse --verify refs/heads/wer) &&
-	 test $MUSS = $(git rev-parse --verify refs/tags/muss))
+	 test $MUSS = $(git rev-parse --verify refs/tags/muss)) <actual
 
 '
 
 test_expect_success 'fast-export master~2..master' '
 
-	git fast-export master~2..master |
-		sed "s/master/partial/" |
+	git fast-export master~2..master >actual &&
+	sed "s/master/partial/" actual |
 		(cd new &&
 		 git fast-import &&
 		 test $MASTER != $(git rev-parse --verify refs/heads/partial) &&
@@ -74,11 +74,12 @@ test_expect_success 'iso-8859-1' '
 	test_tick &&
 	echo rosten >file &&
 	git commit -s -m den file &&
-	git fast-export wer^..wer |
-		sed "s/wer/i18n/" |
-		(cd new &&
-		 git fast-import &&
-		 git cat-file commit i18n | grep "Áéí óú")
+	git fast-export wer^..wer >actual &&
+	sed "s/wer/i18n/" actual |
+	    (cd new &&
+		git fast-import &&
+		git cat-file commit i18n >actual &&
+		grep "Áéí óú" actual)
 
 '
 test_expect_success 'import/export-marks' '
@@ -87,18 +88,18 @@ test_expect_success 'import/export-marks' '
 	git fast-export --export-marks=tmp-marks HEAD &&
 	test -s tmp-marks &&
 	test_line_count = 3 tmp-marks &&
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks HEAD >actual &&
 	test $(
-		git fast-export --import-marks=tmp-marks\
-		--export-marks=tmp-marks HEAD |
-		grep ^commit |
+		grep ^commit actual |
 		wc -l) \
 	-eq 0 &&
 	echo change > file &&
 	git commit -m "last commit" file &&
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks HEAD >actual2 &&
 	test $(
-		git fast-export --import-marks=tmp-marks \
-		--export-marks=tmp-marks HEAD |
-		grep ^commit\  |
+		grep ^commit\  actual2 |
 		wc -l) \
 	-eq 1 &&
 	test_line_count = 4 tmp-marks
@@ -184,7 +185,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	rm -rf new &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --signed-tags=strip --all |
+	git fast-export --signed-tags=strip --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test "$SUBENT1" = "$(git ls-tree refs/heads/master^ sub)" &&
@@ -192,7 +193,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	 git checkout master &&
 	 git submodule init &&
 	 git submodule update &&
-	 cmp sub/file ../sub/file)
+	 cmp sub/file ../sub/file) <actual
 
 '
 
@@ -361,18 +362,20 @@ test_expect_failure 'no exact-ref revisions included' '
 	)
 '
 
-test_expect_success 'path limiting with import-marks does not lose unmodified files'        '
+test_expect_success 'path limiting with import-marks does not lose unmodified files'	     '
 	git checkout -b simple marks~2 &&
 	git fast-export --export-marks=marks simple -- file > /dev/null &&
 	echo more content >> file &&
 	test_tick &&
 	git commit -mnext file &&
-	git fast-export --import-marks=marks simple -- file file0 | grep file0
+	git fast-export --import-marks=marks simple -- file file0 >actual &&
+	grep file0 actual
 '
 
-test_expect_success 'full-tree re-shows unmodified files'        '
+test_expect_success 'full-tree re-shows unmodified files'	  '
 	git checkout -f simple &&
-	test $(git fast-export --full-tree simple | grep -c file0) -eq 3
+	git fast-export --full-tree simple >actual &&
+	test $(grep -c file0 actual) -eq 3
 '
 
 test_expect_success 'set-up a few more tags for tag export tests' '
@@ -500,13 +503,13 @@ test_expect_success 'refs are updated even if no commits need to be exported' '
 	git fast-export --import-marks=tmp-marks \
 		--export-marks=tmp-marks master > /dev/null &&
 	git fast-export --import-marks=tmp-marks \
-		--export-marks=tmp-marks master > actual &&
+		--export-marks=tmp-marks master >actual &&
 	test_cmp expected actual
 '
 
 test_expect_success 'use refspec' '
-	git fast-export --refspec refs/heads/master:refs/heads/foobar master | \
-		grep "^commit " | sort | uniq > actual &&
+	git fast-export --refspec refs/heads/master:refs/heads/foobar master >actual2 &&
+	grep "^commit " actual2 | sort | uniq >actual &&
 	echo "commit refs/heads/foobar" > expected &&
 	test_cmp expected actual
 '
@@ -534,7 +537,8 @@ test_expect_success 'when using -C, do not declare copy when source of copy is a
 	git -C src commit -m 2nd_commit &&
 
 	test_create_repo dst &&
-	git -C src fast-export --all -C | git -C dst fast-import &&
+	git -C src fast-export --all -C >actual &&
+	git -C dst fast-import <actual &&
 	git -C src show >expected &&
 	git -C dst show >actual &&
 	test_cmp expected actual
-- 
2.16.2


^ permalink raw reply related	[relevance 3%]

* Re: [GSoC][PATCH] test: avoid pipes in git related commands for test suite
  2018-03-19 17:32  3% ` [GSoC][PATCH] " Pratik Karki
@ 2018-03-21 11:02  0%   ` Eric Sunshine
  2018-03-21 15:23  3%     ` [GSoC][PATCH v3] test: avoid pipes in git related commands for test Pratik Karki
  0 siblings, 1 reply; 200+ results
From: Eric Sunshine @ 2018-03-21 11:02 UTC (permalink / raw)
  To: Pratik Karki; +Cc: Git List

On Mon, Mar 19, 2018 at 1:32 PM, Pratik Karki <predatoramigo@gmail.com> wrote:
> Thank you Eric Sunshine,
> I have done as you had instructed me. I look forward to more
> understanding of the codebase and would love to fix
> "git rev-parse" problems in my follow-on patches.
> Thank you for the professional review comment.
>
> Sorry for late follow-on patch, I got tied up with my university stuffs.

No need to apologize; this is not a race. It's better to take time
preparing submissions carefully, than trying to rush them out.

> Please do review this patch as before. I will correct it if needed.

Below comments are meant to be instructive and constructive.

> Cheers,
> Pratik Karki

Place a "-- >8--" scissor line right here so that git-am knows where
the commit message begins; otherwise, all of the above commentary will
undesirably be included in the commit message.

> [PATCH] test: avoid pipes in git related commands for test suite

As this is the second attempt at this patch, the subject should be
"[PATCH v2]". Also, as an aid to reviewers -- who see a lot of patches
each day and are likely to forget details of each submission -- please
include a link in the commentary (not in the actual commit message)
pointing at the previous iteration, like this[1].

[1]: https://public-inbox.org/git/20180313201945.8409-1-predatoramigo@gmail.com/

> Avoid using pipes downstream of Git commands since the exit codes
> of commands upstream of pipes get swallowed, thus potentially
> hiding failure of those commands. Instead, capture Git command
> output to a file apply the downstream command(s) to that file.

This rewrite of the commit message which I suggested in [2] has a
grammatical error (which I noticed immediately after hitting "Send").
Unfortunately, you copied it verbatim, so the error is reproduced
here. Specifically, you want to insert "and" between "file" and
"apply":

    ... capture Git command output to a file _and_ apply...

[2]: https://public-inbox.org/git/CAPig+cRPzyw525ODC4=-E7w=zbpbhVN2eqxSYDSLij5wfW8S_A@mail.gmail.com/

> Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
> ---
>  t/t5300-pack-object.sh                     | 10 +++---
>  t/t5510-fetch.sh                           |  8 ++---
>  t/t7001-mv.sh                              | 22 ++++++-------
>  t/t7003-filter-branch.sh                   |  9 ++++--
>  t/t9104-git-svn-follow-parent.sh           | 16 +++++----
>  t/t9108-git-svn-glob.sh                    | 14 ++++----
>  t/t9109-git-svn-multi-glob.sh              | 28 +++++++++-------
>  t/t9110-git-svn-use-svm-props.sh           | 42 ++++++++++++------------
>  t/t9111-git-svn-use-svnsync-props.sh       | 36 ++++++++++-----------
>  t/t9114-git-svn-dcommit-merge.sh           | 10 +++---
>  t/t9130-git-svn-authors-file.sh            | 28 +++++++++-------
>  t/t9138-git-svn-authors-prog.sh            | 31 +++++++++---------
>  t/t9153-git-svn-rewrite-uuid.sh            |  8 ++---
>  t/t9168-git-svn-partially-globbed-names.sh | 34 +++++++++++--------
>  t/t9350-fast-export.sh                     | 52 ++++++++++++++++--------------
>  15 files changed, 187 insertions(+), 161 deletions(-)

The goal of iterating a patch or patch series is to converge to a
point at which the submission is in good enough shape to be accepted.
Ideally, each iteration should involve fewer changes than the previous
attempt.

Version 1 of this patch touched only 8 files, however, this version
touches 15, and is now uncomfortably large and difficult to review in
a single sitting (it took over 1.5 hours). Rather than converging, it
has instead diverged, and is thus potentially further from being in an
acceptable state than it would have been if v2 had merely addressed
the problems identified by the v1 review.

While the desire to address these additional cases is admirable, it is
better to focus on "landing" the current patch (getting it accepted)
before expanding your efforts; it's also more reviewer-friendly to
stay focused, especially with patches, such as this, which involve
primarily mechanical changes (which tend to be mind-numbing to
review).

> diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
> @@ -311,9 +311,9 @@ test_expect_success 'unpacking with --strict' '
>         rm -f .git/index &&
>         tail -n 10 LIST | git update-index --index-info &&
>         ST=$(git write-tree) &&
> -       PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
> -               git pack-objects test-5 ) &&
> -       PACK6=$( (
> +       git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
> +       PACK5=$(git pack-objects test-5 < actual) &&
> +       PACK6=$((

Losing the space between the two left parentheses is wrong. $( ( foo )
), which captures the output of subshell running 'foo', has very
different meaning than $((foo)), which performs arithmetic. This
change turns it into $(( foo) ), which, at best, is undefined.
Although bash seems to tolerate this change, other more strict shells
barf on it.

>                         echo "$LIST"
>                         echo "$LI"
>                         echo "$ST"
> @@ -358,8 +358,8 @@ test_expect_success 'index-pack with --strict' '
>         rm -f .git/index &&
>         tail -n 10 LIST | git update-index --index-info &&
>         ST=$(git write-tree) &&
> -       PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
> -               git pack-objects test-5 ) &&
> +       git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
> +       PACK5=$(git pack-objects test-5 < actual) &&
>         PACK6=$( (
>                         echo "$LIST"
>                         echo "$LI"
> diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
> @@ -187,7 +187,8 @@ test_expect_success 'author information is preserved' '
>                         test \$GIT_COMMIT != $(git rev-parse master) || \
>                         echo Hallo" \
>                 preserved-author) &&
> -       test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
> +       git rev-list --author="B V Uips" preserved-author > actual &&

Style: drop space after '>'

> +       test 1 = $(wc -l < actual)

Style: drop space after '<'

You could also take advantage of test_line_count() rather than using 'wc':

    test_line_count = 1 actual

It's a judgment call whether or not to convert this to use
test_line_count(), however, since you made such a conversion later in
this file, you should do it here too. Or, don't use test_line_count()
in this file. It's not so important whether you do or not, but it is
important that you be consistent about it (which is not currently the
case).

> @@ -205,7 +206,8 @@ test_expect_success "remove a certain author's commits" '
>         cnt1=$(git rev-list master | wc -l) &&
>         cnt2=$(git rev-list removed-author | wc -l) &&
>         test $cnt1 -eq $(($cnt2 + 1)) &&
> -       test 0 = $(git rev-list --author="B V Uips" removed-author | wc -l)
> +       git rev-list --author="B V Uips" removed-author >actual &&
> +       test 0 = $(wc -l < actual)

Ditto: drop space before '<'
Ditto: test_line_count = 0 actual

> @@ -258,7 +260,8 @@ test_expect_success 'Subdirectory filter with disappearing trees' '
>         git filter-branch -f --subdirectory-filter foo &&
> -       test $(git rev-list master | wc -l) = 3
> +       git rev-list master >actual &&
> +       test_line_count = 3 actual
>  '

Here you used test_line_count().

> diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
> @@ -204,8 +205,9 @@ test_expect_success "follow-parent is atomic" '
>  test_expect_success "track multi-parent paths" '
>         svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
>         git svn multi-fetch &&
> -       test $(git cat-file commit refs/remotes/glob | \
> -              grep "^parent " | wc -l) -eq 2
> +       git cat-file commit refs/remotes/glob >actual &&
> +       grep "^parent " actual > actual2 &&

Style: drop space after '>'

> +       test_line_count = 2 actual2
> diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh
> @@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
>         git config --add svn-remote.svn.tags\
>                          "tags/*/src/a:refs/remotes/tags/*" &&
>         git svn multi-fetch &&
> -       git log --pretty=oneline refs/remotes/tags/end | \
> -           sed -e "s/^.\{41\}//" > output.end &&
> +       git log --pretty=oneline refs/remotes/tags/end >actual &&
> +       sed -e "s/^.\{41\}//" actual > output.end &&

This is not a new problem, but since you're touching it, drop space after '>'.

>         test_cmp expect.end output.end &&
> @@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
>         git svn fetch two &&
> -       test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
> -       test $(git rev-list refs/remotes/two/branches/start | wc -l) -eq 3 &&
> +       git rev-list refs/remotes/two/tags/end >actual &&
> +       test_line_count = 6 actual &&
> +       git rev-list refs/remotes/two/branches/start >actual2 &&
> +       test_line_count = 3 actual2 &&

It's better to name all these files "actual", rather than inventing
names "actual2", "actual3", etc. Those invented names mislead readers
into thinking that there might be some interrelation between the files
which requires them all to exist at once. But, this is not the case.
Those files serve no purpose after their associated test_line_count(),
and you can clearly indicate such by overwriting each time by reusing
the name "actual".

>         test $(git rev-parse refs/remotes/two/branches/start~2) = \
>              $(git rev-parse refs/remotes/two/trunk) &&
>         test $(git rev-parse refs/remotes/two/tags/end~3) = \
>              $(git rev-parse refs/remotes/two/branches/start) &&
> -       git log --pretty=oneline refs/remotes/two/tags/end | \
> -           sed -e "s/^.\{41\}//" > output.two &&
> +       git log --pretty=oneline refs/remotes/two/tags/end >actual3 &&
> +       sed -e "s/^.\{41\}//" actual3 > output.two &&

Style: drop space after '>'

>         test_cmp expect.two output.two
> diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh
> @@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
>         git config --add svn-remote.svn.tags\
>                          "tags/*/src/a:refs/remotes/tags/*" &&
>         git svn multi-fetch &&
> -       git log --pretty=oneline refs/remotes/tags/end | \
> -           sed -e "s/^.\{41\}//" > output.end &&
> +       git log --pretty=oneline refs/remotes/tags/end >actual &&
> +       sed -e "s/^.\{41\}//" actual > output.end &&

Style: drop space after '>'

>         test_cmp expect.end output.end &&
> @@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
>         git svn fetch two &&
> -       test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
> -       test $(git rev-list refs/remotes/two/branches/v1/start | wc -l) -eq 3 &&
> +       git rev-list refs/remotes/two/tags/end >actual2 &&
> +       test_line_count = 6 actual2 &&
> +       git rev-list refs/remotes/two/branches/v1/start >actual3 &&
> +       test_line_count = 3 actual3 &&

Ditto: name all these files "actual" rather than unnecessarily
inventing unique names

>         test $(git rev-parse refs/remotes/two/branches/v1/start~2) = \
>              $(git rev-parse refs/remotes/two/trunk) &&
>         test $(git rev-parse refs/remotes/two/tags/end~3) = \
>              $(git rev-parse refs/remotes/two/branches/v1/start) &&
> -       git log --pretty=oneline refs/remotes/two/tags/end | \
> -           sed -e "s/^.\{41\}//" > output.two &&
> +       git log --pretty=oneline refs/remotes/two/tags/end >actual4 &&
> +       sed -e "s/^.\{41\}//" actual4 > output.two &&

Style: drop space after '>'

>         test_cmp expect.two output.two
> @@ -120,18 +122,20 @@ test_expect_success 'test another branch' '
>         git config --add svn-remote.four.url "$svnrepo" &&
>         git config --add svn-remote.four.fetch trunk:refs/remotes/four/trunk &&
>         git config --add svn-remote.four.branches \
> -                        "branches/*/*:refs/remotes/four/branches/*/*" &&
> +                        "branches/*/*:refs/remotes/four/branches/*/*" &&
>         git config --add svn-remote.four.tags \
> -                        "tags/*:refs/remotes/four/tags/*" &&
> +                        "tags/*:refs/remotes/four/tags/*" &&

I guess you sneaked in a whitespace change here which is unrelated to
the stated purpose of this patch, thus acted as a speed bump during
review. If this was the only instance in this test script of
whitespace needing correction, then it _might_ be okay to include it
in this patch, however, that's not the case. There are many other such
instance in this test script which could be corrected, so it doesn't
make sense to single out these two and ignore all the others.
Therefore, you should omit this change.

>         git svn fetch four &&
> -       test $(git rev-list refs/remotes/four/tags/next | wc -l) -eq 5 &&
> -       test $(git rev-list refs/remotes/four/branches/v2/start | wc -l) -eq 3 &&
> +       git rev-list refs/remotes/four/tags/next >actual &&
> +       test_line_count = 5 actual &&
> +       git rev-list refs/remotes/four/branches/v2/start >actual2 &&
> +       test_line_count = 3 actual2 &&

Ditto: name all these files "actual" rather than unnecessarily
inventing unique names

>         test $(git rev-parse refs/remotes/four/branches/v2/start~2) = \
>              $(git rev-parse refs/remotes/four/trunk) &&
>         test $(git rev-parse refs/remotes/four/tags/next~2) = \
>              $(git rev-parse refs/remotes/four/branches/v2/start) &&
> -       git log --pretty=oneline refs/remotes/four/tags/next | \
> -           sed -e "s/^.\{41\}//" > output.four &&
> +       git log --pretty=oneline refs/remotes/four/tags/next >actual3 &&
> +       sed -e "s/^.\{41\}//" actual3 > output.four &&

Style: drop space after '>'

>         test_cmp expect.four output.four
> diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
> @@ -21,38 +21,38 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
>  test_expect_success 'verify metadata for /bar' "
> -       git cat-file commit refs/remotes/bar | \
> -          grep '^git-svn-id: $bar_url@12 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~1 | \
> -          grep '^git-svn-id: $bar_url@11 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~2 | \
> -          grep '^git-svn-id: $bar_url@10 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~3 | \
> -          grep '^git-svn-id: $bar_url@9 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~4 | \
> -          grep '^git-svn-id: $bar_url@6 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~5 | \
> -          grep '^git-svn-id: $bar_url@1 $uuid$'
> +       git cat-file commit refs/remotes/bar >actual &&
> +       grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
> +       git cat-file commit refs/remotes/bar~1 >actual1 &&
> +       grep '^git-svn-id: $bar_url@11 $uuid$' actual1 &&
> +       git cat-file commit refs/remotes/bar~2 >actual2 &&
> +       grep '^git-svn-id: $bar_url@10 $uuid$' actual2 &&
> +       git cat-file commit refs/remotes/bar~3 >actual3 &&
> +       grep '^git-svn-id: $bar_url@9 $uuid$' actual3 &&
> +       git cat-file commit refs/remotes/bar~4 >actual4 &&
> +       grep '^git-svn-id: $bar_url@6 $uuid$' actual4 &&
> +       git cat-file commit refs/remotes/bar~5 >actual5 &&
> +       grep '^git-svn-id: $bar_url@1 $uuid$' actual5
>         "

Ditto: name all these files "actual" rather than unnecessarily
inventing unique names

Same comment applies to many more tests below; I won't be repeating it
beyond this point.

> diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
> @@ -102,8 +104,10 @@ test_expect_success !MINGW 'fresh clone with svn.authors-file in config' '
>                 test x"$HOME"/svn-authors = x"$(git config svn.authorsfile)" &&
>                 git svn clone "$svnrepo" gitconfig.clone &&
>                 cd gitconfig.clone &&
> -               nr_ex=$(git log | grep "^Author:.*example.com" | wc -l) &&
> -               nr_rev=$(git rev-list HEAD | wc -l) &&
> +               nr_ex=$(git log >actual &&
> +                           grep "^Author:.*example.com" actual | wc -l) &&
> +               nr_rev=$(git rev-list HEAD >actual &&
> +                            wc -l < actual) &&
>                 test $nr_rev -eq $nr_ex

This transformation is effectively bogus, as explained already in my
review[3] of v1. If git-log or git-rev-list fails, variable nr_ex or
nr_rev will have an empty value, thus 'test' will error out. Move the
git-log and git-rev-list invocations out of the $(...):

    git log >actual &&
    nr_ex=$(grep "..." actual | wc -l) &&
    git rev-list HEAD >actual &&
    nr_rev=$(wc -l <actual) &&
    test $nr_rev -eq $nr_ex

Also, style: drop space after '<'

[3]: https://public-inbox.org/git/CAPig+cRPzyw525ODC4=-E7w=zbpbhVN2eqxSYDSLij5wfW8S_A@mail.gmail.com/

> diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
> @@ -43,20 +43,20 @@ test_expect_success 'fast-export | fast-import' '
>         MUSS=$(git rev-parse --verify muss) &&
>         mkdir new &&
>         git --git-dir=new/.git init &&
> -       git fast-export --all |
> +       git fast-export --all >actual &&
>         (cd new &&
>          git fast-import &&
>          test $MASTER = $(git rev-parse --verify refs/heads/master) &&
>          test $REIN = $(git rev-parse --verify refs/tags/rein) &&
>          test $WER = $(git rev-parse --verify refs/heads/wer) &&
> -        test $MUSS = $(git rev-parse --verify refs/tags/muss))
> +        test $MUSS = $(git rev-parse --verify refs/tags/muss)) < actual

Style: drop space after '<'

>  '
>
>  test_expect_success 'fast-export master~2..master' '
>
> -       git fast-export master~2..master |
> -               sed "s/master/partial/" |
> +       git fast-export master~2..master >actual2 &&
> +       sed "s/master/partial/" actual2 |

Not sure why you named this "actual2" rather than just "actual".

>                 (cd new &&
>                  git fast-import &&
>                  test $MASTER != $(git rev-parse --verify refs/heads/partial) &&
> @@ -74,11 +74,12 @@ test_expect_success 'iso-8859-1' '
>         git commit -s -m den file &&
> -       git fast-export wer^..wer |
> -               sed "s/wer/i18n/" |
> -               (cd new &&
> -                git fast-import &&
> -                git cat-file commit i18n | grep "Áéí óú")
> +       git fast-export wer^..wer >actual3 &&
> +       sed "s/wer/i18n/" actual3 |

Ditto: Why "actual3" rather than "actual"?

> +           (cd new &&
> +               git fast-import &&
> +               git cat-file commit i18n >actual4 &&
> +               grep "Áéí óú" actual4)
> @@ -87,18 +88,18 @@ test_expect_success 'import/export-marks' '
>         git fast-export --export-marks=tmp-marks HEAD &&
>         test -s tmp-marks &&
>         test_line_count = 3 tmp-marks &&
> +       git fast-export --import-marks=tmp-marks\
> +               --export-marks=tmp-marks HEAD >actual &&

Style: not a new problem, but add space before \ since you're touching it

>         test $(
> -               git fast-export --import-marks=tmp-marks\
> -               --export-marks=tmp-marks HEAD |
> -               grep ^commit |
> +               grep ^commit actual |
>                 wc -l) \
>         -eq 0 &&
> @@ -192,7 +193,7 @@ test_expect_success 'submodule fast-export | fast-import' '
>          git checkout master &&
>          git submodule init &&
>          git submodule update &&
> -        cmp sub/file ../sub/file)
> +        cmp sub/file ../sub/file) < actual

Style: drop space after '<'

> @@ -361,18 +362,20 @@ test_expect_failure 'no exact-ref revisions included' '
> -test_expect_success 'path limiting with import-marks does not lose unmodified files'        '
> +test_expect_success 'path limiting with import-marks does not lose unmodified files'       '

It's probably better not to sneak in whitespace changes, especially if
you're not fixing all of them in this script (and this isn't even the
correct fix). Same comment applies below.

> -test_expect_success 'full-tree re-shows unmodified files'        '
> +test_expect_success 'full-tree re-shows unmodified files'       '
> @@ -505,8 +508,8 @@ test_expect_success 'refs are updated even if no commits need to be exported' '
>  test_expect_success 'use refspec' '
> -       git fast-export --refspec refs/heads/master:refs/heads/foobar master | \
> -               grep "^commit " | sort | uniq > actual &&
> +       git fast-export --refspec refs/heads/master:refs/heads/foobar master >actual2 &&
> +       grep "^commit " actual2 | sort | uniq > actual &&

Style: drop space before '>' (and probably the next line too)

>         echo "commit refs/heads/foobar" > expected &&
> @@ -534,7 +537,8 @@ test_expect_success 'when using -C, do not declare copy when source of copy is a
>         test_create_repo dst &&
> -       git -C src fast-export --all -C | git -C dst fast-import &&
> +       git -C src fast-export --all -C > actual &&
> +       git -C dst fast-import < actual &&

Style: drop space before '>' and '<'

>         git -C src show >expected &&
>         git -C dst show >actual &&
>         test_cmp expected actual

^ permalink raw reply	[relevance 0%]

* [GSoC][PATCH] test: avoid pipes in git related commands for test suite
  @ 2018-03-19 17:32  3% ` Pratik Karki
  2018-03-21 11:02  0%   ` Eric Sunshine
  0 siblings, 1 reply; 200+ results
From: Pratik Karki @ 2018-03-19 17:32 UTC (permalink / raw)
  To: git; +Cc: Pratik Karki

Thank you Eric Sunshine,

I have done as you had instructed me. I look forward to more
understanding of the codebase and would love to fix
"git rev-parse" problems in my follow-on patches.
Thank you for the professional review comment.

Sorry for late follow-on patch, I got tied up with my university stuffs.

Please do review this patch as before. I will correct it if needed.

Cheers,
Pratik Karki

Avoid using pipes downstream of Git commands since the exit codes
of commands upstream of pipes get swallowed, thus potentially
hiding failure of those commands. Instead, capture Git command
output to a file apply the downstream command(s) to that file.

Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
---
 t/t5300-pack-object.sh                     | 10 +++---
 t/t5510-fetch.sh                           |  8 ++---
 t/t7001-mv.sh                              | 22 ++++++-------
 t/t7003-filter-branch.sh                   |  9 ++++--
 t/t9104-git-svn-follow-parent.sh           | 16 +++++----
 t/t9108-git-svn-glob.sh                    | 14 ++++----
 t/t9109-git-svn-multi-glob.sh              | 28 +++++++++-------
 t/t9110-git-svn-use-svm-props.sh           | 42 ++++++++++++------------
 t/t9111-git-svn-use-svnsync-props.sh       | 36 ++++++++++-----------
 t/t9114-git-svn-dcommit-merge.sh           | 10 +++---
 t/t9130-git-svn-authors-file.sh            | 28 +++++++++-------
 t/t9138-git-svn-authors-prog.sh            | 31 +++++++++---------
 t/t9153-git-svn-rewrite-uuid.sh            |  8 ++---
 t/t9168-git-svn-partially-globbed-names.sh | 34 +++++++++++--------
 t/t9350-fast-export.sh                     | 52 ++++++++++++++++--------------
 15 files changed, 187 insertions(+), 161 deletions(-)

diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 9c68b9925..91207ae0c 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -311,9 +311,9 @@ test_expect_success 'unpacking with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
-	PACK6=$( (
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$(git pack-objects test-5 < actual) &&
+	PACK6=$((
 			echo "$LIST"
 			echo "$LI"
 			echo "$ST"
@@ -358,8 +358,8 @@ test_expect_success 'index-pack with --strict' '
 	rm -f .git/index &&
 	tail -n 10 LIST | git update-index --index-info &&
 	ST=$(git write-tree) &&
-	PACK5=$( git rev-list --objects "$LIST" "$LI" "$ST" | \
-		git pack-objects test-5 ) &&
+	git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
+	PACK5=$(git pack-objects test-5 < actual) &&
 	PACK6=$( (
 			echo "$LIST"
 			echo "$LI"
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 668c54be4..c7b284138 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -693,8 +693,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch aligned output' '
 	test_commit looooooooooooong-tag &&
 	(
 		cd full-output &&
-		git -c fetch.output=full fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=full fetch origin >actual2 2>&1 &&
+		grep -e "->" actual2 | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master               -> origin/master
@@ -708,8 +708,8 @@ test_expect_success C_LOCALE_OUTPUT 'fetch compact output' '
 	test_commit extraaa &&
 	(
 		cd compact &&
-		git -c fetch.output=compact fetch origin 2>&1 | \
-			grep -e "->" | cut -c 22- >../actual
+		git -c fetch.output=compact fetch origin >actual2 2>&1 &&
+		grep -e "->" actual2 | cut -c 22- >../actual
 	) &&
 	cat >expect <<-\EOF &&
 	master     -> origin/*
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 6e5031f56..00aa9e45b 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -21,8 +21,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path0/COPYING..*path1/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path0/COPYING..*path1/COPYING" actual'
 
 test_expect_success \
     'moving the file back into subdirectory' \
@@ -35,8 +35,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path1/COPYING..*path0/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path1/COPYING..*path0/COPYING" actual'
 
 test_expect_success \
     'checking -k on non-existing file' \
@@ -116,10 +116,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/COPYING..*path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/README..*path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path0/COPYING..*path2/COPYING" actual &&
+     grep "^R100..*path0/README..*path2/README" actual'
 
 test_expect_success \
     'succeed when source is a prefix of destination' \
@@ -135,10 +134,9 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/COPYING..*path1/path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/README..*path1/path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path2/COPYING..*path1/path2/COPYING" actual &&
+     grep "^R100..*path2/README..*path1/path2/README" actual'
 
 test_expect_success \
     'do not move directory over existing directory' \
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 7cb60799b..82c9c2825 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -187,7 +187,8 @@ test_expect_success 'author information is preserved' '
 			test \$GIT_COMMIT != $(git rev-parse master) || \
 			echo Hallo" \
 		preserved-author) &&
-	test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
+	git rev-list --author="B V Uips" preserved-author > actual &&
+	test 1 = $(wc -l < actual)
 '
 
 test_expect_success "remove a certain author's commits" '
@@ -205,7 +206,8 @@ test_expect_success "remove a certain author's commits" '
 	cnt1=$(git rev-list master | wc -l) &&
 	cnt2=$(git rev-list removed-author | wc -l) &&
 	test $cnt1 -eq $(($cnt2 + 1)) &&
-	test 0 = $(git rev-list --author="B V Uips" removed-author | wc -l)
+	git rev-list --author="B V Uips" removed-author >actual &&
+	test 0 = $(wc -l < actual)
 '
 
 test_expect_success 'barf on invalid name' '
@@ -258,7 +260,8 @@ test_expect_success 'Subdirectory filter with disappearing trees' '
 	git commit -m "Re-adding foo" &&
 
 	git filter-branch -f --subdirectory-filter foo &&
-	test $(git rev-list master | wc -l) = 3
+	git rev-list master >actual &&
+	test_line_count = 3 actual
 '
 
 test_expect_success 'Tag name filtering retains tag message' '
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index cd480edf1..a532c49af 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -33,8 +33,8 @@ test_expect_success 'init and fetch a moved directory' '
 	git svn fetch -i thunk &&
 	test "$(git rev-parse --verify refs/remotes/thunk@2)" \
 	   = "$(git rev-parse --verify refs/remotes/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/thunk:readme |\
-		 sed -n -e "3p")" = goodbye &&
+	git cat-file blob refs/remotes/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye &&
 	test -z "$(git config --get svn-remote.svn.fetch \
 		 "^trunk:refs/remotes/thunk@2$")"
 	'
@@ -48,8 +48,8 @@ test_expect_success 'init and fetch from one svn-remote' '
         git svn fetch -i svn/thunk &&
 	test "$(git rev-parse --verify refs/remotes/svn/trunk)" \
 	   = "$(git rev-parse --verify refs/remotes/svn/thunk~1)" &&
-	test "$(git cat-file blob refs/remotes/svn/thunk:readme |\
-		 sed -n -e "3p")" = goodbye
+	git cat-file blob refs/remotes/svn/thunk:readme >actual &&
+	test "$(sed -n -e "3p" actual)" = goodbye
         '
 
 test_expect_success 'follow deleted parent' '
@@ -107,7 +107,8 @@ test_expect_success 'follow deleted directory' '
 	git svn init --minimize-url -i glob "$svnrepo"/glob &&
 	git svn fetch -i glob &&
 	test "$(git cat-file blob refs/remotes/glob:blob/bye)" = hi &&
-	test "$(git ls-tree refs/remotes/glob | wc -l )" -eq 1
+	git ls-tree refs/remotes/glob >actual &&
+	test_line_count = 1 actual
 	'
 
 # ref: r9270 of the Subversion repository: (http://svn.collab.net/repos/svn)
@@ -204,8 +205,9 @@ test_expect_success "follow-parent is atomic" '
 test_expect_success "track multi-parent paths" '
 	svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
 	git svn multi-fetch &&
-	test $(git cat-file commit refs/remotes/glob | \
-	       grep "^parent " | wc -l) -eq 2
+	git cat-file commit refs/remotes/glob >actual &&
+	grep "^parent " actual > actual2 &&
+	test_line_count = 2 actual2
 	'
 
 test_expect_success "multi-fetch continues to work" "
diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh
index a94286c8e..e01f3553f 100755
--- a/t/t9108-git-svn-glob.sh
+++ b/t/t9108-git-svn-glob.sh
@@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
 	git config --add svn-remote.svn.tags\
 	                 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual > output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/start)" &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/start >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/two/branches/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 > output.two &&
 	test_cmp expect.two output.two
 	'
 
diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh
index 8d99e848d..a09fc3e14 100755
--- a/t/t9109-git-svn-multi-glob.sh
+++ b/t/t9109-git-svn-multi-glob.sh
@@ -47,8 +47,8 @@ test_expect_success 'test refspec globbing' '
 	git config --add svn-remote.svn.tags\
 	                 "tags/*/src/a:refs/remotes/tags/*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.end &&
+	git log --pretty=oneline refs/remotes/tags/end >actual &&
+	sed -e "s/^.\{41\}//" actual > output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/end~1)" = \
 		"$(git rev-parse refs/remotes/branches/v1/start)" &&
@@ -75,14 +75,16 @@ test_expect_success 'test left-hand-side only globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/v1/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/end >actual2 &&
+	test_line_count = 6 actual2 &&
+	git rev-list refs/remotes/two/branches/v1/start >actual3 &&
+	test_line_count = 3 actual3 &&
 	test $(git rev-parse refs/remotes/two/branches/v1/start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/v1/start) &&
-	git log --pretty=oneline refs/remotes/two/tags/end | \
-	    sed -e "s/^.\{41\}//" > output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/end >actual4 &&
+	sed -e "s/^.\{41\}//" actual4 > output.two &&
 	test_cmp expect.two output.two
 	'
 cat > expect.four <<EOF
@@ -120,18 +122,20 @@ test_expect_success 'test another branch' '
 	git config --add svn-remote.four.url "$svnrepo" &&
 	git config --add svn-remote.four.fetch trunk:refs/remotes/four/trunk &&
 	git config --add svn-remote.four.branches \
-	                 "branches/*/*:refs/remotes/four/branches/*/*" &&
+			 "branches/*/*:refs/remotes/four/branches/*/*" &&
 	git config --add svn-remote.four.tags \
-	                 "tags/*:refs/remotes/four/tags/*" &&
+			 "tags/*:refs/remotes/four/tags/*" &&
 	git svn fetch four &&
-	test $(git rev-list refs/remotes/four/tags/next | wc -l) -eq 5 &&
-	test $(git rev-list refs/remotes/four/branches/v2/start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/four/tags/next >actual &&
+	test_line_count = 5 actual &&
+	git rev-list refs/remotes/four/branches/v2/start >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/four/branches/v2/start~2) = \
 	     $(git rev-parse refs/remotes/four/trunk) &&
 	test $(git rev-parse refs/remotes/four/tags/next~2) = \
 	     $(git rev-parse refs/remotes/four/branches/v2/start) &&
-	git log --pretty=oneline refs/remotes/four/tags/next | \
-	    sed -e "s/^.\{41\}//" > output.four &&
+	git log --pretty=oneline refs/remotes/four/tags/next >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 > output.four &&
 	test_cmp expect.four output.four
 	'
 
diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
index dde0a3c22..4200b567f 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/t/t9110-git-svn-use-svm-props.sh
@@ -21,38 +21,38 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual1 &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual1 &&
+	git cat-file commit refs/remotes/bar~2 >actual2 &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual2 &&
+	git cat-file commit refs/remotes/bar~3 >actual3 &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual3 &&
+	git cat-file commit refs/remotes/bar~4 >actual4 &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual4 &&
+	git cat-file commit refs/remotes/bar~5 >actual5 &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual5
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual1 &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual1
 	"
 
 test_expect_success 'find commit based on SVN revision number' "
-        git svn find-rev r12 |
-	    grep $(git rev-parse HEAD)
-        "
+	git svn find-rev r12 >actual &&
+	grep $(git rev-parse HEAD) actual
+	"
 
 test_expect_success 'empty rebase' "
 	git svn rebase
diff --git a/t/t9111-git-svn-use-svnsync-props.sh b/t/t9111-git-svn-use-svnsync-props.sh
index 22b6e5ee7..a4225c9f6 100755
--- a/t/t9111-git-svn-use-svnsync-props.sh
+++ b/t/t9111-git-svn-use-svnsync-props.sh
@@ -20,32 +20,32 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual1 &&
+	grep '^git-svn-id: $bar_url@11 $uuid$' actual1 &&
+	git cat-file commit refs/remotes/bar~2 >actual2 &&
+	grep '^git-svn-id: $bar_url@10 $uuid$' actual2 &&
+	git cat-file commit refs/remotes/bar~3 >actual3 &&
+	grep '^git-svn-id: $bar_url@9 $uuid$' actual3 &&
+	git cat-file commit refs/remotes/bar~4 >actual4 &&
+	grep '^git-svn-id: $bar_url@6 $uuid$' actual4 &&
+	git cat-file commit refs/remotes/bar~5 >actual5 &&
+	grep '^git-svn-id: $bar_url@1 $uuid$' actual5
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual1 &&
+	grep '^git-svn-id: $dir_url@1 $uuid$' actual1
 	"
 
 test_done
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index 50bca62de..32317d6bc 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -68,7 +68,8 @@ test_debug 'gitk --all & sleep 1'
 test_expect_success 'verify pre-merge ancestry' "
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'git svn dcommit merges' "
@@ -82,12 +83,13 @@ test_expect_success 'verify post-merge ancestry' "
 	     x\$(git rev-parse --verify refs/remotes/origin/trunk) &&
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual &&
+	grep '^friend$' actual
 	"
 
 test_expect_success 'verify merge commit message' "
-	git rev-list --pretty=raw -1 refs/heads/svn | \
-	  grep \"    Merge branch 'merge' into svn\"
+	git rev-list --pretty=raw -1 refs/heads/svn >actual &&
+	grep \"    Merge branch 'merge' into svn\" actual
 	"
 
 test_done
diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
index 41264818c..a0f10b2d2 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/t/t9130-git-svn-authors-file.sh
@@ -26,11 +26,12 @@ test_expect_success 'start import with incomplete authors file' '
 test_expect_success 'imported 2 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 2 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author BBBBBBB BBBBBBB <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author AAAAAAA AAAAAAA <aa@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 2 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author BBBBBBB BBBBBBB <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual1 &&
+		grep "^author AAAAAAA AAAAAAA <aa@example\.com> " actual1
 	)
 	'
 
@@ -43,11 +44,12 @@ test_expect_success 'continues to import once authors have been added' '
 	(
 		cd x
 		git svn fetch --authors-file=../svn-authors &&
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 4 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author DDDDDDD DDDDDDD <dd@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author CCCCCCC CCCCCCC <cc@example\.com> "
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 4 actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author DDDDDDD DDDDDDD <dd@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual1 &&
+		grep "^author CCCCCCC CCCCCCC <cc@example\.com> " actual1
 	)
 	'
 
@@ -102,8 +104,10 @@ test_expect_success !MINGW 'fresh clone with svn.authors-file in config' '
 		test x"$HOME"/svn-authors = x"$(git config svn.authorsfile)" &&
 		git svn clone "$svnrepo" gitconfig.clone &&
 		cd gitconfig.clone &&
-		nr_ex=$(git log | grep "^Author:.*example.com" | wc -l) &&
-		nr_rev=$(git rev-list HEAD | wc -l) &&
+		nr_ex=$(git log >actual &&
+			    grep "^Author:.*example.com" actual | wc -l) &&
+		nr_rev=$(git rev-list HEAD >actual &&
+			     wc -l < actual) &&
 		test $nr_rev -eq $nr_ex
 	)
 '
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46b..f684f5578 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -37,31 +37,32 @@ test_expect_success 'import authors with prog and file' '
 test_expect_success 'imported 6 revisions successfully' '
 	(
 		cd x
-		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 6
+		git rev-list refs/remotes/git-svn >actual &&
+		test_line_count = 6 actual
 	)
 '
 
 test_expect_success 'authors-prog ran correctly' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author ee-foo <ee-foo@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 | \
-		  grep "^author dd <dd@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 | \
-		  grep "^author cc <cc@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 | \
-		  grep "^author bb <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 | \
-		  grep "^author aa <aa@example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		grep "^author ee-foo <ee-foo@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 >actual2 &&
+		grep "^author dd <dd@sub\.example\.com> " actual2 &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 >actual3 &&
+		grep "^author cc <cc@sub\.example\.com> " actual3 &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 >actual4 &&
+		grep "^author bb <bb@example\.com> " actual4 &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 >actual5 &&
+		grep "^author aa <aa@example\.com> " actual5
 	)
 '
 
 test_expect_success 'authors-file overrode authors-prog' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> " actual
 	)
 '
 
@@ -73,8 +74,8 @@ test_expect_success 'authors-prog handled special characters in username' '
 	(
 		cd x &&
 		git svn --authors-prog=../svn-authors-prog fetch &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn |
-		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " actual &&
 		! test -f evil
 	)
 '
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/t/t9153-git-svn-rewrite-uuid.sh
index 372ef1568..6cd28bb9a 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/t/t9153-git-svn-rewrite-uuid.sh
@@ -16,10 +16,10 @@ test_expect_success 'load svn repo' "
 	"
 
 test_expect_success 'verify uuid' "
-	git cat-file commit refs/remotes/git-svn~0 | \
-	   grep '^git-svn-id: .*@2 $uuid$' &&
-	git cat-file commit refs/remotes/git-svn~1 | \
-	   grep '^git-svn-id: .*@1 $uuid$'
+	git cat-file commit refs/remotes/git-svn~0 >actual &&
+	grep '^git-svn-id: .*@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/git-svn~1 >actual1 &&
+	grep '^git-svn-id: .*@1 $uuid$' actual1
 	"
 
 test_done
diff --git a/t/t9168-git-svn-partially-globbed-names.sh b/t/t9168-git-svn-partially-globbed-names.sh
index 8b22f2272..df6f3a974 100755
--- a/t/t9168-git-svn-partially-globbed-names.sh
+++ b/t/t9168-git-svn-partially-globbed-names.sh
@@ -48,8 +48,8 @@ test_expect_success 'test refspec prefixed globbing' '
 	git config --add svn-remote.svn.tags\
 			 "tags/t_*/src/a:refs/remotes/tags/t_*" &&
 	git svn multi-fetch &&
-	git log --pretty=oneline refs/remotes/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.end &&
+	git log --pretty=oneline refs/remotes/tags/t_end >actual &&
+	sed -e "s/^.\{41\}//" actual >output.end &&
 	test_cmp expect.end output.end &&
 	test "$(git rev-parse refs/remotes/tags/t_end~1)" = \
 		"$(git rev-parse refs/remotes/branches/b_start)" &&
@@ -78,14 +78,16 @@ test_expect_success 'test left-hand-side only prefixed globbing' '
 		svn_cmd commit -m "try to try"
 	) &&
 	git svn fetch two &&
-	test $(git rev-list refs/remotes/two/tags/t_end | wc -l) -eq 6 &&
-	test $(git rev-list refs/remotes/two/branches/b_start | wc -l) -eq 3 &&
+	git rev-list refs/remotes/two/tags/t_end >actual &&
+	test_line_count = 6 actual &&
+	git rev-list refs/remotes/two/branches/b_start >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/two/branches/b_start~2) = \
 	     $(git rev-parse refs/remotes/two/trunk) &&
 	test $(git rev-parse refs/remotes/two/tags/t_end~3) = \
 	     $(git rev-parse refs/remotes/two/branches/b_start) &&
-	git log --pretty=oneline refs/remotes/two/tags/t_end | \
-	    sed -e "s/^.\{41\}//" >output.two &&
+	git log --pretty=oneline refs/remotes/two/tags/t_end >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 >output.two &&
 	test_cmp expect.two output.two
 	'
 
@@ -118,14 +120,16 @@ test_expect_success 'test prefixed globs match just prefix' '
 		svn_cmd up
 	) &&
 	git svn fetch three &&
-	test $(git rev-list refs/remotes/three/branches/b_ | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/three/tags/t_ | wc -l) -eq 3 &&
+	git rev-list refs/remotes/three/branches/b_ >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/three/tags/t_ >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/three/branches/b_~1) = \
 	     $(git rev-parse refs/remotes/three/trunk) &&
 	test $(git rev-parse refs/remotes/three/tags/t_~1) = \
 	     $(git rev-parse refs/remotes/three/branches/b_) &&
-	git log --pretty=oneline refs/remotes/three/tags/t_ | \
-	    sed -e "s/^.\{41\}//" >output.three &&
+	git log --pretty=oneline refs/remotes/three/tags/t_ >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 >output.three &&
 	test_cmp expect.three output.three
 	'
 
@@ -186,14 +190,16 @@ test_expect_success 'test globbing in the middle of the word' '
 		svn_cmd up
 	) &&
 	git svn fetch five &&
-	test $(git rev-list refs/remotes/five/branches/abcde | wc -l) -eq 2 &&
-	test $(git rev-list refs/remotes/five/tags/fghij | wc -l) -eq 3 &&
+	git rev-list refs/remotes/five/branches/abcde >actual &&
+	test_line_count = 2 actual &&
+	git rev-list refs/remotes/five/tags/fghij >actual2 &&
+	test_line_count = 3 actual2 &&
 	test $(git rev-parse refs/remotes/five/branches/abcde~1) = \
 	     $(git rev-parse refs/remotes/five/trunk) &&
 	test $(git rev-parse refs/remotes/five/tags/fghij~1) = \
 	     $(git rev-parse refs/remotes/five/branches/abcde) &&
-	git log --pretty=oneline refs/remotes/five/tags/fghij | \
-	    sed -e "s/^.\{41\}//" >output.five &&
+	git log --pretty=oneline refs/remotes/five/tags/fghij >actual3 &&
+	sed -e "s/^.\{41\}//" actual3 >output.five &&
 	test_cmp expect.five output.five
 	'
 
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 866ddf605..45176742b 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -43,20 +43,20 @@ test_expect_success 'fast-export | fast-import' '
 	MUSS=$(git rev-parse --verify muss) &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --all |
+	git fast-export --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test $MASTER = $(git rev-parse --verify refs/heads/master) &&
 	 test $REIN = $(git rev-parse --verify refs/tags/rein) &&
 	 test $WER = $(git rev-parse --verify refs/heads/wer) &&
-	 test $MUSS = $(git rev-parse --verify refs/tags/muss))
+	 test $MUSS = $(git rev-parse --verify refs/tags/muss)) < actual
 
 '
 
 test_expect_success 'fast-export master~2..master' '
 
-	git fast-export master~2..master |
-		sed "s/master/partial/" |
+	git fast-export master~2..master >actual2 &&
+	sed "s/master/partial/" actual2 |
 		(cd new &&
 		 git fast-import &&
 		 test $MASTER != $(git rev-parse --verify refs/heads/partial) &&
@@ -74,11 +74,12 @@ test_expect_success 'iso-8859-1' '
 	test_tick &&
 	echo rosten >file &&
 	git commit -s -m den file &&
-	git fast-export wer^..wer |
-		sed "s/wer/i18n/" |
-		(cd new &&
-		 git fast-import &&
-		 git cat-file commit i18n | grep "Áéí óú")
+	git fast-export wer^..wer >actual3 &&
+	sed "s/wer/i18n/" actual3 |
+	    (cd new &&
+		git fast-import &&
+		git cat-file commit i18n >actual4 &&
+		grep "Áéí óú" actual4)
 
 '
 test_expect_success 'import/export-marks' '
@@ -87,18 +88,18 @@ test_expect_success 'import/export-marks' '
 	git fast-export --export-marks=tmp-marks HEAD &&
 	test -s tmp-marks &&
 	test_line_count = 3 tmp-marks &&
+	git fast-export --import-marks=tmp-marks\
+		--export-marks=tmp-marks HEAD >actual &&
 	test $(
-		git fast-export --import-marks=tmp-marks\
-		--export-marks=tmp-marks HEAD |
-		grep ^commit |
+		grep ^commit actual |
 		wc -l) \
 	-eq 0 &&
 	echo change > file &&
 	git commit -m "last commit" file &&
+	git fast-export --import-marks=tmp-marks \
+		--export-marks=tmp-marks HEAD >actual2 &&
 	test $(
-		git fast-export --import-marks=tmp-marks \
-		--export-marks=tmp-marks HEAD |
-		grep ^commit\  |
+		grep ^commit\  actual2 |
 		wc -l) \
 	-eq 1 &&
 	test_line_count = 4 tmp-marks
@@ -184,7 +185,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	rm -rf new &&
 	mkdir new &&
 	git --git-dir=new/.git init &&
-	git fast-export --signed-tags=strip --all |
+	git fast-export --signed-tags=strip --all >actual &&
 	(cd new &&
 	 git fast-import &&
 	 test "$SUBENT1" = "$(git ls-tree refs/heads/master^ sub)" &&
@@ -192,7 +193,7 @@ test_expect_success 'submodule fast-export | fast-import' '
 	 git checkout master &&
 	 git submodule init &&
 	 git submodule update &&
-	 cmp sub/file ../sub/file)
+	 cmp sub/file ../sub/file) < actual
 
 '
 
@@ -361,18 +362,20 @@ test_expect_failure 'no exact-ref revisions included' '
 	)
 '
 
-test_expect_success 'path limiting with import-marks does not lose unmodified files'        '
+test_expect_success 'path limiting with import-marks does not lose unmodified files'	    '
 	git checkout -b simple marks~2 &&
 	git fast-export --export-marks=marks simple -- file > /dev/null &&
 	echo more content >> file &&
 	test_tick &&
 	git commit -mnext file &&
-	git fast-export --import-marks=marks simple -- file file0 | grep file0
+	git fast-export --import-marks=marks simple -- file file0 >actual &&
+	grep file0 actual
 '
 
-test_expect_success 'full-tree re-shows unmodified files'        '
+test_expect_success 'full-tree re-shows unmodified files'	 '
 	git checkout -f simple &&
-	test $(git fast-export --full-tree simple | grep -c file0) -eq 3
+	git fast-export --full-tree simple >actual &&
+	test $(grep -c file0 actual) -eq 3
 '
 
 test_expect_success 'set-up a few more tags for tag export tests' '
@@ -505,8 +508,8 @@ test_expect_success 'refs are updated even if no commits need to be exported' '
 '
 
 test_expect_success 'use refspec' '
-	git fast-export --refspec refs/heads/master:refs/heads/foobar master | \
-		grep "^commit " | sort | uniq > actual &&
+	git fast-export --refspec refs/heads/master:refs/heads/foobar master >actual2 &&
+	grep "^commit " actual2 | sort | uniq > actual &&
 	echo "commit refs/heads/foobar" > expected &&
 	test_cmp expected actual
 '
@@ -534,7 +537,8 @@ test_expect_success 'when using -C, do not declare copy when source of copy is a
 	git -C src commit -m 2nd_commit &&
 
 	test_create_repo dst &&
-	git -C src fast-export --all -C | git -C dst fast-import &&
+	git -C src fast-export --all -C > actual &&
+	git -C dst fast-import < actual &&
 	git -C src show >expected &&
 	git -C dst show >actual &&
 	test_cmp expected actual
-- 
2.16.2


^ permalink raw reply related	[relevance 3%]

* [ANNOUNCE] Git v2.17.0-rc0
@ 2018-03-16  0:57  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2018-03-16  0:57 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel, git-packagers

An early preview release Git v2.17.0-rc0 is now available for
testing at the usual places.  It is comprised of 474 non-merge
commits since v2.16.0, contributed by 60 people, 18 of which are
new faces.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.17.0-rc0' tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.16.0 are as follows.
Welcome to the Git development community!

  Adam Borowski, Alban Gruin, Andreas G. Schacker, Bernhard
  M. Wiedemann, Christian Ludwig, Gargi Sharma, Genki Sky,
  Gregory Herrero, Jon Simons, Juan F. Codagnone, Kim Gybels,
  Lucas Werkmeister, Mathias Rav, Motoki Seki, Stefan Moch,
  Stephen R Guglielmo, Tatyana Krasnukha, and Thomas Levesque.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Ævar Arnfjörð Bjarmason, Alexander Shopov, Alex Bennée,
  Ben Peart, Brandon Williams, brian m. carlson, Christian
  Couder, Daniel Knittl-Frank, Derrick Stolee, Elijah Newren,
  Eric Sunshine, Eric Wong, Jason Merrill, Jeff Hostetler, Jeff
  King, Johannes Schindelin, Jonathan Nieder, Jonathan Tan, Junio
  C Hamano, Kaartic Sivaraam, Mårten Kongstad, Martin Ågren,
  Matthieu Moy, Michael Haggerty, Nathan Payre, Nguyễn Thái
  Ngọc Duy, Nicolas Morey-Chaisemartin, Olga Telezhnaya, Patryk
  Obara, Phillip Wood, Prathamesh Chavan, Ramsay Jones, Randall
  S. Becker, Rasmus Villemoes, René Scharfe, Robert P. J. Day,
  Stefan Beller, SZEDER Gábor, Thomas Gummerer, Todd Zullinger,
  Torsten Bögershausen, and Yasushi SHOJI.

----------------------------------------------------------------

Git 2.17 Release Notes (draft)
==============================

Updates since v2.16
-------------------

UI, Workflows & Features

 * "diff" family of commands learned "--find-object=<object-id>" option
   to limit the findings to changes that involve the named object.

 * "git format-patch" learned to give 72-cols to diffstat, which is
   consistent with other line length limits the subcommand uses for
   its output meant for e-mails.

 * The log from "git daemon" can be redirected with a new option; one
   relevant use case is to send the log to standard error (instead of
   syslog) when running it from inetd.

 * "git rebase" learned to take "--allow-empty-message" option.

 * "git am" has learned the "--quit" option, in addition to the
   existing "--abort" option; having the pair mirrors a few other
   commands like "rebase" and "cherry-pick".

 * "git worktree add" learned to run the post-checkout hook, just like
   "git clone" runs it upon the initial checkout.

 * "git tag" learned an explicit "--edit" option that allows the
   message given via "-m" and "-F" to be further edited.

 * "git fetch --prune-tags" may be used as a handy short-hand for
   getting rid of stale tags that are locally held.

 * The new "--show-current-patch" option gives an end-user facing way
   to get the diff being applied when "git rebase" (and "git am")
   stops with a conflict.

 * "git add -p" used to offer "/" (look for a matching hunk) as a
   choice, even there was only one hunk, which has been corrected.
   Also the single-key help is now given only for keys that are
   enabled (e.g. help for '/' won't be shown when there is only one
   hunk).

 * Since Git 1.7.9, "git merge" defaulted to --no-ff (i.e. even when
   the side branch being merged is a descendant of the current commit,
   create a merge commit instead of fast-forwarding) when merging a
   tag object.  This was appropriate default for integrators who pull
   signed tags from their downstream contributors, but caused an
   unnecessary merges when used by downstream contributors who
   habitually "catch up" their topic branches with tagged releases
   from the upstream.  Update "git merge" to default to --no-ff only
   when merging a tag object that does *not* sit at its usual place in
   refs/tags/ hierarchy, and allow fast-forwarding otherwise, to
   mitigate the problem.

 * "git status" can spend a lot of cycles to compute the relation
   between the current branch and its upstream, which can now be
   disabled with "--no-ahead-behind" option.

 * "git diff" and friends learned funcname patterns for Go language
   source files.

 * "git send-email" learned "--reply-to=<address>" option.

 * Funcname pattern used for C# now recognizes "async" keyword.


Performance, Internal Implementation, Development Support etc.

 * More perf tests for threaded grep

 * "perf" test output can be sent to codespeed server.

 * The build procedure for perl/ part has been greatly simplified by
   weaning ourselves off of MakeMaker.

 * In preparation for implementing narrow/partial clone, the machinery
   for checking object connectivity used by gc and fsck has been
   taught that a missing object is OK when it is referenced by a
   packfile specially marked as coming from trusted repository that
   promises to make them available on-demand and lazily.

 * The machinery to clone & fetch, which in turn involves packing and
   unpacking objects, has been told how to omit certain objects using
   the filtering mechanism introduced by another topic.  It now knows
   to mark the resulting pack as a promisor pack to tolerate missing
   objects, laying foundation for "narrow" clones.

 * The first step to getting rid of mru API and using the
   doubly-linked list API directly instead.

 * Retire mru API as it does not give enough abstraction over
   underlying list API to be worth it.

 * Rewrite two more "git submodule" subcommands in C.

 * The tracing machinery learned to report tweaking of environment
   variables as well.

 * Update Coccinelle rules to catch and optimize strbuf_addf(&buf, "%s", str)

 * Prevent "clang-format" from breaking line after function return type.

 * The sequencer infrastructure is shared across "git cherry-pick",
   "git rebase -i", etc., and has always spawned "git commit" when it
   needs to create a commit.  It has been taught to do so internally,
   when able, by reusing the codepath "git commit" itself uses, which
   gives performance boost for a few tens of percents in some sample
   scenarios.

 * Push the submodule version of collision-detecting SHA-1 hash
   implementation a bit harder on builders.

 * Avoid mmapping small files while using packed refs (especially ones
   with zero size, which would cause later munmap() to fail).

 * Conversion from uchar[20] to struct object_id continues.

 * More tests for wildmatch functions.

 * The code to binary search starting from a fan-out table (which is
   how the packfile is indexed with object names) has been refactored
   into a reusable helper.

 * We now avoid using identifiers that clash with C++ keywords.  Even
   though it is not a goal to compile Git with C++ compilers, changes
   like this help use of code analysis tools that targets C++ on our
   codebase.

 * The executable is now built in 'script' phase in Travis CI integration,
   to follow the established practice, rather than during 'before_script'
   phase.  This allows the CI categorize the failures better ('failed'
   is project's fault, 'errored' is build environment's).
   (merge 3c93b82920 sg/travis-build-during-script-phase later to maint).

 * Writing out the index file when the only thing that changed in it
   is the untracked cache information is often wasteful, and this has
   been optimized out.

 * Various pieces of Perl code we have have been cleaned up.


Also contains various documentation updates and code clean-ups.


Fixes since v2.16
-----------------

 * An old regression in "git describe --all $annotated_tag^0" has been
   fixed.

 * "git status" after moving a path in the working tree (hence making
   it appear "removed") and then adding with the -N option (hence
   making that appear "added") detected it as a rename, but did not
   report the  old and new pathnames correctly.

 * "git svn dcommit" did not take into account the fact that a
   svn+ssh:// URL with a username@ (typically used for pushing) refers
   to the same SVN repository without the username@ and failed when
   svn.pushmergeinfo option is set.

 * API clean-up around revision traversal.

 * "git merge -Xours/-Xtheirs" learned to use our/their version when
   resolving a conflicting updates to a symbolic link.

 * "git clone $there $here" is allowed even when here directory exists
   as long as it is an empty directory, but the command incorrectly
   removed it upon a failure of the operation.

 * "git commit --fixup" did not allow "-m<message>" option to be used
   at the same time; allow it to annotate resulting commit with more
   text.

 * When resetting the working tree files recursively, the working tree
   of submodules are now also reset to match.

 * "git stash -- <pathspec>" incorrectly blew away untracked files in
   the directory that matched the pathspec, which has been corrected.

 * Instead of maintaining home-grown email address parsing code, ship
   a copy of reasonably recent Mail::Address to be used as a fallback
   in 'git send-email' when the platform lacks it.
   (merge d60be8acab mm/send-email-fallback-to-local-mail-address later to maint).

 * "git add -p" was taught to ignore local changes to submodules as
   they do not interfere with the partial addition of regular changes
   anyway.

 * Avoid showing a warning message in the middle of a line of "git
   diff" output.
   (merge 4e056c989f nd/diff-flush-before-warning later to maint).

 * The http tracing code, often used to debug connection issues,
   learned to redact potentially sensitive information from its output
   so that it can be more safely sharable.
   (merge 8ba18e6fa4 jt/http-redact-cookies later to maint).

 * Crash fix for a corner case where an error codepath tried to unlock
   what it did not acquire lock on.
   (merge 81fcb698e0 mr/packed-ref-store-fix later to maint).

 * The split-index mode had a few corner case bugs fixed.
   (merge ae59a4e44f tg/split-index-fixes later to maint).

 * Assorted fixes to "git daemon".
   (merge ed15e58efe jk/daemon-fixes later to maint).

 * Completion of "git merge -s<strategy>" (in contrib/) did not work
   well in non-C locale.
   (merge 7cc763aaa3 nd/list-merge-strategy later to maint).

 * Workaround for segfault with more recent versions of SVN.
   (merge 7f6f75e97a ew/svn-branch-segfault-fix later to maint).

 * Plug recently introduced leaks in fsck.
   (merge ba3a08ca0e jt/fsck-code-cleanup later to maint).

 * "git pull --rebase" did not pass verbosity setting down when
   recursing into a submodule.
   (merge a56771a668 sb/pull-rebase-submodule later to maint).

 * The way "git reset --hard" reports the commit the updated HEAD
   points at is made consistent with the way how the commit title is
   generated by the other parts of the system.  This matters when the
   title is spread across physically multiple lines.
   (merge 1cf823fb68 tg/reset-hard-show-head-with-pretty later to maint).

 * Test fixes.
   (merge 63b1a175ee sg/test-i18ngrep later to maint).

 * Some bugs around "untracked cache" feature have been fixed.  This
   will notice corrupt data in the untracked cache left by old and
   buggy code and issue a warning---the index can be fixed by clearing
   the untracked cache from it.
   (merge 0cacebf099 nd/fix-untracked-cache-invalidation later to maint).
   (merge 7bf0be7501 ab/untracked-cache-invalidation-docs later to maint).

 * "git blame HEAD COPYING" in a bare repository failed to run, while
   "git blame HEAD -- COPYING" run just fine.  This has been corrected.

 * "git add" files in the same directory, but spelling the directory
   path in different cases on case insensitive filesystem, corrupted
   the name hash data structure and led to unexpected results.  This
   has been corrected.
   (merge c95525e90d bp/name-hash-dirname-fix later to maint).

 * "git rebase -p" mangled log messages of a merge commit, which is
   now fixed.
   (merge ed5144d7eb js/fix-merge-arg-quoting-in-rebase-p later to maint).

 * Some low level protocol codepath could crash when they get an
   unexpected flush packet, which is now fixed.
   (merge bb1356dc64 js/packet-read-line-check-null later to maint).

 * "git check-ignore" with multiple paths got confused when one is a
   file and the other is a directory, which has been fixed.
   (merge d60771e930 rs/check-ignore-multi later to maint).

 * "git describe $garbage" stopped giving any errors when the garbage
   happens to be a string with 40 hexadecimal letters.
   (merge a8e7a2bf0f sb/describe-blob later to maint).

 * Code to unquote single-quoted string (used in the parser for
   configuration files, etc.) did not diagnose bogus input correctly
   and produced bogus results instead.
   (merge ddbbf8eb25 jk/sq-dequote-on-bogus-input later to maint).

 * Many places in "git apply" knew that "/dev/null" that signals
   "there is no such file on this side of the diff" can be followed by
   whitespace and garbage when parsing a patch, except for one, which
   made an otherwise valid patch (e.g. ones from subversion) rejected.
   (merge e454ad4bec tk/apply-dev-null-verify-name-fix later to maint).

 * We no longer create any *.spec file, so "make clean" should not
   remove it.
   (merge 4321bdcabb tz/do-not-clean-spec-file later to maint).

 * "git push" over http transport did not unquote the push-options
   correctly.
   (merge 90dce21eb0 jk/push-options-via-transport-fix later to maint).

 * "git send-email" learned to complain when the batch-size option is
   not defined when the relogin-delay option is, since these two are
   mutually required.
   (merge 9caa70697b xz/send-email-batch-size later to maint).

 * Y2k20 fix ;-) for our perl scripts.
   (merge a40e06ee33 bw/perl-timegm-timelocal-fix later to maint).

 * Threaded "git grep" has been optimized to avoid allocation in code
   section that is covered under a mutex.
   (merge 38ef24dccf rv/grep-cleanup later to maint).

 * "git subtree" script (in contrib/) scripted around "git log", whose
   output got affected by end-user configuration like log.showsignature
   (merge 8841b5222c sg/subtree-signed-commits later to maint).

 * While finding unique object name abbreviation, the code may
   accidentally have read beyond the end of the array of object names
   in a pack.
   (merge 21abed500c ds/find-unique-abbrev-optim later to maint).

 * Micro optimization in revision traversal code.
   (merge ebbed3ba04 ds/mark-parents-uninteresting-optim later to maint).

 * "git commit" used to run "gc --auto" near the end, which was lost
   when the command was reimplemented in C by mistake.
   (merge 095c741edd ab/gc-auto-in-commit later to maint).

 * Allow running a couple of tests with "sh -x".
   (merge c20bf94abc sg/cvs-tests-with-x later to maint).

 * Other minor doc, test and build updates and code cleanups.
   (merge e2a5a028c7 bw/oidmap-autoinit later to maint).
   (merge ec3b4b06f8 cl/t9001-cleanup later to maint).
   (merge e1b3f3dd38 ks/submodule-doc-updates later to maint).
   (merge fbac558a9b rs/describe-unique-abbrev later to maint).
   (merge 8462ff43e4 tb/crlf-conv-flags later to maint).
   (merge 7d68bb0766 rb/hashmap-h-compilation-fix later to maint).
   (merge 3449847168 cc/sha1-file-name later to maint).
   (merge ad622a256f ds/use-get-be64 later to maint).
   (merge f919ffebed sg/cocci-move-array later to maint).
   (merge 4e801463c7 jc/mailinfo-cleanup-fix later to maint).
   (merge ef5b3a6c5e nd/shared-index-fix later to maint).
   (merge 9f5258cbb8 tz/doc-show-defaults-to-head later to maint).
   (merge b780e4407d jc/worktree-add-short-help later to maint).
   (merge ae239fc8e5 rs/cocci-strbuf-addf-to-addstr later to maint).
   (merge 2e22a85e5c nd/ignore-glob-doc-update later to maint).
   (merge 3738031581 jk/gettext-poison later to maint).
   (merge 54360a1956 rj/sparse-updates later to maint).
   (merge 12e31a6b12 sg/doc-test-must-fail-args later to maint).
   (merge 760f1ad101 bc/doc-interpret-trailers-grammofix later to maint).
   (merge 4ccf461f56 bp/fsmonitor later to maint).
   (merge a6119f82b1 jk/test-hashmap-updates later to maint).
   (merge 5aea9fe6cc rd/typofix later to maint).
   (merge e4e5da2796 sb/status-doc-fix later to maint).
   (merge 7976e901c8 gs/test-unset-xdg-cache-home later to maint).
   (merge d023df1ee6 tg/worktree-create-tracking later to maint).
   (merge 4cbe92fd41 sm/mv-dry-run-update later to maint).
   (merge 75e5e9c3f7 sb/color-h-cleanup later to maint).
   (merge 2708ef4af6 sg/t6300-modernize later to maint).
   (merge d88e92d4e0 bw/doc-submodule-recurse-config-with-clone later to maint).
   (merge f74bbc8dd2 jk/cached-commit-buffer later to maint).
   (merge 1316416903 ms/non-ascii-ticks later to maint).
   (merge 878056005e rs/strbuf-read-file-or-whine later to maint).
   (merge 79f0ba1547 jk/strbuf-read-file-close-error later to maint).
   (merge edfb8ba068 ot/ref-filter-cleanup later to maint).
   (merge 11395a3b4b jc/test-must-be-empty later to maint).
   (merge 768b9d6db7 mk/doc-pretty-fill later to maint).
   (merge 2caa7b8d27 ab/man-sec-list later to maint).

----------------------------------------------------------------

Changes since v2.16.0 are as follows:

Adam Borowski (1):
      hooks/pre-auto-gc-battery: allow gc to run on non-laptops

Alban Gruin (1):
      userdiff: add built-in pattern for golang

Alex Bennée (1):
      send-email: add test for Linux's get_maintainer.pl

Alexander Shopov (1):
      Mark messages for translations

Andreas G. Schacker (1):
      doc/read-tree: remove obsolete remark

Ben Peart (3):
      dir.c: don't flag the index as dirty for changes to the untracked cache
      name-hash: properly fold directory names in adjust_dirname_case()
      fsmonitor: update documentation to remove reference to invalid config settings

Bernhard M. Wiedemann (1):
      perl: call timegm and timelocal with 4-digit year

Brandon Williams (39):
      oidmap: ensure map is initialized
      object_info: change member name from 'typename' to 'type_name'
      object: rename function 'typename' to 'type_name'
      blame: rename 'this' variables
      pack-objects: rename 'this' variables
      rev-parse: rename 'this' variable
      submodule: indicate that 'submodule.recurse' doesn't apply to clone
      diff: rename 'this' variables
      apply: rename 'try' variables
      apply: rename 'new' variables
      checkout: rename 'new' variables
      help: rename 'new' variables
      pack-redundant: rename 'new' variables
      reflog: rename 'new' variables
      remote: rename 'new' variables
      combine-diff: rename 'new' variables
      commit: rename 'new' variables
      diff-lib: rename 'new' variable
      diff: rename 'new' variables
      diffcore-delta: rename 'new' variables
      entry: rename 'new' variables
      http: rename 'new' variables
      imap-send: rename 'new' variables
      line-log: rename 'new' variables
      read-cache: rename 'new' variables
      ref-filter: rename 'new' variables
      remote: rename 'new' variables
      split-index: rename 'new' variables
      submodule: rename 'new' variables
      trailer: rename 'new' variables
      unpack-trees: rename 'new' variables
      init-db: rename 'template' variables
      environment: rename 'template' variables
      diff: rename 'template' variables
      environment: rename 'namespace' variables
      wrapper: rename 'template' variables
      tempfile: rename 'template' variables
      trailer: rename 'template' variables
      replace: rename 'new' variables

Christian Couder (12):
      perf/aggregate: fix checking ENV{GIT_PERF_SUBSECTION}
      perf/aggregate: refactor printing results
      perf/aggregate: implement codespeed JSON output
      perf/run: add conf_opts argument to get_var_from_env_or_config()
      perf/run: learn about perf.codespeedOutput
      perf/run: learn to send output to codespeed server
      perf/run: read GIT_PERF_REPO_NAME from perf.repoName
      sha1_file: remove static strbuf from sha1_file_name()
      sha1_file: improve sha1_file_name() perfs
      perf/aggregate: add --subsection option
      perf/aggregate: add --reponame option
      perf/aggregate: sort JSON fields in output

Christian Ludwig (3):
      t9001: use existing helper in send-email test
      send-email: rename variable for clarity
      send-email: support separate Reply-To address

Daniel Knittl-Frank (1):
      describe: prepend "tags/" when describing tags with embedded name

Derrick Stolee (3):
      packfile: use get_be64() for large offsets
      sha1_name: fix uninitialized memory errors
      revision.c: reduce object database queries

Elijah Newren (3):
      Tighten and correct a few testcases for merging and cherry-picking
      merge-recursive: fix logic ordering issue
      merge-recursive: add explanation for src_entry and dst_entry

Eric Sunshine (5):
      t5601-clone: test case-conflicting files on case-insensitive filesystem
      worktree: add: fix 'post-checkout' not knowing new worktree location
      git-worktree.txt: fix missing ")" typo
      git-worktree.txt: fix indentation of example and text of 'add' command
      t2028: fix minor error and issues in newly-added "worktree move" tests

Eric Wong (2):
      fsck: fix leak when traversing trees
      git-svn: control destruction order to avoid segfault

Gargi Sharma (1):
      mru: Replace mru.[ch] with list.h implementation

Genki Sky (2):
      rebase: add --allow-empty-message option
      test-lib.sh: unset XDG_CACHE_HOME

Gregory Herrero (1):
      rebase -p: fix incorrect commit message when calling `git merge`.

Jason Merrill (1):
      git-svn: fix svn.pushmergeinfo handling of svn+ssh usernames.

Jeff Hostetler (12):
      upload-pack: add object filtering for partial clone
      fetch-pack, index-pack, transport: partial clone
      fetch-pack: add --no-filter
      fetch: support filters
      partial-clone: define partial clone settings in config
      t5616: end-to-end tests for partial clone
      fetch: inherit filter-spec from partial clone
      t5616: test bulk prefetch after partial fetch
      stat_tracking_info: return +1 when branches not equal
      status: add --[no-]ahead-behind to status and commit for V2 format.
      status: update short status to respect --no-ahead-behind
      status: support --no-ahead-behind in long format

Jeff King (34):
      t5600: fix outdated comment about unborn HEAD
      t5600: modernize style
      clone: factor out dir_exists() helper
      clone: do not clean up directories we didn't create
      sq_quote_argv: drop maxlen parameter
      trace: avoid unnecessary quoting
      t5570: use ls-remote instead of clone for interp tests
      t/lib-git-daemon: record daemon log
      daemon: fix off-by-one in logging extended attributes
      daemon: handle NULs in extended attribute string
      t/lib-git-daemon: add network-protocol helpers
      daemon: fix length computation in newline stripping
      t0205: drop redundant test
      git-sh-i18n: check GETTEXT_POISON before USE_GETTEXT_SCHEME
      correct error messages for NULL packet_read_line()
      CodingGuidelines: mention "static" and "extern"
      t0002: simplify error checking
      describe: confirm that blobs actually exist
      test-hashmap: use ALLOC_ARRAY rather than bare malloc
      test-hashmap: check allocation computation for overflow
      test-hashmap: use xsnprintf rather than snprintf
      test-hashmap: use strbuf_getline rather than fgets
      test-hashmap: simplify alloc_test_entry
      test-hashmap: use "unsigned int" for hash storage
      sq_dequote: fix extra consumption of source string
      t5545: factor out http repository setup
      remote-curl: unquote incoming push-options
      commit: drop uses of get_cached_commit_buffer()
      revision: drop --show-all option
      t: send verbose test-helper output to fd 4
      strbuf_read_file(): preserve errno across close() call
      smart-http: document flush after "# service" line
      t3701: add a test for interactive.diffFilter
      add--interactive: detect bogus diffFilter output

Johannes Schindelin (2):
      sequencer: assign only free()able strings to gpg_sign
      apply: demonstrate a problem applying svn diffs

Jon Simons (1):
      always check for NULL return from packet_read_line()

Jonathan Nieder (1):
      perl: treat PERLLIB_EXTRA as an extra path again

Jonathan Tan (20):
      extension.partialclone: introduce partial clone extension
      fsck: introduce partialclone extension
      fsck: support refs pointing to promisor objects
      fsck: support referenced promisor objects
      fsck: support promisor objects as CLI argument
      index-pack: refactor writing of .keep files
      introduce fetch-object: fetch one promisor object
      sha1_file: support lazily fetching missing objects
      rev-list: support termination at promisor objects
      gc: do not repack promisor packfiles
      fetch-pack: test support excluding large blobs
      fetch: refactor calculation of remote list
      clone: partial clone
      unpack-trees: batch fetching of missing blobs
      fetch-pack: restore save_commit_buffer after use
      http: support cookie redaction when tracing
      http: support omitting data from traces
      Docs: split out long-running subprocess handshake
      packfile: remove GIT_DEBUG_LOOKUP log statements
      packfile: refactor hash search with fanout table

Juan F. Codagnone (1):
      mailinfo: avoid segfault when can't open files

Junio C Hamano (18):
      merge: teach -Xours/-Xtheirs to symbolic link merge
      worktree: say that "add" takes an arbitrary commit in short-help
      Start 2.17 cycle
      Git 2.16.1
      First batch after 2.16
      blame: tighten command line parser
      Second batch for 2.17
      Third batch for 2.17
      Git 2.16.2
      merge: allow fast-forward when merging a tracked tag
      Fourth batch for 2.17
      Fifth batch for 2.17
      test_must_be_empty: make sure the file exists, not just empty
      untracked cache: use git_env_bool() not getenv() for customization
      Sixth batch for 2.17
      Seventh batch for 2.17
      Eighth batch for 2.17
      Git 2.17-rc0

Kaartic Sivaraam (2):
      Doc/gitsubmodules: make some changes to improve readability and syntax
      Doc/git-submodule: improve readability and grammar of a sentence

Kim Gybels (1):
      packed_ref_cache: don't use mmap() for small files

Lucas Werkmeister (1):
      daemon: add --log-destination=(stderr|syslog|none)

Martin Ågren (5):
      sequencer: make lockfiles non-static
      sequencer: always roll back lock in `do_recursive_merge()`
      merge-recursive: always roll back lock in `merge_recursive_generic()`
      merge: always roll back lock in `checkout_fast_forward()`
      sequencer: do not roll back lockfile unnecessarily

Mathias Rav (1):
      files_initial_transaction_commit(): only unlock if locked

Matthieu Moy (2):
      send-email: add and use a local copy of Mail::Address
      perl/Git: remove now useless email-address parsing code

Michael Haggerty (5):
      struct snapshot: store `start` rather than `header_len`
      create_snapshot(): use `xmemdupz()` rather than a strbuf
      find_reference_location(): make function safe for empty snapshots
      packed_ref_iterator_begin(): make optimization more general
      load_contents(): don't try to mmap an empty file

Motoki Seki (1):
      Documentation/gitsubmodules.txt: avoid non-ASCII apostrophes

Mårten Kongstad (1):
      docs/pretty-formats: fix typo '% <(<N>)' -> '%<|(<N>)'

Nathan Payre (1):
      send-email: extract email-parsing code into a subroutine

Nguyễn Thái Ngọc Duy (85):
      t2203: test status output with porcelain v2 format
      Use DIFF_DETECT_RENAME for detect_rename assignments
      wt-status.c: coding style fix
      wt-status.c: catch unhandled diff status codes
      wt-status.c: rename rename-related fields in wt_status_change_data
      wt-status.c: handle worktree renames
      trace.c: move strbuf_release() out of print_trace_line()
      add--interactive: ignore submodule changes except HEAD
      read-cache.c: change type of "temp" in write_shared_index()
      read-cache.c: move tempfile creation/cleanup out of write_shared_index
      diff.c: flush stdout before printing rename warnings
      run-command.c: introduce trace_run_command()
      run-command.c: print program 'git' when tracing git_cmd mode
      run-command.c: print env vars in trace_run_command()
      run-command.c: print new cwd in trace_run_command()
      read-cache: don't write index twice if we can't write shared index
      worktree.c: add validate_worktree()
      dir.c: avoid stat() in valid_cached_dir()
      dir.c: fix missing dir invalidation in untracked code
      format-patch: keep cover-letter diffstat wrapped in 72 columns
      completion: fix completing merge strategies on non-C locales
      dir.c: stop ignoring opendir() error in open_cached_dir()
      format-patch: reduce patch diffstat width to 72
      gitignore.txt: elaborate shell glob syntax
      trace: measure where the time is spent in the index-heavy operations
      diff.c: refactor pprint_rename() to use strbuf
      dir.c: ignore paths containing .git when invalidating untracked cache
      parse-options: support --git-completion-helper
      parse-options: add OPT_xxx_F() variants
      parse-options: let OPT__FORCE take optional flags argument
      git-completion.bash: introduce __gitcomp_builtin
      completion: use __gitcomp_builtin in _git_add
      completion: use __gitcomp_builtin in _git_am
      completion: use __gitcomp_builtin in _git_apply
      completion: use __gitcomp_builtin in _git_branch
      completion: use __gitcomp_builtin in _git_checkout
      completion: use __gitcomp_builtin in _git_cherry_pick
      completion: use __gitcomp_builtin in _git_clean
      completion: use __gitcomp_builtin in _git_clone
      completion: use __gitcomp_builtin in _git_commit
      completion: use __gitcomp_builtin in _git_config
      completion: use __gitcomp_builtin in _git_describe
      completion: use __gitcomp_builtin in _git_difftool
      completion: use __gitcomp_builtin in _git_fetch
      completion: use __gitcomp_builtin in _git_fsck
      completion: use __gitcomp_builtin in _git_gc
      completion: use __gitcomp_builtin in _git_grep
      completion: use __gitcomp_builtin in _git_help
      completion: use __gitcomp_builtin in _git_init
      completion: use __gitcomp_builtin in _git_ls_files
      completion: use __gitcomp_builtin in _git_ls_remote
      completion: use __gitcomp_builtin in _git_merge
      completion: use __gitcomp_builtin in _git_merge_base
      completion: use __gitcomp_builtin in _git_mv
      completion: use __gitcomp_builtin in _git_name_rev
      completion: use __gitcomp_builtin in _git_notes
      completion: use __gitcomp_builtin in _git_pull
      completion: use __gitcomp_builtin in _git_push
      completion: use __gitcomp_builtin in _git_remote
      remote: force completing --mirror= instead of --mirror
      completion: use __gitcomp_builtin in _git_replace
      completion: use __gitcomp_builtin in _git_reset
      completion: use __gitcomp_builtin in _git_revert
      completion: use __gitcomp_builtin in _git_rm
      completion: use __gitcomp_builtin in _git_show_branch
      completion: use __gitcomp_builtin in _git_status
      completion: use __gitcomp_builtin in _git_tag
      completion: use __gitcomp_builtin in _git_worktree
      worktree.c: add update_worktree_location()
      worktree move: new command
      worktree move: accept destination as directory
      worktree move: refuse to move worktrees with submodules
      worktree remove: new command
      worktree remove: allow it when $GIT_WORK_TREE is already gone
      am: add --show-current-patch
      rebase: add --show-current-patch
      rebase: introduce and use pseudo-ref REBASE_HEAD
      am: support --quit
      diff: add --compact-summary
      object.h: update flag allocation comment
      object.h: realign object flag allocation comment
      completion: don't set PARSE_OPT_NOCOMPLETE on --rerere-autoupdate
      completion: simplify _git_notes
      completion: complete --{reuse,reedit}-message= for all notes subcmds
      completion: more subcommands in _git_notes()

Nicolas Morey-Chaisemartin (1):
      tag: add --edit option

Olga Telezhnaya (3):
      mru: use double-linked list from list.h
      ref-filter: get rid of duplicate code
      ref-filter: get rid of goto

Patryk Obara (14):
      clang-format: adjust penalty for return type line break
      http-push: improve error log
      sha1_file: convert pretend_sha1_file to object_id
      dir: convert struct sha1_stat to use object_id
      sha1_file: convert hash_sha1_file to object_id
      cache: clear whole hash buffer with oidclr
      match-trees: convert splice_tree to object_id
      commit: convert commit_tree* to object_id
      notes: convert combine_notes_* to object_id
      notes: convert write_notes_tree to object_id
      sha1_file: convert write_sha1_file to object_id
      sha1_file: convert force_object_loose to object_id
      sha1_file: convert write_loose_object to object_id
      sha1_file: rename hash_sha1_file_literally

Phillip Wood (25):
      t3404: check intermediate squash messages
      commit: move empty message checks to libgit
      Add a function to update HEAD after creating a commit
      commit: move post-rewrite code to libgit
      commit: move print_commit_summary() to libgit
      sequencer: simplify adding Signed-off-by: trailer
      sequencer: load commit related config
      sequencer: try to commit without forking 'git commit'
      t3512/t3513: remove KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
      sequencer: improve config handling
      t7505: style fixes
      t7505: add tests for cherry-pick and rebase -i/-p
      sequencer: run 'prepare-commit-msg' hook
      add -p: only display help for active keys
      add -p: only bind search key if there's more than one hunk
      add -p: improve error messages
      add -i: add function to format hunk header
      t3701: indent here documents
      t3701: use test_write_lines and write_script
      t3701: don't hard code sha1 hash values
      t3701: add failing test for pathological context lines
      add -p: adjust offsets of subsequent hunks when one is skipped
      add -p: calculate offset delta for edited patches
      add -p: fix counting when splitting and coalescing
      add -p: don't rely on apply's '--recount' option

Prathamesh Chavan (2):
      submodule: port submodule subcommand 'sync' from shell to C
      submodule: port submodule subcommand 'deinit' from shell to C

Ramsay Jones (3):
      t4151: consolidate multiple calls to test_i18ngrep
      config.mak.uname: remove SPARSE_FLAGS setting for cygwin
      Makefile: suppress a sparse warning for pack-revindex.c

Randall S. Becker (1):
      hashmap.h: remove unused variable

Rasmus Villemoes (2):
      grep: move grep_source_init outside critical section
      grep: simplify grep_oid and grep_file

René Scharfe (15):
      commit: avoid allocation in clear_commit_marks_many()
      commit: use clear_commit_marks_many() in remove_redundant()
      ref-filter: use clear_commit_marks_many() in do_merge_filter()
      object: add clear_commit_marks_all()
      bisect: avoid using the rev_info flag leak_pending
      bundle: avoid using the rev_info flag leak_pending
      checkout: avoid using the rev_info flag leak_pending
      revision: remove the unused flag leak_pending
      commit: remove unused function clear_commit_marks_for_object_array()
      describe: use strbuf_add_unique_abbrev() for adding short hashes
      cocci: use format keyword instead of a literal string
      cocci: simplify check for trivial format strings
      check-ignore: fix mix of directories and other file types
      sequencer: factor out strbuf_read_file_or_whine()
      perf: use GIT_PERF_REPEAT_COUNT=3 by default even without config file

Robert P. J. Day (2):
      t/: correct obvious typo "detahced"
      Correct mispellings of ".gitmodule" to ".gitmodules"

SZEDER Gábor (33):
      travis-ci: build Git during the 'script' phase
      Use MOVE_ARRAY
      travis-ci: use 'set -x' for the commands under 'su' in the 32 bit Linux build
      travis-ci: use 'set -e' in the 32 bit Linux build job
      travis-ci: don't repeat the path of the cache directory
      travis-ci: don't run the test suite as root in the 32 bit Linux build
      travis-ci: don't fail if user already exists on 32 bit Linux build job
      t5541: add 'test_i18ngrep's missing filename parameter
      t5812: add 'test_i18ngrep's missing filename parameter
      t6022: don't run 'git merge' upstream of a pipe
      t4001: don't run 'git status' upstream of a pipe
      t5510: consolidate 'grep' and 'test_i18ngrep' patterns
      t5536: let 'test_i18ngrep' read the file without redirection
      t: move 'test_i18ncmp' and 'test_i18ngrep' to 'test-lib-functions.sh'
      t: validate 'test_i18ngrep's parameters
      t: make 'test_i18ngrep' more informative on failure
      t: document 'test_must_fail ok=<signal-name>'
      t6300-for-each-ref: fix "more than one quoting style" tests
      Makefile: generate Git(3pm) as dependency of the 'doc' and 'man' targets
      t: prevent '-x' tracing from interfering with test helpers' stderr
      t: add means to disable '-x' tracing for individual test scripts
      t1507-rev-parse-upstream: don't check the stderr of a shell function
      t5536: simplify checking of messages output to stderr
      t3030-merge-recursive: don't check the stderr of a subshell
      t5500-fetch-pack: don't check the stderr of a subshell
      t5526: use $TRASH_DIRECTORY to specify the path of GIT_TRACE log file
      t5570-git-daemon: don't check the stderr of a subshell
      t9903-bash-prompt: don't check the stderr of __git_ps1()
      t1510-repo-setup: mark as untraceable with '-x'
      t/README: add a note about don't saving stderr of compound commands
      travis-ci: run tests with '-x' tracing
      t9400-git-cvsserver-server: don't rely on the output of 'test_cmp'
      t9402-git-cvsserver-refs: don't check the stderr of a subshell

Stefan Beller (14):
      diff.h: make pickaxe_opts an unsigned bit field
      diff: migrate diff_flags.pickaxe_ignore_case to a pickaxe_opts bit
      diff: introduce DIFF_PICKAXE_KINDS_MASK
      diffcore: add a pickaxe option to find a specific blob
      diff: properly error out when combining multiple pickaxe options
      diff: use HAS_MULTI_BITS instead of counting bits manually
      t/lib-submodule-update.sh: clarify test
      t/lib-submodule-update.sh: fix test ignoring ignored files in submodules
      unpack-trees: oneway_merge to update submodules
      submodule: submodule_move_head omits old argument in forced case
      builtin/pull: respect verbosity settings in submodules
      send-email: error out when relogin delay is missing
      color.h: document and modernize header
      Documentation/git-status: clarify status table for porcelain mode

Stefan Moch (2):
      t7001: add test case for --dry-run
      mv: remove unneeded 'if (!show_only)'

Stephen R Guglielmo (1):
      subtree: fix add and pull for GPG-signed commits

Tatyana Krasnukha (1):
      apply: handle Subversion diffs with /dev/null gracefully

Thomas Gummerer (5):
      stash: don't delete untracked files that match pathspec
      read-cache: fix reading the shared index for other repos
      split-index: don't write cache tree with null oid entries
      travis: run tests with GIT_TEST_SPLIT_INDEX
      reset --hard: make use of the pretty machinery

Thomas Levesque (1):
      userdiff.c: add C# async keyword in diff pattern

Todd Zullinger (3):
      doc: mention 'git show' defaults to HEAD
      Makefile: remove *.spec from clean target
      Makefile: add NO_PERL_CPAN_FALLBACKS knob

Torsten Bögershausen (1):
      convert_to_git(): safe_crlf/checksafe becomes int conv_flags

Yasushi SHOJI (1):
      bisect: debug: convert struct object to object_id

brian m. carlson (15):
      repository: pre-initialize hash algo pointer
      hash: move SHA-1 macros to hash.h
      hash: create union for hash context allocation
      builtin/index-pack: improve hash function abstraction
      builtin/unpack-objects: switch uses of SHA-1 to the_hash_algo
      sha1_file: switch uses of SHA-1 to the_hash_algo
      fast-import: switch various uses of SHA-1 to the_hash_algo
      pack-check: convert various uses of SHA-1 to abstract forms
      pack-write: switch various SHA-1 values to abstract forms
      read-cache: abstract away uses of SHA-1
      csum-file: rename sha1file to hashfile
      csum-file: abstract uses of SHA-1
      bulk-checkin: abstract SHA-1 usage
      hash: update obsolete reference to SHA1_HEADER
      docs/interpret-trailers: fix agreement error

Ævar Arnfjörð Bjarmason (53):
      Makefile: don't error out under DC_SHA1_EXTERNAL if DC_SHA1_SUBMODULE=auto
      Makefile: under "make dist", include the sha1collisiondetection submodule
      sha1dc_git.h: re-arrange an ifdef chain for a subsequent change
      Makefile: replace perl/Makefile.PL with simple make rules
      commit doc: document that -c, -C, -F and --fixup with -m error
      commit: add support for --fixup <commit> -m"<extra message>"
      perl: avoid *.pmc and fix Error.pm further
      perf: amend the grep tests to test grep.threads
      cat-file doc: document that -e will return some output
      status: add a failing test showing a core.untrackedCache bug
      wildmatch test: indent with tabs, not spaces
      wildmatch test: use more standard shell style
      wildmatch test: don't try to vertically align our output
      wildmatch test: use a paranoia pattern from nul_match()
      wildmatch test: remove dead fnmatch() test code
      wildmatch test: use test_must_fail, not ! for test-wildmatch
      wildmatch test: perform all tests under all wildmatch() modes
      wildmatch test: create & test files on disk in addition to in-memory
      test-lib: add an EXPENSIVE_ON_WINDOWS prerequisite
      wildmatch test: mark test as EXPENSIVE_ON_WINDOWS
      fetch: don't redundantly NULL something calloc() gave us
      fetch: trivially refactor assignment to ref_nr
      fetch: stop accessing "remote" variable indirectly
      remote: add a macro for "refs/tags/*:refs/tags/*"
      fetch tests: refactor in preparation for testing tag pruning
      fetch tests: re-arrange arguments for future readability
      fetch tests: add a tag to be deleted to the pruning tests
      fetch tests: test --prune and refspec interaction
      fetch tests: double quote a variable for interpolation
      fetch tests: expand case/esac for later change
      fetch tests: fetch <url> <spec> as well as fetch [<remote>]
      git fetch doc: add a new section to explain the ins & outs of pruning
      git remote doc: correct dangerous lies about what prune does
      git-fetch & config doc: link to the new PRUNING section
      fetch tests: add scaffolding for the new fetch.pruneTags
      fetch: add a --prune-tags option and fetch.pruneTags config
      fetch: make the --prune-tags work with <url>
      update-index doc: note a fixed bug in the untracked cache
      update-index doc: note the caveat with "could not open..."
      perl: *.pm files should not have the executable bit
      Git.pm: remove redundant "use strict" from sub-package
      Git.pm: add the "use warnings" pragma
      commit: run git gc --auto just before the post-commit hook
      gitweb: hard-depend on the Digest::MD5 5.8 module
      Git.pm: hard-depend on the File::{Temp,Spec} modules
      git-send-email: unconditionally use Net::{SMTP,Domain}
      perl: update our ancient copy of Error.pm
      perl: update our copy of Mail::Address
      perl: move CPAN loader wrappers to another namespace
      perl: generalize the Git::LoadCPAN facility
      perl: move the perl/Git/FromCPAN tree to perl/FromCPAN
      perl Git::LoadCPAN: emit better errors under NO_PERL_CPAN_FALLBACKS
      git manpage: note git-security@googlegroups.com


^ permalink raw reply	[relevance 1%]

* Re: [GSoC] [PATCH] test: avoid pipes in git related commands for test suite
  2018-03-14  7:30  0% ` Eric Sunshine
@ 2018-03-14  9:57  0%   ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2018-03-14  9:57 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: Pratik Karki, Git List


On Wed, Mar 14 2018, Eric Sunshine jotted:

> Thanks for the patch. See comments below...
>
> On Tue, Mar 13, 2018 at 4:19 PM, Pratik Karki <predatoramigo@gmail.com> wrote:
>> This patch removes the necessity of pipes in git related commands for test suite.
>>
>> Exit code of the upstream in a pipe is ignored so, it's use should be avoided. The fix for this is to write the output of the git command to a file and test the exit codes of both the commands being linked by pipe.
>
> Please wrap commit messages to fit in about 72 columns; this one is
> far too wide.
>
> On the Git project, commit messages are written in imperative mood, as
> if telling the codebase to "do something". So, instead of writing
> "This patch removes...", you could word it "Remove..." or "Avoid...".
>
> It's misleading to say that the patch "removes the _necessity_ of
> pipes" since pipes were not used out of necessity; they were probably
> just a convenience and seemed reasonable at the time, but later
> experience has shown that they can be problematic for the reason you
> give in the second paragraph.
>
> Taking these observations into consideration, perhaps you could
> rewrite the commit message something like this:
>
>     Avoid using pipes downstream of Git commands since the exit codes
>     of commands upstream of pipes get swallowed, thus potentially
>     hiding failure of those commands. Instead, capture Git command
>     output to a file apply the downstream command(s) to that file.
>
> More comments below...

Makes sense.

>> Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
>> ---
>> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
>> @@ -116,10 +116,10 @@ test_expect_success \
>>  test_expect_success \
>>      'checking the commit' \
>> -    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
>> -     grep "^R100..*path0/COPYING..*path2/COPYING" &&
>> -     git diff-tree -r -M --name-status  HEAD^ HEAD | \
>> -     grep "^R100..*path0/README..*path2/README"'
>> +    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
>> +     grep "^R100..*path0/COPYING..*path2/COPYING" actual &&
>> +     git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
>> +     grep "^R100..*path0/README..*path2/README" actual'
>
> Although this "mechanical" transformation is technically correct, it
> is nevertheless wasteful. The exact same "git diff-tree ..." command
> is run twice, and both times output is captured to file 'actual',
> which makes the second invocation superfluous. Instead, a better
> transformation would be:
>
>     git diff-tree ... >actual &&
>     grep ... actual &&
>     grep ... actual
>
> The same observation applies to other transformations in this patch.

I think we have to be careful to not be overly picky with rejecting
mechanical transformations that fix bugs on the basis that while we're
at it the test could also be rewritten.

I.e. this bug was there before, maybe we should purely focus on just
replacing the harmful pipe pattern that hides errors in this series and
leave rewriting the actual test logic for a later patch.

>> diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
>> @@ -204,8 +204,8 @@ test_expect_success "follow-parent is atomic" '
>>  test_expect_success "track multi-parent paths" '
>>         svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
>>         git svn multi-fetch &&
>> -       test $(git cat-file commit refs/remotes/glob | \
>> -              grep "^parent " | wc -l) -eq 2
>> +       test $(git cat-file commit refs/remotes/glob >actual &&
>> +              grep "^parent " actual | wc -l) -eq 2
>>         '
>
> This is not a great transformation. If "git cat-file" fails, then
> neither 'grep' nor 'wc' will run, and the result will be as if 'test'
> was called without an argument before "-eq". For example:
>
>     % test $(false >actual && grep "^parent " actual | wc -l) -eq 2
>     test: -eq: unary operator expected
>
> It would be better to run "git cat-file" outside of "test $(...)". For instance:
>
>     git cat-file ... >actual &&
>     test $(grep ... actual | wc -l) -eq 2
>
> Alternately, you could take advantage of the test_line_count() helper function:
>
>     git cat-file ... >actual &&
>     grep ... actual >actual2 &&
>     test_line_count = 2 actual2

In this case though as you rightly point out the rewrite is introducing
a regression, which should definitely be fixed.

^ permalink raw reply	[relevance 0%]

* Re: [GSoC] [PATCH] test: avoid pipes in git related commands for test suite
  2018-03-13 20:19  6% [GSoC] [PATCH] test: avoid pipes in git related commands for test suite Pratik Karki
@ 2018-03-14  7:30  0% ` Eric Sunshine
  2018-03-14  9:57  0%   ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 200+ results
From: Eric Sunshine @ 2018-03-14  7:30 UTC (permalink / raw)
  To: Pratik Karki; +Cc: Git List

Thanks for the patch. See comments below...

On Tue, Mar 13, 2018 at 4:19 PM, Pratik Karki <predatoramigo@gmail.com> wrote:
> This patch removes the necessity of pipes in git related commands for test suite.
>
> Exit code of the upstream in a pipe is ignored so, it's use should be avoided. The fix for this is to write the output of the git command to a file and test the exit codes of both the commands being linked by pipe.

Please wrap commit messages to fit in about 72 columns; this one is
far too wide.

On the Git project, commit messages are written in imperative mood, as
if telling the codebase to "do something". So, instead of writing
"This patch removes...", you could word it "Remove..." or "Avoid...".

It's misleading to say that the patch "removes the _necessity_ of
pipes" since pipes were not used out of necessity; they were probably
just a convenience and seemed reasonable at the time, but later
experience has shown that they can be problematic for the reason you
give in the second paragraph.

Taking these observations into consideration, perhaps you could
rewrite the commit message something like this:

    Avoid using pipes downstream of Git commands since the exit codes
    of commands upstream of pipes get swallowed, thus potentially
    hiding failure of those commands. Instead, capture Git command
    output to a file apply the downstream command(s) to that file.

More comments below...

> Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
> ---
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> @@ -116,10 +116,10 @@ test_expect_success \
>  test_expect_success \
>      'checking the commit' \
> -    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
> -     grep "^R100..*path0/COPYING..*path2/COPYING" &&
> -     git diff-tree -r -M --name-status  HEAD^ HEAD | \
> -     grep "^R100..*path0/README..*path2/README"'
> +    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
> +     grep "^R100..*path0/COPYING..*path2/COPYING" actual &&
> +     git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
> +     grep "^R100..*path0/README..*path2/README" actual'

Although this "mechanical" transformation is technically correct, it
is nevertheless wasteful. The exact same "git diff-tree ..." command
is run twice, and both times output is captured to file 'actual',
which makes the second invocation superfluous. Instead, a better
transformation would be:

    git diff-tree ... >actual &&
    grep ... actual &&
    grep ... actual

The same observation applies to other transformations in this patch.

> diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
> @@ -204,8 +204,8 @@ test_expect_success "follow-parent is atomic" '
>  test_expect_success "track multi-parent paths" '
>         svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
>         git svn multi-fetch &&
> -       test $(git cat-file commit refs/remotes/glob | \
> -              grep "^parent " | wc -l) -eq 2
> +       test $(git cat-file commit refs/remotes/glob >actual &&
> +              grep "^parent " actual | wc -l) -eq 2
>         '

This is not a great transformation. If "git cat-file" fails, then
neither 'grep' nor 'wc' will run, and the result will be as if 'test'
was called without an argument before "-eq". For example:

    % test $(false >actual && grep "^parent " actual | wc -l) -eq 2
    test: -eq: unary operator expected

It would be better to run "git cat-file" outside of "test $(...)". For instance:

    git cat-file ... >actual &&
    test $(grep ... actual | wc -l) -eq 2

Alternately, you could take advantage of the test_line_count() helper function:

    git cat-file ... >actual &&
    grep ... actual >actual2 &&
    test_line_count = 2 actual2

> diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
> @@ -21,32 +21,32 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
>  test_expect_success 'verify metadata for /bar' "
> -       git cat-file commit refs/remotes/bar | \
> -          grep '^git-svn-id: $bar_url@12 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~1 | \
> -          grep '^git-svn-id: $bar_url@11 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~2 | \
> -          grep '^git-svn-id: $bar_url@10 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~3 | \
> -          grep '^git-svn-id: $bar_url@9 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~4 | \
> -          grep '^git-svn-id: $bar_url@6 $uuid$' &&
> -       git cat-file commit refs/remotes/bar~5 | \
> -          grep '^git-svn-id: $bar_url@1 $uuid$'
> +       git cat-file commit refs/remotes/bar >actual &&
> +          grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
> +       git cat-file commit refs/remotes/bar~1 >actual &&
> +          grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
> +       git cat-file commit refs/remotes/bar~2 >actual &&
> +          grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
> +       git cat-file commit refs/remotes/bar~3 >actual &&
> +          grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
> +       git cat-file commit refs/remotes/bar~4 >actual &&
> +          grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
> +       git cat-file commit refs/remotes/bar~5 >actual &&
> +          grep '^git-svn-id: $bar_url@1 $uuid$' actual
>         "

An indented line in the original shows that it is a continuation of
the preceding line. However, in the revised code, that is not so, thus
it probably makes sense to drop the indentation.

The same comment applies to several additional cases snipped from this reply.

> diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
> index 50bca62de..c945c3758 100755
> --- a/t/t9114-git-svn-dcommit-merge.sh
> +++ b/t/t9114-git-svn-dcommit-merge.sh
> @@ -68,7 +68,7 @@ test_debug 'gitk --all & sleep 1'
>  test_expect_success 'verify pre-merge ancestry' "
>         test x\$(git rev-parse --verify refs/heads/svn^2) = \
>              x\$(git rev-parse --verify refs/heads/merge) &&
> -       git cat-file commit refs/heads/svn^ | grep '^friend$'
> +       git cat-file commit refs/heads/svn^ >actual && grep '^friend$' actual
>         "

Style: split the line at the '&&'...

    git cat-file ... >actual &&
    grep ... actual

The same comment applies to another test snipped from this reply.

Aside: The current patch wants to solve the problem of exit code being
swallowed down pipes, however, this and other tests are afflicted by a
similar problem with $(...) also swallowing the exit code. A failure
of "git rev-parse" could potentially go unnoticed inside "test
x$(...)". Fixing that is outside the scope of the current patch,
however, a follow-on patch to fix that problem (if you feel so
inclined) might transform it something like this:

    git rev-parse ... >rev1 &&
    git rev-parse ... >rev2 &&
    test_cmp rev1 rev2 &&

^ permalink raw reply	[relevance 0%]

* [GSoC] [PATCH] test: avoid pipes in git related commands for test suite
@ 2018-03-13 20:19  6% Pratik Karki
  2018-03-14  7:30  0% ` Eric Sunshine
  0 siblings, 1 reply; 200+ results
From: Pratik Karki @ 2018-03-13 20:19 UTC (permalink / raw)
  To: git; +Cc: Pratik Karki

This patch removes the necessity of pipes in git related commands for test suite.

Exit code of the upstream in a pipe is ignored so, it's use should be avoided. The fix for this is to write the output of the git command to a file and test the exit codes of both the commands being linked by pipe.

Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
---
 t/t7001-mv.sh                        | 24 ++++++++++++------------
 t/t9104-git-svn-follow-parent.sh     |  4 ++--
 t/t9110-git-svn-use-svm-props.sh     | 36 ++++++++++++++++++------------------
 t/t9111-git-svn-use-svnsync-props.sh | 36 ++++++++++++++++++------------------
 t/t9114-git-svn-dcommit-merge.sh     |  8 ++++----
 t/t9130-git-svn-authors-file.sh      | 16 ++++++++--------
 t/t9138-git-svn-authors-prog.sh      | 28 ++++++++++++++--------------
 t/t9153-git-svn-rewrite-uuid.sh      |  8 ++++----
 8 files changed, 80 insertions(+), 80 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 6e5031f56..0dcf1fa3e 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -21,8 +21,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path0/COPYING..*path1/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path0/COPYING..*path1/COPYING" actual'
 
 test_expect_success \
     'moving the file back into subdirectory' \
@@ -35,8 +35,8 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-    grep "^R100..*path1/COPYING..*path0/COPYING"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+    grep "^R100..*path1/COPYING..*path0/COPYING" actual'
 
 test_expect_success \
     'checking -k on non-existing file' \
@@ -116,10 +116,10 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/COPYING..*path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path0/README..*path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path0/COPYING..*path2/COPYING" actual &&
+     git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path0/README..*path2/README" actual'
 
 test_expect_success \
     'succeed when source is a prefix of destination' \
@@ -135,10 +135,10 @@ test_expect_success \
 
 test_expect_success \
     'checking the commit' \
-    'git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/COPYING..*path1/path2/COPYING" &&
-     git diff-tree -r -M --name-status  HEAD^ HEAD | \
-     grep "^R100..*path2/README..*path1/path2/README"'
+    'git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path2/COPYING..*path1/path2/COPYING" actual &&
+     git diff-tree -r -M --name-status  HEAD^ HEAD >actual &&
+     grep "^R100..*path2/README..*path1/path2/README" actual'
 
 test_expect_success \
     'do not move directory over existing directory' \
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index cd480edf1..284d1224e 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -204,8 +204,8 @@ test_expect_success "follow-parent is atomic" '
 test_expect_success "track multi-parent paths" '
 	svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob &&
 	git svn multi-fetch &&
-	test $(git cat-file commit refs/remotes/glob | \
-	       grep "^parent " | wc -l) -eq 2
+	test $(git cat-file commit refs/remotes/glob >actual &&
+	       grep "^parent " actual | wc -l) -eq 2
 	'
 
 test_expect_success "multi-fetch continues to work" "
diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
index dde0a3c22..a1a00c298 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/t/t9110-git-svn-use-svm-props.sh
@@ -21,32 +21,32 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	   grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual &&
+	   grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~2 >actual &&
+	   grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~3 >actual &&
+	   grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~4 >actual &&
+	   grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~5 >actual &&
+	   grep '^git-svn-id: $bar_url@1 $uuid$' actual
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	   grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	   grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual &&
+	   grep '^git-svn-id: $dir_url@1 $uuid$' actual
 	"
 
 test_expect_success 'find commit based on SVN revision number' "
diff --git a/t/t9111-git-svn-use-svnsync-props.sh b/t/t9111-git-svn-use-svnsync-props.sh
index 22b6e5ee7..5306a87f3 100755
--- a/t/t9111-git-svn-use-svnsync-props.sh
+++ b/t/t9111-git-svn-use-svnsync-props.sh
@@ -20,32 +20,32 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
-	git cat-file commit refs/remotes/bar | \
-	   grep '^git-svn-id: $bar_url@12 $uuid$' &&
-	git cat-file commit refs/remotes/bar~1 | \
-	   grep '^git-svn-id: $bar_url@11 $uuid$' &&
-	git cat-file commit refs/remotes/bar~2 | \
-	   grep '^git-svn-id: $bar_url@10 $uuid$' &&
-	git cat-file commit refs/remotes/bar~3 | \
-	   grep '^git-svn-id: $bar_url@9 $uuid$' &&
-	git cat-file commit refs/remotes/bar~4 | \
-	   grep '^git-svn-id: $bar_url@6 $uuid$' &&
-	git cat-file commit refs/remotes/bar~5 | \
-	   grep '^git-svn-id: $bar_url@1 $uuid$'
+	git cat-file commit refs/remotes/bar >actual &&
+	   grep '^git-svn-id: $bar_url@12 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~1 >actual &&
+	   grep '^git-svn-id: $bar_url@11 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~2 >actual &&
+	   grep '^git-svn-id: $bar_url@10 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~3 >actual &&
+	   grep '^git-svn-id: $bar_url@9 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~4 >actual &&
+	   grep '^git-svn-id: $bar_url@6 $uuid$' actual &&
+	git cat-file commit refs/remotes/bar~5 >actual &&
+	   grep '^git-svn-id: $bar_url@1 $uuid$' actual
 	"
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
-	git cat-file commit refs/remotes/e | \
-	   grep '^git-svn-id: $e_url@1 $uuid$'
+	git cat-file commit refs/remotes/e >actual &&
+	   grep '^git-svn-id: $e_url@1 $uuid$' actual
 	"
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
-	git cat-file commit refs/remotes/dir | \
-	   grep '^git-svn-id: $dir_url@2 $uuid$' &&
-	git cat-file commit refs/remotes/dir~1 | \
-	   grep '^git-svn-id: $dir_url@1 $uuid$'
+	git cat-file commit refs/remotes/dir >actual &&
+	   grep '^git-svn-id: $dir_url@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/dir~1 >actual &&
+	   grep '^git-svn-id: $dir_url@1 $uuid$' actual
 	"
 
 test_done
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index 50bca62de..c945c3758 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -68,7 +68,7 @@ test_debug 'gitk --all & sleep 1'
 test_expect_success 'verify pre-merge ancestry' "
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual && grep '^friend$' actual
 	"
 
 test_expect_success 'git svn dcommit merges' "
@@ -82,12 +82,12 @@ test_expect_success 'verify post-merge ancestry' "
 	     x\$(git rev-parse --verify refs/remotes/origin/trunk) &&
 	test x\$(git rev-parse --verify refs/heads/svn^2) = \
 	     x\$(git rev-parse --verify refs/heads/merge) &&
-	git cat-file commit refs/heads/svn^ | grep '^friend$'
+	git cat-file commit refs/heads/svn^ >actual && grep '^friend$' actual
 	"
 
 test_expect_success 'verify merge commit message' "
-	git rev-list --pretty=raw -1 refs/heads/svn | \
-	  grep \"    Merge branch 'merge' into svn\"
+	git rev-list --pretty=raw -1 refs/heads/svn >actual &&
+	  grep \"    Merge branch 'merge' into svn\" actual
 	"
 
 test_done
diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
index 41264818c..e12f8cf3b 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/t/t9130-git-svn-authors-file.sh
@@ -27,10 +27,10 @@ test_expect_success 'imported 2 revisions successfully' '
 	(
 		cd x
 		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 2 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author BBBBBBB BBBBBBB <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author AAAAAAA AAAAAAA <aa@example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		  grep "^author BBBBBBB BBBBBBB <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		  grep "^author AAAAAAA AAAAAAA <aa@example\.com> " actual
 	)
 	'
 
@@ -44,10 +44,10 @@ test_expect_success 'continues to import once authors have been added' '
 		cd x
 		git svn fetch --authors-file=../svn-authors &&
 		test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 4 &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author DDDDDDD DDDDDDD <dd@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author CCCCCCC CCCCCCC <cc@example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		  grep "^author DDDDDDD DDDDDDD <dd@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		  grep "^author CCCCCCC CCCCCCC <cc@example\.com> " actual
 	)
 	'
 
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46b..5b04c2b40 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -44,24 +44,24 @@ test_expect_success 'imported 6 revisions successfully' '
 test_expect_success 'authors-prog ran correctly' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \
-		  grep "^author ee-foo <ee-foo@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 | \
-		  grep "^author dd <dd@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 | \
-		  grep "^author cc <cc@sub\.example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 | \
-		  grep "^author bb <bb@example\.com> " &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 | \
-		  grep "^author aa <aa@example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~1 >actual &&
+		  grep "^author ee-foo <ee-foo@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~2 >actual &&
+		  grep "^author dd <dd@sub\.example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~3 >actual &&
+		  grep "^author cc <cc@sub\.example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~4 >actual &&
+		  grep "^author bb <bb@example\.com> " actual &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 >actual &&
+		  grep "^author aa <aa@example\.com> " actual
 	)
 '
 
 test_expect_success 'authors-file overrode authors-prog' '
 	(
 		cd x
-		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
-		  grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> "
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		  grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> " actual
 	)
 '
 
@@ -73,8 +73,8 @@ test_expect_success 'authors-prog handled special characters in username' '
 	(
 		cd x &&
 		git svn --authors-prog=../svn-authors-prog fetch &&
-		git rev-list -1 --pretty=raw refs/remotes/git-svn |
-		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " &&
+		git rev-list -1 --pretty=raw refs/remotes/git-svn >actual &&
+		grep "^author xyz; touch evil <xyz; touch evil@example\.com> " actual &&
 		! test -f evil
 	)
 '
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/t/t9153-git-svn-rewrite-uuid.sh
index 372ef1568..3b00a9135 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/t/t9153-git-svn-rewrite-uuid.sh
@@ -16,10 +16,10 @@ test_expect_success 'load svn repo' "
 	"
 
 test_expect_success 'verify uuid' "
-	git cat-file commit refs/remotes/git-svn~0 | \
-	   grep '^git-svn-id: .*@2 $uuid$' &&
-	git cat-file commit refs/remotes/git-svn~1 | \
-	   grep '^git-svn-id: .*@1 $uuid$'
+	git cat-file commit refs/remotes/git-svn~0 >actual &&
+	   grep '^git-svn-id: .*@2 $uuid$' actual &&
+	git cat-file commit refs/remotes/git-svn~1 >actual &&
+	   grep '^git-svn-id: .*@1 $uuid$' actual
 	"
 
 test_done
-- 
2.16.2


^ permalink raw reply related	[relevance 6%]

* What's cooking in git.git (Mar 2018, #02; Tue, 6)
@ 2018-03-06 23:34  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2018-03-06 23:34 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

I haven't seen enough reviews (nor I had chance to sufficiently
review them myself) to comfortably decide what to do with them on a
handful of new topics that appeared in the past week or two, so the
ones in the new topics section may not have any description yet in
this issue.

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* ab/fetch-prune (2018-02-09) 17 commits
  (merged to 'next' on 2018-02-27 at eafb648dd9)
 + fetch: make the --prune-tags work with <url>
 + fetch: add a --prune-tags option and fetch.pruneTags config
 + fetch tests: add scaffolding for the new fetch.pruneTags
 + git-fetch & config doc: link to the new PRUNING section
 + git remote doc: correct dangerous lies about what prune does
 + git fetch doc: add a new section to explain the ins & outs of pruning
 + fetch tests: fetch <url> <spec> as well as fetch [<remote>]
 + fetch tests: expand case/esac for later change
 + fetch tests: double quote a variable for interpolation
 + fetch tests: test --prune and refspec interaction
 + fetch tests: add a tag to be deleted to the pruning tests
 + fetch tests: re-arrange arguments for future readability
 + fetch tests: refactor in preparation for testing tag pruning
 + remote: add a macro for "refs/tags/*:refs/tags/*"
 + fetch: stop accessing "remote" variable indirectly
 + fetch: trivially refactor assignment to ref_nr
 + fetch: don't redundantly NULL something calloc() gave us

 "git fetch --prune-tags" may be used as a handy short-hand for
 getting rid of stale tags that are locally held.


* ab/simplify-perl-makefile (2018-02-15) 1 commit
  (merged to 'next' on 2018-02-27 at b0d68a2013)
 + Makefile: generate Git(3pm) as dependency of the 'doc' and 'man' targets

 Hotfix for a topic already in 'master'.


* bw/c-plus-plus (2018-02-22) 37 commits
  (merged to 'next' on 2018-02-27 at daf85c03de)
 + replace: rename 'new' variables
 + trailer: rename 'template' variables
 + tempfile: rename 'template' variables
 + wrapper: rename 'template' variables
 + environment: rename 'namespace' variables
 + diff: rename 'template' variables
 + environment: rename 'template' variables
 + init-db: rename 'template' variables
 + unpack-trees: rename 'new' variables
 + trailer: rename 'new' variables
 + submodule: rename 'new' variables
 + split-index: rename 'new' variables
 + remote: rename 'new' variables
 + ref-filter: rename 'new' variables
 + read-cache: rename 'new' variables
 + line-log: rename 'new' variables
 + imap-send: rename 'new' variables
 + http: rename 'new' variables
 + entry: rename 'new' variables
 + diffcore-delta: rename 'new' variables
 + diff: rename 'new' variables
 + diff-lib: rename 'new' variable
 + commit: rename 'new' variables
 + combine-diff: rename 'new' variables
 + remote: rename 'new' variables
 + reflog: rename 'new' variables
 + pack-redundant: rename 'new' variables
 + help: rename 'new' variables
 + checkout: rename 'new' variables
 + apply: rename 'new' variables
 + apply: rename 'try' variables
 + diff: rename 'this' variables
 + rev-parse: rename 'this' variable
 + pack-objects: rename 'this' variables
 + blame: rename 'this' variables
 + object: rename function 'typename' to 'type_name'
 + object_info: change member name from 'typename' to 'type_name'

 We now avoid using identifiers that clash with C++ keywords.  Even though
 it is not a goal to compile Git with C++ compilers, changes like
 this help use of code analysis tools that targets C++ on our
 codebase.


* bw/doc-submodule-recurse-config-with-clone (2018-02-21) 1 commit
  (merged to 'next' on 2018-02-27 at 5b12841508)
 + submodule: indicate that 'submodule.recurse' doesn't apply to clone

 Doc update.


* bw/perl-timegm-timelocal-fix (2018-02-23) 1 commit
  (merged to 'next' on 2018-02-27 at 565a3141ce)
 + perl: call timegm and timelocal with 4-digit year

 Y2k20 fix ;-) for our perl scripts.


* jc/allow-ff-merging-kept-tags (2018-02-16) 1 commit
  (merged to 'next' on 2018-02-27 at 8b03610d2b)
 + merge: allow fast-forward when merging a tracked tag

 Since Git 1.7.9, "git merge" defaulted to --no-ff (i.e. even when
 the side branch being merged is a descendant of the current commit,
 create a merge commit instead of fast-forwarding) when merging a
 tag object.  This was appropriate default for integrators who pull
 signed tags from their downstream contributors, but caused an
 unnecessary merges when used by downstream contributors who
 habitually "catch up" their topic branches with tagged releases
 from the upstream.  Update "git merge" to default to --no-ff only
 when merging a tag object that does *not* sit at its usual place in
 refs/tags/ hierarchy, and allow fast-forwarding otherwise, to
 mitigate the problem.


* jk/cached-commit-buffer (2018-02-22) 2 commits
  (merged to 'next' on 2018-02-27 at af791d9a1e)
 + revision: drop --show-all option
 + commit: drop uses of get_cached_commit_buffer()

 Code clean-up.


* jk/strbuf-read-file-close-error (2018-02-23) 1 commit
  (merged to 'next' on 2018-02-27 at c5dfe33335)
 + strbuf_read_file(): preserve errno across close() call

 Code clean-up.


* jk/test-helper-v-output-fix (2018-02-22) 1 commit
  (merged to 'next' on 2018-02-27 at c9109977e8)
 + t: send verbose test-helper output to fd 4

 Test framework update.


* ms/non-ascii-ticks (2018-02-22) 1 commit
  (merged to 'next' on 2018-02-27 at 41159fc4f0)
 + Documentation/gitsubmodules.txt: avoid non-ASCII apostrophes

 Doc markup fix.


* nd/rebase-show-current-patch (2018-02-12) 3 commits
  (merged to 'next' on 2018-02-27 at 5a4e23a77c)
 + rebase: introduce and use pseudo-ref REBASE_HEAD
 + rebase: add --show-current-patch
 + am: add --show-current-patch

 The new "--show-current-patch" option gives an end-user facing way
 to get the diff being applied when "git rebase" (and "git am")
 stops with a conflict.


* nm/tag-edit (2018-02-07) 1 commit
  (merged to 'next' on 2018-02-27 at 3bc8345213)
 + tag: add --edit option

 "git tag" learned an explicit "--edit" option that allows the
 message given via "-m" and "-F" to be further edited.


* pw/add-p-single (2018-02-13) 3 commits
  (merged to 'next' on 2018-02-27 at 0e2bd585e3)
 + add -p: improve error messages
 + add -p: only bind search key if there's more than one hunk
 + add -p: only display help for active keys

 "git add -p" used to offer "/" (look for a matching hunk) as a
 choice, even there was only one hunk, which has been corrected.
 Also the single-key help is now given only for keys that are
 enabled (e.g. help for '/' won't be shown when there is only one
 hunk).


* rs/strbuf-read-file-or-whine (2018-02-22) 1 commit
  (merged to 'next' on 2018-02-27 at 56017cb5e2)
 + sequencer: factor out strbuf_read_file_or_whine()

 Code clean-up.


* sb/color-h-cleanup (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-27 at 617345de77)
 + color.h: document and modernize header
 (this branch is used by sb/blame-color.)

 Devdoc update.


* sg/t6300-modernize (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-27 at b6f13b6915)
 + t6300-for-each-ref: fix "more than one quoting style" tests

 Test update.


* sm/mv-dry-run-update (2018-02-07) 2 commits
  (merged to 'next' on 2018-02-27 at 17eef62ddf)
 + mv: remove unneeded 'if (!show_only)'
 + t7001: add test case for --dry-run

 Code clean-up.


* xz/send-email-batch-size (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-27 at da0247d532)
 + send-email: error out when relogin delay is missing

 "git send-email" learned to complain when the batch-size option is
 not defined when the relogin-delay option is, since these two are
 mutually required.

--------------------------------------------------
[New Topics]

* bb/git-gui-ssh-key-files (2018-03-02) 2 commits
 - Merge branch 'bb/ssh-key-files' of git-gui into bb/git-gui-ssh-key-files
 - git-gui: search for all current SSH key types


* bp/git-gui-bind-kp-enter (2018-03-02) 2 commits
 - Merge branch 'bp/bind-kp-enter' of git-gui into bp/git-gui-bind-kp-enter
 - git-gui: bind CTRL/CMD+numpad ENTER to do_commit


* cb/git-gui-ttk-style (2018-03-05) 2 commits
 - Merge branch 'cb/ttk-style' of git-gui into cb/git-gui-ttk-style
 - git-gui: workaround ttk:style theme use


* dp/git-el-ls-files-excludes (2018-03-05) 1 commit
 - git.el: handle default excludesfile properly


* jk/add-i-diff-filter (2018-03-05) 2 commits
 - add--interactive: detect bogus diffFilter output
 - t3701: add a test for interactive.diffFilter


* jk/smart-http-protocol-doc-fix (2018-03-05) 1 commit
 - smart-http: document flush after "# service" line


* nd/object-allocation-comments (2018-03-06) 2 commits
 - object.h: realign object flag allocation comment
 - object.h: update flag allocation comment


* nd/pack-objects-pack-struct (2018-03-05) 9 commits
 - pack-objects: reorder 'hash' to pack struct object_entry
 - pack-objects: refer to delta objects by index instead of pointer
 - pack-objects: move in_pack out of struct object_entry
 - pack-objects: move in_pack_pos out of struct object_entry
 - pack-objects: note about in_pack_header_size
 - pack-objects: use bitfield for object_entry::depth
 - pack-objects: use bitfield for object_entry::dfs_state
 - pack-objects: turn type and in_pack_type to bitfields
 - pack-objects: document holes in struct object_entry.h


* nd/repack-keep-pack (2018-03-06) 5 commits
 - pack-objects: display progress in get_object_details()
 - pack-objects: show some progress when counting kept objects
 - gc --auto: exclude base pack if not enough mem to "repack -ad"
 - repack: add --keep-pack option
 - t7700: have closing quote of a test at the beginning of line


* nd/worktree-prune (2018-03-06) 3 commits
 - worktree prune: improve prune logic when worktree is moved
 - worktree: delete dead code
 - gc.txt: more details about what gc does


* pw/add-p-select (2018-03-06) 3 commits
 - add -p: optimize line selection for short hunks
 - add -p: allow line selection to be inverted
 - add -p: select individual hunk lines
 (this branch uses pw/add-p-recount.)

--------------------------------------------------
[Stalled]

* sb/blame-color (2018-02-13) 3 commits
 - builtin/blame: highlight recently changed lines
 - builtin/blame: add option to color metadata fields separately
 - builtin/blame: dim uninteresting metadata

 Expecting a reroll.
 cf. https://public-inbox.org/git/20171110011002.10179-1-sbeller@google.com/#t
 error messages are funny, can segfault, ...


* av/fsmonitor-updates (2018-01-04) 6 commits
 - fsmonitor: use fsmonitor data in `git diff`
 - fsmonitor: remove debugging lines from t/t7519-status-fsmonitor.sh
 - fsmonitor: make output of test-dump-fsmonitor more concise
 - fsmonitor: update helper tool, now that flags are filled later
 - fsmonitor: stop inline'ing mark_fsmonitor_valid / _invalid
 - dir.c: update comments to match argument name

 Code clean-up on fsmonitor integration, plus optional utilization
 of the fsmonitor data in diff-files.

 Waiting for an update.
 cf. <alpine.DEB.2.21.1.1801042335130.32@MININT-6BKU6QN.europe.corp.microsoft.com>


* pb/bisect-helper-2 (2017-10-28) 8 commits
 - t6030: make various test to pass GETTEXT_POISON tests
 - bisect--helper: `bisect_start` shell function partially in C
 - bisect--helper: `get_terms` & `bisect_terms` shell function in C
 - bisect--helper: `bisect_next_check` shell function in C
 - bisect--helper: `check_and_set_terms` shell function in C
 - wrapper: move is_empty_file() and rename it as is_empty_or_missing_file()
 - bisect--helper: `bisect_write` shell function in C
 - bisect--helper: `bisect_reset` shell function in C

 Expecting a reroll.
 cf. <0102015f5e5ee171-f30f4868-886f-47a1-a4e4-b4936afc545d-000000@eu-west-1.amazonses.com>


* dj/runtime-prefix (2017-12-05) 4 commits
 . exec_cmd: RUNTIME_PREFIX on some POSIX systems
 . Makefile: add Perl runtime prefix support
 . Makefile: add support for "perllibdir"
 . Makefile: generate Perl header from template file

 A build-time option has been added to allow Git to be told to refer
 to its associated files relative to the main binary, in the same
 way that has been possible on Windows for quite some time, for
 Linux, BSDs and Darwin.

 Perhaps it is about time to reboot the effort?


* mk/http-backend-content-length (2017-11-27) 4 commits
 - SQUASH???
 - t5560-http-backend-noserver.sh: add CONTENT_LENGTH cases
 - SQUASH???
 - http-backend: respect CONTENT_LENGTH as specified by rfc3875

 The http-backend (used for smart-http transport) used to slurp the
 whole input until EOF, without paying attention to CONTENT_LENGTH
 that is supplied in the environment and instead expecting the Web
 server to close the input stream.  This has been fixed.

 Expecting a reroll.
 Suggested fixes to be used when rerolling is queued, but I'd
 prefer _not_ squashing them myself.

 Also, it may be too complex solution for the problem.
 cf. <20171204171308.GA13332@sigill.intra.peff.net>


* cc/require-tcl-tk-for-build (2017-11-29) 2 commits
 - travis-ci: avoid new tcl/tk build requirement
 - Makefile: check that tcl/tk is installed

 A first-time builder of Git may have installed neither tclsh nor
 msgfmt, in which case git-gui and gitk part will fail and break the
 build.  As a workaround, refuse to run a build when tclsh is not
 installed and NO_TCLTK is not set.

 Stalled for too long without any response; will discard.
 I still feel that requring tclsh to be installed, with or without
 "escape hatch" for experts, may be too heavy-handed.


* mg/merge-base-fork-point (2017-09-17) 3 commits
 - merge-base: find fork-point outside partial reflog
 - merge-base: return fork-point outside reflog
 - t6010: test actual test output

 "merge-base --fork-point $branch $commit" is used to guess on which
 commit among the commits that were once at the tip of the $branch the
 $commit was built on top of, and it learns these historical tips from
 the reflog of the $branch.  When the true fork-point is lost due to
 pruning of old reflog entries, the command does not give any output,
 because it has no way to guess correctly and does not want to mislead
 the user with a wrong guess.

 The command has been updated to give the best but not known to be
 correct guess, based on a hope that a merge-base between $commit and a
 virtual merge across all the reflog entries that still are available
 for $branch may still be a closer to the true fork-point than the
 merge-base between $commit and the current tip of the $branch.

 This may have to be offered by an additional option, to allow the
 users that are prepared to see a potentially incorrect guess to opt
 into the feature, without affecting the current callers that may not
 be prepared to accept a guess that is not known to be correct.

 Stalled for too long without any response; will discard.


* jk/drop-ancient-curl (2017-08-09) 5 commits
 - http: #error on too-old curl
 - curl: remove ifdef'd code never used with curl >=7.19.4
 - http: drop support for curl < 7.19.4
 - http: drop support for curl < 7.16.0
 - http: drop support for curl < 7.11.1

 Some code in http.c that has bitrot is being removed.

 Expecting a reroll.


* mk/use-size-t-in-zlib (2017-08-10) 1 commit
 . zlib.c: use size_t for size

 The wrapper to call into zlib followed our long tradition to use
 "unsigned long" for sizes of regions in memory, which have been
 updated to use "size_t".

 Needs resurrecting by making sure the fix is good and still applies
 (or adjusted to today's codebase).


* mg/status-in-progress-info (2017-05-10) 2 commits
 - status --short --inprogress: spell it as --in-progress
 - status: show in-progress info for short status

 "git status" learns an option to report various operations
 (e.g. "merging") that the user is in the middle of.

 Stalled for too long without any response; will discard.
 cf. <xmqqmvakcdqw.fsf@gitster.mtv.corp.google.com>

--------------------------------------------------
[Cooking]

* sg/travis-build-during-script-phase (2018-01-08) 1 commit
  (merged to 'next' on 2018-03-02 at 29e1585ae7)
 + travis-ci: build Git during the 'script' phase

 Build the executable in 'script' phase in Travis CI integration, to
 follow the established practice, rather than during 'before_script'
 phase.  This allows the CI categorize the failures better ('failed'
 is project's fault, 'errored' is build environment's).

 Will merge to 'master'.


* np/send-email-header-parsing (2017-12-15) 1 commit
 - send-email: extract email-parsing code into a subroutine
 (this branch is used by cl/send-email-reply-to.)

 Code refactoring.


* ld/p4-unshelve (2018-02-22) 1 commit
 - git-p4: add unshelve command

 "git p4" learned to "unshelve" shelved commit from P4.

 Will hold, perhaps drop and use format-change that uses a proper "diff".
 cf. <CAE5ih7_ooDMqVtTMoQ70s5XCkncr04HY0JkqSp1UmKQeG81oaA@mail.gmail.com>


* ps/contains-id-error-message (2018-03-06) 1 commit
 - parse-options: squelch usage help on certain errors

 "git tag --contains no-such-commit" gave a full list of options
 after giving an error message.

 Rebooted and fixed the root cause of the issue at a lower level.


* rv/grep-cleanup (2018-02-23) 2 commits
  (merged to 'next' on 2018-03-02 at 4aafca15f9)
 + grep: simplify grep_oid and grep_file
 + grep: move grep_source_init outside critical section

 Threaded "git grep" has been optimized to avoid allocation in code
 section that is covered under a mutex.

 Will merge to 'master'.


* sg/subtree-signed-commits (2018-02-23) 1 commit
  (merged to 'next' on 2018-03-02 at c5f6fd33e6)
 + subtree: fix add and pull for GPG-signed commits

 "git subtree" script (in contrib/) scripted around "git log", whose
 output got affected by end-user configuration like log.showsignature

 Will merge to 'master'.


* ds/find-unique-abbrev-optim (2018-02-27) 1 commit
  (merged to 'next' on 2018-03-02 at 0b6d4f9335)
 + sha1_name: fix uninitialized memory errors

 While finding unique object name abbreviation, the code may
 accidentally have read beyond the end of the array of object names
 in a pack.

 Will merge to 'master'.


* ds/mark-parents-uninteresting-optim (2018-02-27) 1 commit
  (merged to 'next' on 2018-03-02 at 5a42c79806)
 + revision.c: reduce object database queries

 Micro optimization in revision traversal code.

 Will merge to 'master'.


* jc/test-must-be-empty (2018-02-27) 1 commit
  (merged to 'next' on 2018-03-02 at ec129f1b97)
 + test_must_be_empty: make sure the file exists, not just empty

 Test framework tweak to catch developer thinko.

 Will merge to 'master'.


* ma/roll-back-lockfiles (2018-02-28) 5 commits
  (merged to 'next' on 2018-03-06 at be29bf891c)
 + sequencer: do not roll back lockfile unnecessarily
 + merge: always roll back lock in `checkout_fast_forward()`
 + merge-recursive: always roll back lock in `merge_recursive_generic()`
 + sequencer: always roll back lock in `do_recursive_merge()`
 + sequencer: make lockfiles non-static
 (this branch is used by ma/skip-writing-unchanged-index.)

 Some codepaths used to take a lockfile and did not roll it back;
 they are automatically rolled back at program exit, so there is no
 real "breakage", but it still is a good practice to roll back when
 you are done with a lockfile.

 Will merge to 'master'.


* mk/doc-pretty-fill (2018-02-27) 1 commit
  (merged to 'next' on 2018-03-02 at 623461b127)
 + docs/pretty-formats: fix typo '% <(<N>)' -> '%<|(<N>)'

 Docfix.

 Will merge to 'master'.


* nd/remove-ignore-env-field (2018-03-05) 5 commits
 - repository: delete ignore_env member
 - sha1_file.c: move delayed getenv(altdb) back to setup_git_env()
 - repository.c: delete dead functions
 - repository.c: move env-related setup code back to environment.c
 - repository: initialize the_repository in main()
 (this branch is used by sb/object-store and sb/packfiles-in-repository.)


* rj/test-i18ngrep (2018-02-28) 2 commits
  (merged to 'next' on 2018-03-06 at 7ea1a2352c)
 + t5536: simplify checking of messages output to stderr
 + t4151: consolidate multiple calls to test_i18ngrep

 Test updates.

 Will merge to 'master'.


* rs/perf-repeat-thrice-by-default (2018-02-27) 1 commit
  (merged to 'next' on 2018-03-02 at 4898b3c450)
 + perf: use GIT_PERF_REPEAT_COUNT=3 by default even without config file

 Perf test regression fix.

 Will merge to 'master'.


* sb/object-store (2018-03-05) 27 commits
 - sha1_file: allow sha1_loose_object_info to handle arbitrary repositories
 - sha1_file: allow map_sha1_file to handle arbitrary repositories
 - sha1_file: allow map_sha1_file_1 to handle arbitrary repositories
 - sha1_file: allow open_sha1_file to handle arbitrary repositories
 - sha1_file: allow stat_sha1_file to handle arbitrary repositories
 - sha1_file: allow sha1_file_name to handle arbitrary repositories
 - sha1_file: add repository argument to sha1_loose_object_info
 - sha1_file: add repository argument to map_sha1_file
 - sha1_file: add repository argument to map_sha1_file_1
 - sha1_file: add repository argument to open_sha1_file
 - sha1_file: add repository argument to stat_sha1_file
 - sha1_file: add repository argument to sha1_file_name
 - sha1_file: allow prepare_alt_odb to handle arbitrary repositories
 - sha1_file: allow link_alt_odb_entries to handle arbitrary repositories
 - sha1_file: add repository argument to prepare_alt_odb
 - sha1_file: add repository argument to link_alt_odb_entries
 - sha1_file: add repository argument to read_info_alternates
 - sha1_file: add repository argument to link_alt_odb_entry
 - sha1_file: add raw_object_store argument to alt_odb_usable
 - pack: move approximate object count to object store
 - pack: move prepare_packed_git_run_once to object store
 - object-store: close all packs upon clearing the object store
 - object-store: move packed_git and packed_git_mru to object store
 - object-store: free alt_odb_list
 - object-store: move alt_odb_list and alt_odb_tail to object store
 - object-store: migrate alternates struct and functions from cache.h
 - repository: introduce raw object store field
 (this branch is used by sb/packfiles-in-repository; uses nd/remove-ignore-env-field.)

 Refactoring the internal global data structure to make it possible
 to open multiple repositories, work with and then close them.

 Rerolled by Duy on top of a separate preliminary clean-up topic.
 The resulting structure of the topics looked very sensible.


* sb/packfiles-in-repository (2018-03-05) 12 commits
 - packfile: keep prepare_packed_git() private
 - packfile: allow find_pack_entry to handle arbitrary repositories
 - packfile: add repository argument to find_pack_entry
 - packfile: allow reprepare_packed_git to handle arbitrary repositories
 - packfile: allow prepare_packed_git to handle arbitrary repositories
 - packfile: allow prepare_packed_git_one to handle arbitrary repositories
 - packfile: add repository argument to reprepare_packed_git
 - packfile: add repository argument to prepare_packed_git
 - packfile: add repository argument to prepare_packed_git_one
 - packfile: allow install_packed_git to handle arbitrary repositories
 - packfile: allow rearrange_packed_git to handle arbitrary repositories
 - packfile: allow prepare_packed_git_mru to handle arbitrary repositories
 (this branch uses nd/remove-ignore-env-field and sb/object-store.)

 Refactoring of the internal global data structure continues.


* sg/test-x (2018-02-28) 11 commits
  (merged to 'next' on 2018-03-06 at ab0684b27c)
 + travis-ci: run tests with '-x' tracing
 + t/README: add a note about don't saving stderr of compound commands
 + t1510-repo-setup: mark as untraceable with '-x'
 + t9903-bash-prompt: don't check the stderr of __git_ps1()
 + t5570-git-daemon: don't check the stderr of a subshell
 + t5526: use $TRASH_DIRECTORY to specify the path of GIT_TRACE log file
 + t5500-fetch-pack: don't check the stderr of a subshell
 + t3030-merge-recursive: don't check the stderr of a subshell
 + t1507-rev-parse-upstream: don't check the stderr of a shell function
 + t: add means to disable '-x' tracing for individual test scripts
 + t: prevent '-x' tracing from interfering with test helpers' stderr

 Running test scripts under -x option of the shell is often not a
 useful way to debug them, because the error messages from the
 commands tests try to capture and inspect are contaminated by the
 tracing output by the shell.  An earlier work done to make it more
 pleasant to run tests under -x with recent versions of bash is
 extended to cover posix shells that do not support BASH_XTRACEFD.

 Will merge to 'master'.


* ab/gc-auto-in-commit (2018-03-01) 1 commit
  (merged to 'next' on 2018-03-02 at 96a5a4d629)
 + commit: run git gc --auto just before the post-commit hook

 "git commit" used to run "gc --auto" near the end, which was lost
 when the command was reimplemented in C by mistake.

 Will merge to 'master'.


* ab/pre-auto-gc-battery (2018-02-28) 1 commit
  (merged to 'next' on 2018-03-06 at ca9cb273cb)
 + hooks/pre-auto-gc-battery: allow gc to run on non-laptops

 A sample auto-gc hook (in contrib/) to skip auto-gc while on
 battery has been updated to almost always allow running auto-gc
 unless on_ac_power command is absolutely sure that we are on
 battery power (earlier, it skipped unless the command is sure that
 we are on ac power).

 Will merge to 'master'.


* ag/userdiff-go-funcname (2018-03-01) 1 commit
  (merged to 'next' on 2018-03-02 at ea404d1be9)
 + userdiff: add built-in pattern for golang

 "git diff" and friends learned funcname patterns for Go language
 source files.

 Will merge to 'master'.


* ma/skip-writing-unchanged-index (2018-03-01) 1 commit
 - write_locked_index(): add flag to avoid writing unchanged index
 (this branch uses ma/roll-back-lockfiles.)

 Internal API clean-up to allow write_locked_index() optionally skip
 writing the in-core index when it is not modified.

 May want to merge into ma/roll-back-lockfiles topic before merging
 to 'next'.


* jh/status-no-ahead-behind (2018-01-24) 4 commits
  (merged to 'next' on 2018-03-02 at 68bde8d571)
 + status: support --no-ahead-behind in long format
 + status: update short status to respect --no-ahead-behind
 + status: add --[no-]ahead-behind to status and commit for V2 format.
 + stat_tracking_info: return +1 when branches not equal

 "git status" can spend a lot of cycles to compute the relation
 between the current branch and its upstream, which can now be
 disabled with "--no-ahead-behind" option.

 Will merge to 'master'.


* nd/tilde-expand-opt-file-value (2018-02-14) 2 commits
 - init-db: change --template type to OPTION_FILENAME
 - parse-options: expand $HOME on filename options

 "git cmd --opt=~u/path/to/file" did not tilde-expand "~u" part to
 the path to the home directory of user 'u'

 Will discard.
 This may make the resulting whole more confusing, though.
 cf. <87wozffavp.fsf@evledraar.gmail.com>


* ab/perl-fixes (2018-03-05) 13 commits
 - perl Git::LoadCPAN: emit better errors under NO_PERL_CPAN_FALLBACKS
 - Makefile: add NO_PERL_CPAN_FALLBACKS knob
 - perl: move the perl/Git/FromCPAN tree to perl/FromCPAN
 - perl: generalize the Git::LoadCPAN facility
 - perl: move CPAN loader wrappers to another namespace
 - perl: update our copy of Mail::Address
 - perl: update our ancient copy of Error.pm
 - git-send-email: unconditionally use Net::{SMTP,Domain}
 - Git.pm: hard-depend on the File::{Temp,Spec} modules
 - gitweb: hard-depend on the Digest::MD5 5.8 module
 - Git.pm: add the "use warnings" pragma
 - Git.pm: remove redundant "use strict" from sub-package
 - perl: *.pm files should not have the executable bit

 Clean-up to various pieces of Perl code we have.

 WIll merge to 'next'.


* ds/commit-graph (2018-02-20) 13 commits
 - commit-graph: build graph from starting commits
 - commit-graph: read only from specific pack-indexes
 - commit: integrate commit graph with commit parsing
 - commit-graph: close under reachability
 - commit-graph: add core.commitGraph setting
 - commit-graph: implement --delete-expired
 - commit-graph: implement --set-latest
 - commit-graph: implement git commit-graph read
 - commit-graph: implement 'git-commit-graph write'
 - commit-graph: implement write_commit_graph()
 - commit-graph: create git-commit-graph builtin
 - graph: add commit graph design document
 - commit-graph: add format document

 Precompute and store information necessary for ancestry traversal
 in a separate file to optimize graph walking.

 Reroll exists, but it appears that there will be a further reroll.
 cf. <1519698787-190494-1-git-send-email-dstolee@microsoft.com>


* ot/ref-filter-cleanup (2018-02-21) 2 commits
  (merged to 'next' on 2018-03-02 at 3b4c39a4b5)
 + ref-filter: get rid of goto
 + ref-filter: get rid of duplicate code

 Code cleanup.

 Will merge to 'master'.


* ma/config-page-only-in-list-mode (2018-02-21) 3 commits
 - config: change default of `pager.config` to "on"
 - config: respect `pager.config` in list/get-mode only
 - t7006: add tests for how git config paginates

 In a way similar to how "git tag" learned to honor the pager
 setting only in the list mode, "git config" learned to ignore the
 pager setting when it is used for setting values (i.e. when the
 purpose of the operation is not to "show").

 Is this ready for 'next'?


* pw/add-p-recount (2018-03-05) 9 commits
  (merged to 'next' on 2018-03-06 at 68952f9bb0)
 + add -p: don't rely on apply's '--recount' option
 + add -p: fix counting when splitting and coalescing
 + add -p: calculate offset delta for edited patches
 + add -p: adjust offsets of subsequent hunks when one is skipped
 + t3701: add failing test for pathological context lines
 + t3701: don't hard code sha1 hash values
 + t3701: use test_write_lines and write_script
 + t3701: indent here documents
 + add -i: add function to format hunk header
 (this branch is used by pw/add-p-select.)

 "git add -p" has been lazy in coalescing split patches before
 passing the result to underlying "git apply", leading to corner
 case bugs; the logic to prepare the patch to be applied after hunk
 selections has been tightened.

 Will merge to 'master'.


* bp/untracked-cache-noflush (2018-02-28) 2 commits
  (merged to 'next' on 2018-03-02 at 709887971b)
 + untracked cache: use git_env_bool() not getenv() for customization
 + dir.c: don't flag the index as dirty for changes to the untracked cache

 Writing out the index file when the only thing that changed in it
 is the untracked cache information is often wasteful, and this has
 been optimized out.

 Will merge to 'master'.


* nd/diff-stat-with-summary (2018-02-27) 2 commits
  (merged to 'next' on 2018-03-06 at d543f92f5e)
 + diff: add --compact-summary
 + diff.c: refactor pprint_rename() to use strbuf

 "git diff" and friends learned "--compact-summary" that shows the
 information usually given with the "--summary" option on the same
 line as the diffstat output of the "--stat" option (which saves
 vertical space and keeps info on a single path at the same place).

 Will merge to 'master'.


* nd/parseopt-completion (2018-03-06) 44 commits
 - SQUASH???
 - completion: simplify _git_notes
 - completion: don't set PARSE_OPT_NOCOMPLETE on --rerere-autoupdate
  (merged to 'next' on 2018-03-02 at d72a6525fd)
 + completion: use __gitcomp_builtin in _git_worktree
 + completion: use __gitcomp_builtin in _git_tag
 + completion: use __gitcomp_builtin in _git_status
 + completion: use __gitcomp_builtin in _git_show_branch
 + completion: use __gitcomp_builtin in _git_rm
 + completion: use __gitcomp_builtin in _git_revert
 + completion: use __gitcomp_builtin in _git_reset
 + completion: use __gitcomp_builtin in _git_replace
 + remote: force completing --mirror= instead of --mirror
 + completion: use __gitcomp_builtin in _git_remote
 + completion: use __gitcomp_builtin in _git_push
 + completion: use __gitcomp_builtin in _git_pull
 + completion: use __gitcomp_builtin in _git_notes
 + completion: use __gitcomp_builtin in _git_name_rev
 + completion: use __gitcomp_builtin in _git_mv
 + completion: use __gitcomp_builtin in _git_merge_base
 + completion: use __gitcomp_builtin in _git_merge
 + completion: use __gitcomp_builtin in _git_ls_remote
 + completion: use __gitcomp_builtin in _git_ls_files
 + completion: use __gitcomp_builtin in _git_init
 + completion: use __gitcomp_builtin in _git_help
 + completion: use __gitcomp_builtin in _git_grep
 + completion: use __gitcomp_builtin in _git_gc
 + completion: use __gitcomp_builtin in _git_fsck
 + completion: use __gitcomp_builtin in _git_fetch
 + completion: use __gitcomp_builtin in _git_difftool
 + completion: use __gitcomp_builtin in _git_describe
 + completion: use __gitcomp_builtin in _git_config
 + completion: use __gitcomp_builtin in _git_commit
 + completion: use __gitcomp_builtin in _git_clone
 + completion: use __gitcomp_builtin in _git_clean
 + completion: use __gitcomp_builtin in _git_cherry_pick
 + completion: use __gitcomp_builtin in _git_checkout
 + completion: use __gitcomp_builtin in _git_branch
 + completion: use __gitcomp_builtin in _git_apply
 + completion: use __gitcomp_builtin in _git_am
 + completion: use __gitcomp_builtin in _git_add
 + git-completion.bash: introduce __gitcomp_builtin
 + parse-options: let OPT__FORCE take optional flags argument
 + parse-options: add OPT_xxx_F() variants
 + parse-options: support --git-completion-helper

 Teach parse-options API an option to help the completion script,
 and make use of the mechanism in command line completion.

 Will merge to 'master'.


* pc/submodule-helper-foreach (2018-02-02) 5 commits
 - submodule: port submodule subcommand 'foreach' from shell to C
 - submodule foreach: document variable '$displaypath'
 - submodule foreach: clarify the '$toplevel' variable documentation
 - submodule foreach: document '$sm_path' instead of '$path'
 - submodule foreach: correct '$path' in nested submodules from a subdirectory

 Expecting a response to review comments
 e.g. cf. <20180206150044.1bffbb573c088d38c8e44bf5@google.com>


* tg/worktree-add-existing-branch (2018-02-05) 3 commits
 - worktree: teach "add" to check out existing branches
 - worktree: be clearer when "add" dwim-ery kicks in
 - worktree: improve message when creating a new worktree

 "git worktree add" learned to check out an existing branch.

 Expecting a reroll.
 cf. <CAPig+cRLohiqR_Drh7P0q3XbvC22WLjNwH0YLZo3dqFzZZuAPw@mail.gmail.com>
 cf. <CACsJy8BEKYqW+Ne_WY2RBaSbb9OKcjREtrawStj=eJsVsia_Jw@mail.gmail.com>
 The general idea is good, just end-user facing messages are found
 suboptimal.


* nd/worktree-move (2018-03-06) 8 commits
  (merged to 'next' on 2018-03-06 at a26271e7de)
 + t2028: fix minor error and issues in newly-added "worktree move" tests
  (merged to 'next' on 2018-03-02 at 5c514dfc92)
 + worktree remove: allow it when $GIT_WORK_TREE is already gone
 + worktree remove: new command
 + worktree move: refuse to move worktrees with submodules
 + worktree move: accept destination as directory
 + worktree move: new command
 + worktree.c: add update_worktree_location()
 + worktree.c: add validate_worktree()

 "git worktree" learned move and remove subcommands.

 Will merge to 'master'.


* cl/send-email-reply-to (2018-03-06) 2 commits
 - send-email: support separate Reply-To address
 - send-email: rename variable for clarity
 (this branch uses np/send-email-header-parsing.)

 "git send-email" learned "--reply-to=<address>" option.

 Will merge to 'next'.


* js/rebase-recreate-merge (2018-02-23) 12 commits
 - rebase -i: introduce --recreate-merges=[no-]rebase-cousins
 - pull: accept --rebase=recreate to recreate the branch topology
 - sequencer: handle post-rewrite for merge commands
 - sequencer: make refs generated by the `label` command worktree-local
 - rebase: introduce the --recreate-merges option
 - rebase-helper --make-script: introduce a flag to recreate merges
 - sequencer: fast-forward merge commits, if possible
 - sequencer: introduce the `merge` command
 - sequencer: introduce new commands to reset the revision
 - git-rebase--interactive: clarify arguments
 - sequencer: make rearrange_squash() a bit more obvious
 - sequencer: avoid using errno clobbered by rollback_lock_file()

 "git rebase" learned "--recreate-merges" to transplant the whole
 topology of commit graph elsewhere.

 Will merge to 'next'.


* bw/protocol-v2 (2018-03-02) 36 commits
 - SQUASH???
 - remote-curl: don't request v2 when pushing
 - remote-curl: implement stateless-connect command
 - http: eliminate "# service" line when using protocol v2
 - http: don't always add Git-Protocol header
 - http: allow providing extra headers for http requests
 - remote-curl: store the protocol version the server responded with
 - remote-curl: create copy of the service name
 - pkt-line: add packet_buf_write_len function
 - transport-helper: introduce stateless-connect
 - transport-helper: refactor process_connect_service
 - transport-helper: remove name parameter
 - connect: don't request v2 when pushing
 - connect: refactor git_connect to only get the protocol version once
 - fetch-pack: support shallow requests
 - fetch-pack: perform a fetch using v2
 - upload-pack: introduce fetch server command
 - push: pass ref patterns when pushing
 - fetch: pass ref patterns when fetching
 - ls-remote: pass ref patterns when requesting a remote's refs
 - transport: convert transport_get_remote_refs to take a list of ref patterns
 - transport: convert get_refs_list to take a list of ref patterns
 - connect: request remote refs using v2
 - ls-refs: introduce ls-refs server command
 - serve: introduce git-serve
 - test-pkt-line: introduce a packet-line test helper
 - protocol: introduce enum protocol_version value protocol_v2
 - transport: store protocol version
 - connect: discover protocol version outside of get_remote_heads
 - connect: convert get_remote_heads to use struct packet_reader
 - transport: use get_refs_via_connect to get refs
 - upload-pack: factor out processing lines
 - upload-pack: convert to a builtin
 - pkt-line: add delim packet support
 - pkt-line: allow peeking a packet line without consuming it
 - pkt-line: introduce packet_read_with_status

 The beginning of the next-gen transfer protocol.


* ls/checkout-encoding (2018-03-06) 8 commits
 - convert: add round trip check based on 'core.checkRoundtripEncoding'
 - convert: add tracing for 'working-tree-encoding' attribute
 - convert: check for detectable errors in UTF encodings
 - convert: add 'working-tree-encoding' attribute
 - utf8: add function to detect a missing UTF-16/32 BOM
 - utf8: add function to detect prohibited UTF-16/32 BOM
 - strbuf: add xstrdup_toupper()
 - strbuf: remove unnecessary NUL assignment in xstrdup_tolower()

 The new "checkout-encoding" attribute can ask Git to convert the
 contents to the specified encoding when checking out to the working
 tree (and the other way around when checking in).

 Expecting a reroll; it is almost there, though.
 cf. <570D707A-DD9E-4397-8155-E8B3C3D09760@gmail.com>


* en/rename-directory-detection (2018-02-27) 29 commits
  (merged to 'next' on 2018-03-06 at d42470f86e)
 + merge-recursive: ensure we write updates for directory-renamed file
 + merge-recursive: avoid spurious rename/rename conflict from dir renames
 + directory rename detection: new testcases showcasing a pair of bugs
 + merge-recursive: fix remaining directory rename + dirty overwrite cases
 + merge-recursive: fix overwriting dirty files involved in renames
 + merge-recursive: avoid clobbering untracked files with directory renames
 + merge-recursive: apply necessary modifications for directory renames
 + merge-recursive: when comparing files, don't include trees
 + merge-recursive: check for file level conflicts then get new name
 + merge-recursive: add computation of collisions due to dir rename & merging
 + merge-recursive: check for directory level conflicts
 + merge-recursive: add get_directory_renames()
 + merge-recursive: make a helper function for cleanup for handle_renames
 + merge-recursive: split out code for determining diff_filepairs
 + merge-recursive: make !o->detect_rename codepath more obvious
 + merge-recursive: fix leaks of allocated renames and diff_filepairs
 + merge-recursive: introduce new functions to handle rename logic
 + merge-recursive: move the get_renames() function
 + directory rename detection: tests for handling overwriting dirty files
 + directory rename detection: tests for handling overwriting untracked files
 + directory rename detection: miscellaneous testcases to complete coverage
 + directory rename detection: testcases exploring possibly suboptimal merges
 + directory rename detection: more involved edge/corner testcases
 + directory rename detection: testcases checking which side did the rename
 + directory rename detection: files/directories in the way of some renames
 + directory rename detection: partially renamed directory testcase/discussion
 + directory rename detection: testcases to avoid taking detection too far
 + directory rename detection: directory splitting testcases
 + directory rename detection: basic testcases

 Rename detection logic in "diff" family that is used in "merge" has
 learned to guess when all of x/a, x/b and x/c have moved to z/a,
 z/b and z/c, it is likely that x/d added in the meantime would also
 want to move to z/d by taking the hint that the entire directory
 'x' moved to 'z'.  A bug causing dirty files involved in a rename
 to be overwritten during merge has also been fixed as part of this
 work.

 Will merge to 'master'.

--------------------------------------------------
[Discarded]

* ot/cat-batch-format (2018-02-12) 23 commits
 . cat-file: update of docs
 . cat-file: tests for new atoms added
 . for-each-ref: tests for new atoms added
 . ref-filter: unifying formatting of cat-file opts
 . ref-filter: make populate_value() internal again
 . cat-file: reuse printing logic from ref-filter
 . ref-filter: make valid_atom general again
 . ref-filter: make cat_file_info independent
 . cat-file: move skip_object_info into ref-filter
 . ref_filter: add is_atom_used function
 . ref-filter: get rid of mark_atom_in_object_info()
 . cat-file: start reusing populate_value()
 . ref-filter: rename field in ref_array_item stuct
 . ref-filter: make populate_value() global
 . cat-file: start use ref_array_item struct
 . ref-filter: reuse parse_ref_filter_atom()
 . cat-file: start migrating formatting to ref-filter
 . cat-file: split expand_atom() into 2 functions
 . cat-file: move struct expand_data into ref-filter
 . ref-filter: make valid_atom as function parameter
 . cat-file: reuse struct ref_format
 . ref-filter: add return value to some functions
 . ref-filter: get rid of goto

 Teach "cat-file --batch" to reuse the formatting machinery shared
 by for-each-ref, branch --list, and tag --list.

 Discarded, as a rebooted effort is beginning elsewhere.
 Allocates flex-array on stack, etc.
 cf. <58b2bdcd-d621-fd21-ab4d-6a9478319b19@ramsayjones.plus.com>

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Mar 2018, #01; Thu, 1)
@ 2018-03-01 22:20  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2018-03-01 22:20 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* ab/untracked-cache-invalidation-docs (2018-02-09) 2 commits
  (merged to 'next' on 2018-02-14 at 11d2d07c4a)
 + update-index doc: note the caveat with "could not open..."
 + update-index doc: note a fixed bug in the untracked cache
 (this branch uses nd/fix-untracked-cache-invalidation.)

 Doc update to warn against remaining bugs in untracked cache.


* as/ll-i18n (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-14 at b30154a04c)
 + Mark messages for translations

 Some messages in low level start-up codepath have been i18n-ized.


* bc/doc-interpret-trailers-grammofix (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-14 at 940e6dc7a5)
 + docs/interpret-trailers: fix agreement error

 Docfix.


* bp/fsmonitor (2018-02-14) 1 commit
  (merged to 'next' on 2018-02-14 at 5c508858fb)
 + fsmonitor: update documentation to remove reference to invalid config settings

 Doc update for a recently added feature.


* bp/name-hash-dirname-fix (2018-02-08) 1 commit
  (merged to 'next' on 2018-02-14 at 2f564fb4b3)
 + name-hash: properly fold directory names in adjust_dirname_case()

 "git add" files in the same directory, but spelling the directory
 path in different cases on case insensitive filesystem, corrupted
 the name hash data structure and led to unexpected results.  This
 has been corrected.


* es/worktree-add-post-checkout-hook (2018-02-15) 1 commit
  (merged to 'next' on 2018-02-21 at 6ef6a130bf)
 + worktree: add: fix 'post-checkout' not knowing new worktree location

 "git worktree add" learned to run the post-checkout hook, just like
 "git clone" runs it upon the initial checkout.


* gs/test-unset-xdg-cache-home (2018-02-16) 1 commit
  (merged to 'next' on 2018-02-21 at 9aec46d404)
 + test-lib.sh: unset XDG_CACHE_HOME

 Test update.


* jc/blame-missing-path (2018-02-07) 1 commit
  (merged to 'next' on 2018-02-14 at 883d266e1e)
 + blame: tighten command line parser

 "git blame HEAD COPYING" in a bare repository failed to run, while
 "git blame HEAD -- COPYING" run just fine.  This has been corrected.


* jk/doc-do-not-write-extern (2018-02-08) 1 commit
  (merged to 'next' on 2018-02-14 at e55b5127de)
 + CodingGuidelines: mention "static" and "extern"

 Devdoc update.


* jk/gettext-poison (2018-02-08) 2 commits
  (merged to 'next' on 2018-02-14 at cca3719a59)
 + git-sh-i18n: check GETTEXT_POISON before USE_GETTEXT_SCHEME
 + t0205: drop redundant test

 Test updates.


* jk/push-options-via-transport-fix (2018-02-20) 2 commits
  (merged to 'next' on 2018-02-21 at a037cbfa2b)
 + remote-curl: unquote incoming push-options
 + t5545: factor out http repository setup

 "git push" over http transport did not unquote the push-options
 correctly.


* jk/sq-dequote-on-bogus-input (2018-02-14) 1 commit
  (merged to 'next' on 2018-02-14 at 75d4f1eaf8)
 + sq_dequote: fix extra consumption of source string

 Code to unquote single-quoted string (used in the parser for
 configuration files, etc.) did not diagnose bogus input correctly
 and produced bogus results instead.


* jk/t0002-simplify (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at a7a24f5f29)
 + t0002: simplify error checking

 Code cleanup.


* jk/test-hashmap-updates (2018-02-14) 6 commits
  (merged to 'next' on 2018-02-14 at a61a9bd8f0)
 + test-hashmap: use "unsigned int" for hash storage
 + test-hashmap: simplify alloc_test_entry
 + test-hashmap: use strbuf_getline rather than fgets
 + test-hashmap: use xsnprintf rather than snprintf
 + test-hashmap: check allocation computation for overflow
 + test-hashmap: use ALLOC_ARRAY rather than bare malloc

 Code clean-up.


* js/fix-merge-arg-quoting-in-rebase-p (2018-02-08) 1 commit
  (merged to 'next' on 2018-02-14 at 27ebf001a1)
 + rebase -p: fix incorrect commit message when calling `git merge`.

 "git rebase -p" mangled log messages of a merge commit, which is
 now fixed.


* js/packet-read-line-check-null (2018-02-08) 2 commits
  (merged to 'next' on 2018-02-14 at 6ba237b284)
 + always check for NULL return from packet_read_line()
 + correct error messages for NULL packet_read_line()

 Some low level protocol codepath could crash when they get an
 unexpected flush packet, which is now fixed.


* jt/binsearch-with-fanout (2018-02-15) 2 commits
  (merged to 'next' on 2018-02-15 at 7648891022)
 + packfile: refactor hash search with fanout table
 + packfile: remove GIT_DEBUG_LOOKUP log statements
 (this branch is used by ds/commit-graph.)

 Refactor the code to binary search starting from a fan-out table
 (which is how the packfile is indexed with object names) into a
 reusable helper.


* nd/am-quit (2018-02-14) 1 commit
  (merged to 'next' on 2018-02-21 at 9a9cb40c2f)
 + am: support --quit

 "git am" has learned the "--quit" option, in addition to the existing
 "--abort" option; having the pair mirrors a few other commands like
 "rebase" and "cherry-pick".


* nd/fix-untracked-cache-invalidation (2018-02-07) 5 commits
  (merged to 'next' on 2018-02-08 at 23bd5a5d2d)
 + dir.c: ignore paths containing .git when invalidating untracked cache
 + dir.c: stop ignoring opendir() error in open_cached_dir()
 + dir.c: fix missing dir invalidation in untracked code
 + dir.c: avoid stat() in valid_cached_dir()
 + status: add a failing test showing a core.untrackedCache bug
 (this branch is used by ab/untracked-cache-invalidation-docs.)

 Some bugs around "untracked cache" feature have been fixed.
 Seems to uncover bad untracked cache information a bit too loudly,
 for which there is ab/untracked-cache-invalidation-docs topic.
 cf. <87d11omi2o.fsf@evledraar.gmail.com>
 They have to graduate together.


* rd/typofix (2018-02-14) 2 commits
  (merged to 'next' on 2018-02-14 at e770601de4)
 + Correct mispellings of ".gitmodule" to ".gitmodules"
 + t/: correct obvious typo "detahced"

 Typofix.


* rj/sparse-updates (2018-02-12) 2 commits
  (merged to 'next' on 2018-02-14 at 072df8ed5b)
 + Makefile: suppress a sparse warning for pack-revindex.c
 + config.mak.uname: remove SPARSE_FLAGS setting for cygwin

 Devtool update.


* rs/check-ignore-multi (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at 43cb0704af)
 + check-ignore: fix mix of directories and other file types

 "git check-ignore" with multiple paths got confused when one is a
 file and the other is a directory, which has been fixed.


* sb/describe-blob (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at 23e4c13944)
 + describe: confirm that blobs actually exist

 "git describe $garbage" stopped giving any errors when the garbage
 happens to be a string with 40 hexadecimal letters.


* sb/status-doc-fix (2018-02-15) 1 commit
  (merged to 'next' on 2018-02-21 at 5e68f3dac8)
 + Documentation/git-status: clarify status table for porcelain mode

 Docfix.


* sg/doc-test-must-fail-args (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at 28662d145b)
 + t: document 'test_must_fail ok=<signal-name>'

 Devdoc update.


* tg/worktree-create-tracking (2018-02-16) 2 commits
  (merged to 'next' on 2018-02-21 at 3e00a10cd8)
 + git-worktree.txt: fix indentation of example and text of 'add' command
 + git-worktree.txt: fix missing ")" typo

 Hotfix for a recent topic.


* tk/apply-dev-null-verify-name-fix (2018-02-15) 2 commits
  (merged to 'next' on 2018-02-21 at dab449203b)
 + apply: handle Subversion diffs with /dev/null gracefully
 + apply: demonstrate a problem applying svn diffs

 Many places in "git apply" knew that "/dev/null" that signals
 "there is no such file on this side of the diff" can be followed by
 whitespace and garbage when parsing a patch, except for one, which
 made an otherwise valid patch (e.g. ones from subversion) rejected.


* tz/do-not-clean-spec-file (2018-02-17) 1 commit
  (merged to 'next' on 2018-02-21 at c1336418a8)
 + Makefile: remove *.spec from clean target

 We no longer create any *.spec file, so "make clean" should not
 remove it.

--------------------------------------------------
[New Topics]

* jk/cached-commit-buffer (2018-02-22) 2 commits
  (merged to 'next' on 2018-02-27 at af791d9a1e)
 + revision: drop --show-all option
 + commit: drop uses of get_cached_commit_buffer()

 Code clean-up.

 Will merge to 'master'.


* jk/test-helper-v-output-fix (2018-02-22) 1 commit
  (merged to 'next' on 2018-02-27 at c9109977e8)
 + t: send verbose test-helper output to fd 4

 Test framework update.

 Will merge to 'master'.


* ld/p4-unshelve (2018-02-22) 1 commit
 - git-p4: add unshelve command

 "git p4" learned to "unshelve" shelved commit from P4.

 Will merge to 'next'.


* ms/non-ascii-ticks (2018-02-22) 1 commit
  (merged to 'next' on 2018-02-27 at 41159fc4f0)
 + Documentation/gitsubmodules.txt: avoid non-ASCII apostrophes

 Doc markup fix.

 Will merge to 'master'.


* rs/strbuf-read-file-or-whine (2018-02-22) 1 commit
  (merged to 'next' on 2018-02-27 at 56017cb5e2)
 + sequencer: factor out strbuf_read_file_or_whine()

 Code clean-up.

 Will merge to 'master'.


* jk/strbuf-read-file-close-error (2018-02-23) 1 commit
  (merged to 'next' on 2018-02-27 at c5dfe33335)
 + strbuf_read_file(): preserve errno across close() call

 Code clean-up.

 Will merge to 'master'.


* bw/perl-timegm-timelocal-fix (2018-02-23) 1 commit
  (merged to 'next' on 2018-02-27 at 565a3141ce)
 + perl: call timegm and timelocal with 4-digit year

 Y2k20 fix ;-) for our perl scripts.

 Will merge to 'master'.


* ps/contains-id-error-message (2018-02-23) 1 commit
  (merged to 'next' on 2018-02-27 at 9623d6817b)
 + ref-filter: make "--contains <id>" less chatty if <id> is invalid

 "git tag --contains no-such-commit" gave a full list of options
 after giving an error message.

 Will merge to 'master'.
 As a follow-up we may want to also handle "branch --points-at <object>"
 that shares the same problem.


* rv/grep-cleanup (2018-02-23) 2 commits
 - grep: simplify grep_oid and grep_file
 - grep: move grep_source_init outside critical section

 Threaded "git grep" has been optimized to avoid allocation in code
 section that is covered under a mutex.

 Will merge to 'next'.


* sg/subtree-signed-commits (2018-02-23) 1 commit
 - subtree: fix add and pull for GPG-signed commits

 "git subtree" script (in contrib/) scripted around "git log", whose
 output got affected by end-user configuration like log.showsignature

 Will merge to 'next'.


* ds/find-unique-abbrev-optim (2018-02-27) 1 commit
 - sha1_name: fix uninitialized memory errors

 While finding unique object name abbreviation, the code may
 accidentally have read beyond the end of the array of object names
 in a pack.

 Will merge to 'next'.


* ds/mark-parents-uninteresting-optim (2018-02-27) 1 commit
 - revision.c: reduce object database queries

 Micro optimization in revision traversal code.

 Will merge to 'next'.


* jc/test-must-be-empty (2018-02-27) 1 commit
 - test_must_be_empty: make sure the file exists, not just empty

 Test framework tweak to catch developer thinko.

 Will merge to 'next'.


* ma/roll-back-lockfiles (2018-02-28) 5 commits
 - sequencer: do not roll back lockfile unnecessarily
 - merge: always roll back lock in `checkout_fast_forward()`
 - merge-recursive: always roll back lock in `merge_recursive_generic()`
 - sequencer: always roll back lock in `do_recursive_merge()`
 - sequencer: make lockfiles non-static
 (this branch is used by ma/skip-writing-unchanged-index.)

 Some codepaths used to take a lockfile and did not roll it back;
 they are automatically rolled back at program exit, so there is no
 real "breakage", but it still is a good practice to roll back when
 you are done with a lockfile.

 Will merge to 'next'.


* mk/doc-pretty-fill (2018-02-27) 1 commit
 - docs/pretty-formats: fix typo '% <(<N>)' -> '%<|(<N>)'

 Docfix.

 Will merge to 'next'.


* nd/remove-ignore-env-field (2018-02-28) 4 commits
 - repository: delete ignore_env member
 - sha1_file.c: move delayed getenv(altdb) back to setup_git_env()
 - repository.c: delete dead functions
 - repository.c: move env-related setup code back to environment.c
 (this branch uses sb/object-store; is tangled with sb/packfiles-in-repository.)


* rj/test-i18ngrep (2018-02-28) 2 commits
 - t5536: simplify checking of messages output to stderr
 - t4151: consolidate multiple calls to test_i18ngrep

 Test updates.

 Will merge to 'next'.


* rs/perf-repeat-thrice-by-default (2018-02-27) 1 commit
 - perf: use GIT_PERF_REPEAT_COUNT=3 by default even without config file

 Perf test regression fix.

 Will merge to 'next'.


* sb/object-store (2018-02-28) 27 commits
 - sha1_file: allow sha1_loose_object_info to handle arbitrary repositories
 - sha1_file: allow map_sha1_file to handle arbitrary repositories
 - sha1_file: allow map_sha1_file_1 to handle arbitrary repositories
 - sha1_file: allow open_sha1_file to handle arbitrary repositories
 - sha1_file: allow stat_sha1_file to handle arbitrary repositories
 - sha1_file: allow sha1_file_name to handle arbitrary repositories
 - sha1_file: add repository argument to sha1_loose_object_info
 - sha1_file: add repository argument to map_sha1_file
 - sha1_file: add repository argument to map_sha1_file_1
 - sha1_file: add repository argument to open_sha1_file
 - sha1_file: add repository argument to stat_sha1_file
 - sha1_file: add repository argument to sha1_file_name
 - sha1_file: allow prepare_alt_odb to handle arbitrary repositories
 - sha1_file: allow link_alt_odb_entries to handle arbitrary repositories
 - sha1_file: add repository argument to prepare_alt_odb
 - sha1_file: add repository argument to link_alt_odb_entries
 - sha1_file: add repository argument to read_info_alternates
 - sha1_file: add repository argument to link_alt_odb_entry
 - sha1_file: add raw_object_store argument to alt_odb_usable
 - pack: move approximate object count to object store
 - pack: move prepare_packed_git_run_once to object store
 - object-store: close all packs upon clearing the object store
 - object-store: move packed_git and packed_git_mru to object store
 - object-store: free alt_odb_list
 - object-store: move alt_odb_list and alt_odb_tail to object store
 - object-store: migrate alternates struct and functions from cache.h
 - repository: introduce raw object store field
 (this branch is used by nd/remove-ignore-env-field and sb/packfiles-in-repository.)

 Refactoring the internal global data structure to make it possible
 to open multiple repositories, work with and then close them.


* sb/packfiles-in-repository (2018-02-28) 11 commits
 - packfile: allow find_pack_entry to handle arbitrary repositories
 - packfile: add repository argument to find_pack_entry
 - packfile: allow reprepare_packed_git to handle arbitrary repositories
 - packfile: allow prepare_packed_git to handle arbitrary repositories
 - packfile: allow prepare_packed_git_one to handle arbitrary repositories
 - packfile: add repository argument to reprepare_packed_git
 - packfile: add repository argument to prepare_packed_git
 - packfile: add repository argument to prepare_packed_git_one
 - packfile: allow install_packed_git to handle arbitrary repositories
 - packfile: allow rearrange_packed_git to handle arbitrary repositories
 - packfile: allow prepare_packed_git_mru to handle arbitrary repositories
 (this branch uses sb/object-store; is tangled with nd/remove-ignore-env-field.)


* sg/test-x (2018-02-28) 11 commits
 - travis-ci: run tests with '-x' tracing
 - t/README: add a note about don't saving stderr of compound commands
 - t1510-repo-setup: mark as untraceable with '-x'
 - t9903-bash-prompt: don't check the stderr of __git_ps1()
 - t5570-git-daemon: don't check the stderr of a subshell
 - t5526: use $TRASH_DIRECTORY to specify the path of GIT_TRACE log file
 - t5500-fetch-pack: don't check the stderr of a subshell
 - t3030-merge-recursive: don't check the stderr of a subshell
 - t1507-rev-parse-upstream: don't check the stderr of a shell function
 - t: add means to disable '-x' tracing for individual test scripts
 - t: prevent '-x' tracing from interfering with test helpers' stderr

 Running test scripts under -x option of the shell is often not a
 useful way to debug them, because the error messages from the
 commands tests try to capture and inspect are contaminated by the
 tracing output by the shell.  An earlier work done to make it more
 pleasant to run tests under -x with recent versions of bash is
 extended to cover posix shells that do not support BASH_XTRACEFD.

 Will merge to 'next'.


* ab/gc-auto-in-commit (2018-03-01) 1 commit
 - commit: run git gc --auto just before the post-commit hook

 "git commit" used to run "gc --auto" near the end, which was lost
 when the command was reimplemented in C by mistake.

 Will merge to 'next'.


* ab/pre-auto-gc-battery (2018-02-28) 1 commit
 - hooks/pre-auto-gc-battery: allow gc to run on non-laptops

 A sample auto-gc hook (in contrib/) to skip auto-gc while on
 battery has been updated to almost always allow running auto-gc
 unless on_ac_power command is absolutely sure that we are on
 battery power (earlier, it skipped unless the command is sure that
 we are on ac power).

 Will merge to 'next'.


* ag/userdiff-go-funcname (2018-03-01) 1 commit
 - userdiff: add built-in pattern for golang

 "git diff" and friends learned funcname patterns for Go language
 source files.

 Will merge to 'next'.


* ma/skip-writing-unchanged-index (2018-03-01) 1 commit
 - write_locked_index(): add flag to avoid writing unchanged index
 (this branch uses ma/roll-back-lockfiles.)

 Internal API clean-up to allow write_locked_index() optionally skip
 writing the in-core index when it is not modified.

 May want to merge into ma/roll-back-lockfiles topic before merging
 to 'next'.

--------------------------------------------------
[Stalled]

* np/send-email-header-parsing (2017-12-15) 1 commit
 - send-email: extract email-parsing code into a subroutine

 Code refactoring.

 Undecided but inclined to drop.  A "refactor" without the code that
 benefit from the refactoring is hard to tell from code churn whose
 only effect is potential to introduce bugs.


* sg/travis-build-during-script-phase (2018-01-08) 1 commit
 - travis-ci: build Git during the 'script' phase

 Stalled for too long without any response; will discard.


* av/fsmonitor-updates (2018-01-04) 6 commits
 - fsmonitor: use fsmonitor data in `git diff`
 - fsmonitor: remove debugging lines from t/t7519-status-fsmonitor.sh
 - fsmonitor: make output of test-dump-fsmonitor more concise
 - fsmonitor: update helper tool, now that flags are filled later
 - fsmonitor: stop inline'ing mark_fsmonitor_valid / _invalid
 - dir.c: update comments to match argument name

 Code clean-up on fsmonitor integration, plus optional utilization
 of the fsmonitor data in diff-files.

 Waiting for an update.
 cf. <alpine.DEB.2.21.1.1801042335130.32@MININT-6BKU6QN.europe.corp.microsoft.com>


* pb/bisect-helper-2 (2017-10-28) 8 commits
 - t6030: make various test to pass GETTEXT_POISON tests
 - bisect--helper: `bisect_start` shell function partially in C
 - bisect--helper: `get_terms` & `bisect_terms` shell function in C
 - bisect--helper: `bisect_next_check` shell function in C
 - bisect--helper: `check_and_set_terms` shell function in C
 - wrapper: move is_empty_file() and rename it as is_empty_or_missing_file()
 - bisect--helper: `bisect_write` shell function in C
 - bisect--helper: `bisect_reset` shell function in C

 Expecting a reroll.
 cf. <0102015f5e5ee171-f30f4868-886f-47a1-a4e4-b4936afc545d-000000@eu-west-1.amazonses.com>


* dj/runtime-prefix (2017-12-05) 4 commits
 . exec_cmd: RUNTIME_PREFIX on some POSIX systems
 . Makefile: add Perl runtime prefix support
 . Makefile: add support for "perllibdir"
 . Makefile: generate Perl header from template file

 A build-time option has been added to allow Git to be told to refer
 to its associated files relative to the main binary, in the same
 way that has been possible on Windows for quite some time, for
 Linux, BSDs and Darwin.

 Perhaps it is about time to reboot the effort?


* mk/http-backend-content-length (2017-11-27) 4 commits
 - SQUASH???
 - t5560-http-backend-noserver.sh: add CONTENT_LENGTH cases
 - SQUASH???
 - http-backend: respect CONTENT_LENGTH as specified by rfc3875

 The http-backend (used for smart-http transport) used to slurp the
 whole input until EOF, without paying attention to CONTENT_LENGTH
 that is supplied in the environment and instead expecting the Web
 server to close the input stream.  This has been fixed.

 Expecting a reroll.
 Suggested fixes to be used when rerolling is queued, but I'd
 prefer _not_ squashing them myself.

 Also, it may be too complex solution for the problem.
 cf. <20171204171308.GA13332@sigill.intra.peff.net>


* cc/require-tcl-tk-for-build (2017-11-29) 2 commits
 - travis-ci: avoid new tcl/tk build requirement
 - Makefile: check that tcl/tk is installed

 A first-time builder of Git may have installed neither tclsh nor
 msgfmt, in which case git-gui and gitk part will fail and break the
 build.  As a workaround, refuse to run a build when tclsh is not
 installed and NO_TCLTK is not set.

 Stalled for too long without any response; will discard.
 I still feel that requring tclsh to be installed, with or without
 "escape hatch" for experts, may be too heavy-handed.


* mg/merge-base-fork-point (2017-09-17) 3 commits
 - merge-base: find fork-point outside partial reflog
 - merge-base: return fork-point outside reflog
 - t6010: test actual test output

 "merge-base --fork-point $branch $commit" is used to guess on which
 commit among the commits that were once at the tip of the $branch the
 $commit was built on top of, and it learns these historical tips from
 the reflog of the $branch.  When the true fork-point is lost due to
 pruning of old reflog entries, the command does not give any output,
 because it has no way to guess correctly and does not want to mislead
 the user with a wrong guess.

 The command has been updated to give the best but not known to be
 correct guess, based on a hope that a merge-base between $commit and a
 virtual merge across all the reflog entries that still are available
 for $branch may still be a closer to the true fork-point than the
 merge-base between $commit and the current tip of the $branch.

 This may have to be offered by an additional option, to allow the
 users that are prepared to see a potentially incorrect guess to opt
 into the feature, without affecting the current callers that may not
 be prepared to accept a guess that is not known to be correct.

 Stalled for too long without any response; will discard.


* jk/drop-ancient-curl (2017-08-09) 5 commits
 - http: #error on too-old curl
 - curl: remove ifdef'd code never used with curl >=7.19.4
 - http: drop support for curl < 7.19.4
 - http: drop support for curl < 7.16.0
 - http: drop support for curl < 7.11.1

 Some code in http.c that has bitrot is being removed.

 Expecting a reroll.


* mk/use-size-t-in-zlib (2017-08-10) 1 commit
 . zlib.c: use size_t for size

 The wrapper to call into zlib followed our long tradition to use
 "unsigned long" for sizes of regions in memory, which have been
 updated to use "size_t".

 Needs resurrecting by making sure the fix is good and still applies
 (or adjusted to today's codebase).


* mg/status-in-progress-info (2017-05-10) 2 commits
 - status --short --inprogress: spell it as --in-progress
 - status: show in-progress info for short status

 "git status" learns an option to report various operations
 (e.g. "merging") that the user is in the middle of.

 Stalled for too long without any response; will discard.
 cf. <xmqqmvakcdqw.fsf@gitster.mtv.corp.google.com>

--------------------------------------------------
[Cooking]

* jh/status-no-ahead-behind (2018-01-24) 4 commits
 - status: support --no-ahead-behind in long format
 - status: update short status to respect --no-ahead-behind
 - status: add --[no-]ahead-behind to status and commit for V2 format.
 - stat_tracking_info: return +1 when branches not equal

 "git status" can spend a lot of cycles to compute the relation
 between the current branch and its upstream, which can now be
 disabled with "--no-ahead-behind" option.

 Will merge to 'next'.


* nd/tilde-expand-opt-file-value (2018-02-14) 2 commits
 - init-db: change --template type to OPTION_FILENAME
 - parse-options: expand $HOME on filename options

 "git cmd --opt=~u/path/to/file" did not tilde-expand "~u" part to
 the path to the home directory of user 'u'

 Will discard.
 This may make the resulting whole more confusing, though.
 cf. <87wozffavp.fsf@evledraar.gmail.com>


* jc/allow-ff-merging-kept-tags (2018-02-16) 1 commit
  (merged to 'next' on 2018-02-27 at 8b03610d2b)
 + merge: allow fast-forward when merging a tracked tag

 Since Git 1.7.9, "git merge" defaulted to --no-ff (i.e. even when
 the side branch being merged is a descendant of the current commit,
 create a merge commit instead of fast-forwarding) when merging a
 tag object.  This was appropriate default for integrators who pull
 signed tags from their downstream contributors, but caused an
 unnecessary merges when used by downstream contributors who
 habitually "catch up" their topic branches with tagged releases
 from the upstream.  Update "git merge" to default to --no-ff only
 when merging a tag object that does *not* sit at its usual place in
 refs/tags/ hierarchy, and allow fast-forwarding otherwise, to
 mitigate the problem.

 Will merge to 'master'.


* ab/perl-fixes (2018-02-27) 13 commits
 - perl Git::LoadCPAN: emit better errors under NO_PERL_CPAN_FALLBACKS
 - Makefile: add NO_PERL_CPAN_FALLBACKS knob
 - perl: move the perl/Git/FromCPAN tree to perl/FromCPAN
 - perl: generalize the Git::LoadCPAN facility
 - perl: move CPAN loader wrappers to another namespace
 - perl: update our copy of Mail::Address
 - perl: update our ancient copy of Error.pm
 - git-send-email: unconditionally use Net::{SMTP,Domain}
 - Git.pm: hard-depend on the File::{Temp,Spec} modules
 - gitweb: hard-depend on the Digest::MD5 5.8 module
 - Git.pm: add the "use warnings" pragma
 - Git.pm: remove redundant "use strict" from sub-package
 - perl: *.pm files should not have the executable bit

 Only the first few of a series of several small patches.

 Expecting a reroll.


* ab/simplify-perl-makefile (2018-02-15) 1 commit
  (merged to 'next' on 2018-02-27 at b0d68a2013)
 + Makefile: generate Git(3pm) as dependency of the 'doc' and 'man' targets

 Hotfix for a topic already in 'master'.

 Will merge to 'master'.


* bw/doc-submodule-recurse-config-with-clone (2018-02-21) 1 commit
  (merged to 'next' on 2018-02-27 at 5b12841508)
 + submodule: indicate that 'submodule.recurse' doesn't apply to clone

 Doc update.

 Will merge to 'master'.


* ds/commit-graph (2018-02-20) 13 commits
 - commit-graph: build graph from starting commits
 - commit-graph: read only from specific pack-indexes
 - commit: integrate commit graph with commit parsing
 - commit-graph: close under reachability
 - commit-graph: add core.commitGraph setting
 - commit-graph: implement --delete-expired
 - commit-graph: implement --set-latest
 - commit-graph: implement git commit-graph read
 - commit-graph: implement 'git-commit-graph write'
 - commit-graph: implement write_commit_graph()
 - commit-graph: create git-commit-graph builtin
 - graph: add commit graph design document
 - commit-graph: add format document

 Precompute and store information necessary for ancestry traversal
 in a separate file to optimize graph walking.

 Reroll exists, but it appears that there will be a further reroll.
 cf. <1519698787-190494-1-git-send-email-dstolee@microsoft.com>


* ot/ref-filter-cleanup (2018-02-21) 2 commits
 - ref-filter: get rid of goto
 - ref-filter: get rid of duplicate code

 Code cleanup.

 Will merge to 'next'.


* sb/color-h-cleanup (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-27 at 617345de77)
 + color.h: document and modernize header
 (this branch is used by sb/blame-color.)

 Devdoc update.

 Will merge to 'master'.


* ma/config-page-only-in-list-mode (2018-02-21) 3 commits
 - config: change default of `pager.config` to "on"
 - config: respect `pager.config` in list/get-mode only
 - t7006: add tests for how git config paginates

 In a way similar to how "git tag" learned to honor the pager
 setting only in the list mode, "git config" learned to ignore the
 pager setting when it is used for setting values (i.e. when the
 purpose of the operation is not to "show").

 Is this ready for 'next'?


* ot/cat-batch-format (2018-02-12) 23 commits
 - cat-file: update of docs
 - cat-file: tests for new atoms added
 - for-each-ref: tests for new atoms added
 - ref-filter: unifying formatting of cat-file opts
 - ref-filter: make populate_value() internal again
 - cat-file: reuse printing logic from ref-filter
 - ref-filter: make valid_atom general again
 - ref-filter: make cat_file_info independent
 - cat-file: move skip_object_info into ref-filter
 - ref_filter: add is_atom_used function
 - ref-filter: get rid of mark_atom_in_object_info()
 - cat-file: start reusing populate_value()
 - ref-filter: rename field in ref_array_item stuct
 - ref-filter: make populate_value() global
 - cat-file: start use ref_array_item struct
 - ref-filter: reuse parse_ref_filter_atom()
 - cat-file: start migrating formatting to ref-filter
 - cat-file: split expand_atom() into 2 functions
 - cat-file: move struct expand_data into ref-filter
 - ref-filter: make valid_atom as function parameter
 - cat-file: reuse struct ref_format
 - ref-filter: add return value to some functions
 - ref-filter: get rid of goto

 Teach "cat-file --batch" to reuse the formatting machinery shared
 by for-each-ref, branch --list, and tag --list.

 Allocates flex-array on stack, etc.
 cf. <58b2bdcd-d621-fd21-ab4d-6a9478319b19@ramsayjones.plus.com>
 Will discard--a rebooted effort is beginning elsewhere.


* sg/t6300-modernize (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-27 at b6f13b6915)
 + t6300-for-each-ref: fix "more than one quoting style" tests

 Test update.

 Will merge to 'master'.


* xz/send-email-batch-size (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-27 at da0247d532)
 + send-email: error out when relogin delay is missing

 "git send-email" learned to complain when the batch-size option is
 not defined when the relogin-delay option is, since these two are
 mutually required.

 Will merge to 'master'.


* pw/add-p-recount (2018-03-01) 9 commits
 - add -p: don't rely on apply's '--recount' option
 - add -p: fix counting when splitting and coalescing
 - add -p: calculate offset delta for edited patches
 - add -p: adjust offsets of subsequent hunks when one is skipped
 - t3701: add failing test for pathological context lines
 - t3701: don't hard code sha1 hash values
 - t3701: use test_write_lines and write_script
 - t3701: indent here documents
 - add -i: add function to format hunk header

 "git add -p" has been lazy in coalescing split patches before
 passing the result to underlying "git apply", leading to corner
 case bugs; the logic to prepare the patch to be applied after hunk
 selections has been tightened.

 Will merge to 'next'.


* pw/add-p-single (2018-02-13) 3 commits
  (merged to 'next' on 2018-02-27 at 0e2bd585e3)
 + add -p: improve error messages
 + add -p: only bind search key if there's more than one hunk
 + add -p: only display help for active keys

 "git add -p" used to offer "/" (look for a matching hunk) as a
 choice, even there was only one hunk, which has been corrected.
 Also the single-key help is now given only for keys that are
 enabled (e.g. help for '/' won't be shown when there is only one
 hunk).

 Will merge to 'master'.


* bp/untracked-cache-noflush (2018-02-28) 2 commits
 - untracked cache: use git_env_bool() not getenv() for customization
 - dir.c: don't flag the index as dirty for changes to the untracked cache

 Writing out the index file when the only thing that changed in it
 is the untracked cache information is often wasteful, and this has
 been optimized out.

 Will merge to 'next'.


* nd/diff-stat-with-summary (2018-02-27) 2 commits
 - diff: add --compact-summary
 - diff.c: refactor pprint_rename() to use strbuf

 "git diff" and friends learned "--compact-summary" that shows the
 information usually given with the "--summary" option on the same
 line as the diffstat output of the "--stat" option (which saves
 vertical space and keeps info on a single path at the same place).

 Will merge to 'next'.


* nd/parseopt-completion (2018-02-09) 41 commits
 - completion: use __gitcomp_builtin in _git_worktree
 - completion: use __gitcomp_builtin in _git_tag
 - completion: use __gitcomp_builtin in _git_status
 - completion: use __gitcomp_builtin in _git_show_branch
 - completion: use __gitcomp_builtin in _git_rm
 - completion: use __gitcomp_builtin in _git_revert
 - completion: use __gitcomp_builtin in _git_reset
 - completion: use __gitcomp_builtin in _git_replace
 - remote: force completing --mirror= instead of --mirror
 - completion: use __gitcomp_builtin in _git_remote
 - completion: use __gitcomp_builtin in _git_push
 - completion: use __gitcomp_builtin in _git_pull
 - completion: use __gitcomp_builtin in _git_notes
 - completion: use __gitcomp_builtin in _git_name_rev
 - completion: use __gitcomp_builtin in _git_mv
 - completion: use __gitcomp_builtin in _git_merge_base
 - completion: use __gitcomp_builtin in _git_merge
 - completion: use __gitcomp_builtin in _git_ls_remote
 - completion: use __gitcomp_builtin in _git_ls_files
 - completion: use __gitcomp_builtin in _git_init
 - completion: use __gitcomp_builtin in _git_help
 - completion: use __gitcomp_builtin in _git_grep
 - completion: use __gitcomp_builtin in _git_gc
 - completion: use __gitcomp_builtin in _git_fsck
 - completion: use __gitcomp_builtin in _git_fetch
 - completion: use __gitcomp_builtin in _git_difftool
 - completion: use __gitcomp_builtin in _git_describe
 - completion: use __gitcomp_builtin in _git_config
 - completion: use __gitcomp_builtin in _git_commit
 - completion: use __gitcomp_builtin in _git_clone
 - completion: use __gitcomp_builtin in _git_clean
 - completion: use __gitcomp_builtin in _git_cherry_pick
 - completion: use __gitcomp_builtin in _git_checkout
 - completion: use __gitcomp_builtin in _git_branch
 - completion: use __gitcomp_builtin in _git_apply
 - completion: use __gitcomp_builtin in _git_am
 - completion: use __gitcomp_builtin in _git_add
 - git-completion.bash: introduce __gitcomp_builtin
 - parse-options: let OPT__FORCE take optional flags argument
 - parse-options: add OPT_xxx_F() variants
 - parse-options: support --git-completion-helper

 Teach parse-options API an option to help the completion script,
 and make use of the mechanism in command line completion.

 Will merge to 'next'.


* pc/submodule-helper-foreach (2018-02-02) 5 commits
 - submodule: port submodule subcommand 'foreach' from shell to C
 - submodule foreach: document variable '$displaypath'
 - submodule foreach: clarify the '$toplevel' variable documentation
 - submodule foreach: document '$sm_path' instead of '$path'
 - submodule foreach: correct '$path' in nested submodules from a subdirectory

 Expecting a response to review comments
 e.g. cf. <20180206150044.1bffbb573c088d38c8e44bf5@google.com>


* tg/worktree-add-existing-branch (2018-02-05) 3 commits
 - worktree: teach "add" to check out existing branches
 - worktree: be clearer when "add" dwim-ery kicks in
 - worktree: improve message when creating a new worktree

 "git worktree add" learned to check out an existing branch.

 Expecting a reroll.
 cf. <CAPig+cRLohiqR_Drh7P0q3XbvC22WLjNwH0YLZo3dqFzZZuAPw@mail.gmail.com>
 cf. <CACsJy8BEKYqW+Ne_WY2RBaSbb9OKcjREtrawStj=eJsVsia_Jw@mail.gmail.com>
 The general idea is good, just end-user facing messages are found
 suboptimal.


* nm/tag-edit (2018-02-07) 1 commit
  (merged to 'next' on 2018-02-27 at 3bc8345213)
 + tag: add --edit option

 "git tag" learned an explicit "--edit" option that allows the
 message given via "-m" and "-F" to be further edited.

 Will merge to 'master'.


* sm/mv-dry-run-update (2018-02-07) 2 commits
  (merged to 'next' on 2018-02-27 at 17eef62ddf)
 + mv: remove unneeded 'if (!show_only)'
 + t7001: add test case for --dry-run

 Code clean-up.

 Will merge to 'master'.


* ab/fetch-prune (2018-02-09) 17 commits
  (merged to 'next' on 2018-02-27 at eafb648dd9)
 + fetch: make the --prune-tags work with <url>
 + fetch: add a --prune-tags option and fetch.pruneTags config
 + fetch tests: add scaffolding for the new fetch.pruneTags
 + git-fetch & config doc: link to the new PRUNING section
 + git remote doc: correct dangerous lies about what prune does
 + git fetch doc: add a new section to explain the ins & outs of pruning
 + fetch tests: fetch <url> <spec> as well as fetch [<remote>]
 + fetch tests: expand case/esac for later change
 + fetch tests: double quote a variable for interpolation
 + fetch tests: test --prune and refspec interaction
 + fetch tests: add a tag to be deleted to the pruning tests
 + fetch tests: re-arrange arguments for future readability
 + fetch tests: refactor in preparation for testing tag pruning
 + remote: add a macro for "refs/tags/*:refs/tags/*"
 + fetch: stop accessing "remote" variable indirectly
 + fetch: trivially refactor assignment to ref_nr
 + fetch: don't redundantly NULL something calloc() gave us

 Clarify how configured fetch refspecs interact with the "--prune"
 option of "git fetch", and also add a handy short-hand for getting
 rid of stale tags that are locally held.

 Will merge to 'master'.


* bw/c-plus-plus (2018-02-22) 37 commits
  (merged to 'next' on 2018-02-27 at daf85c03de)
 + replace: rename 'new' variables
 + trailer: rename 'template' variables
 + tempfile: rename 'template' variables
 + wrapper: rename 'template' variables
 + environment: rename 'namespace' variables
 + diff: rename 'template' variables
 + environment: rename 'template' variables
 + init-db: rename 'template' variables
 + unpack-trees: rename 'new' variables
 + trailer: rename 'new' variables
 + submodule: rename 'new' variables
 + split-index: rename 'new' variables
 + remote: rename 'new' variables
 + ref-filter: rename 'new' variables
 + read-cache: rename 'new' variables
 + line-log: rename 'new' variables
 + imap-send: rename 'new' variables
 + http: rename 'new' variables
 + entry: rename 'new' variables
 + diffcore-delta: rename 'new' variables
 + diff: rename 'new' variables
 + diff-lib: rename 'new' variable
 + commit: rename 'new' variables
 + combine-diff: rename 'new' variables
 + remote: rename 'new' variables
 + reflog: rename 'new' variables
 + pack-redundant: rename 'new' variables
 + help: rename 'new' variables
 + checkout: rename 'new' variables
 + apply: rename 'new' variables
 + apply: rename 'try' variables
 + diff: rename 'this' variables
 + rev-parse: rename 'this' variable
 + pack-objects: rename 'this' variables
 + blame: rename 'this' variables
 + object: rename function 'typename' to 'type_name'
 + object_info: change member name from 'typename' to 'type_name'

 Avoid using identifiers that clash with C++ keywords.  Even though
 it is not a goal to compile Git with C++ compilers, changes like
 this help use of code analysis tools that targets C++ on our
 codebase.

 Will merge to 'master'.


* nd/rebase-show-current-patch (2018-02-12) 3 commits
  (merged to 'next' on 2018-02-27 at 5a4e23a77c)
 + rebase: introduce and use pseudo-ref REBASE_HEAD
 + rebase: add --show-current-patch
 + am: add --show-current-patch

 The new "--show-current-patch" option gives an end-user facing way
 to get the diff being applied when "git rebase" (and "git am")
 stops with a conflict.

 Will merge to 'master'.


* nd/worktree-move (2018-02-12) 7 commits
 - worktree remove: allow it when $GIT_WORK_TREE is already gone
 - worktree remove: new command
 - worktree move: refuse to move worktrees with submodules
 - worktree move: accept destination as directory
 - worktree move: new command
 - worktree.c: add update_worktree_location()
 - worktree.c: add validate_worktree()

 "git worktree" learned move and remove subcommands.

 Will merge to 'next'.


* cl/send-email-reply-to (2018-01-17) 2 commits
 - send-email: support separate "Reply-To" address
 - send-email: rename variables for "In-reply-to" to $foo_in_reply_to

 "git send-email" learned "--reply-to=<address>" option.

 May want to get the log messages updated.
 cf. <CAN0heSqxmLoh33i65JPhyQbmPaAcJcwrTCO+ZD4eb+qh8Pf8+w@mail.gmail.com>


* js/rebase-recreate-merge (2018-02-23) 12 commits
 - rebase -i: introduce --recreate-merges=[no-]rebase-cousins
 - pull: accept --rebase=recreate to recreate the branch topology
 - sequencer: handle post-rewrite for merge commands
 - sequencer: make refs generated by the `label` command worktree-local
 - rebase: introduce the --recreate-merges option
 - rebase-helper --make-script: introduce a flag to recreate merges
 - sequencer: fast-forward merge commits, if possible
 - sequencer: introduce the `merge` command
 - sequencer: introduce new commands to reset the revision
 - git-rebase--interactive: clarify arguments
 - sequencer: make rearrange_squash() a bit more obvious
 - sequencer: avoid using errno clobbered by rollback_lock_file()

 "git rebase" learned "--recreate-merges" to transplant the whole
 topology of commit graph elsewhere.

 Will merge to 'next'.


* bw/protocol-v2 (2018-03-01) 35 commits
 - remote-curl: don't request v2 when pushing
 - remote-curl: implement stateless-connect command
 - http: eliminate "# service" line when using protocol v2
 - http: don't always add Git-Protocol header
 - http: allow providing extra headers for http requests
 - remote-curl: store the protocol version the server responded with
 - remote-curl: create copy of the service name
 - pkt-line: add packet_buf_write_len function
 - transport-helper: introduce stateless-connect
 - transport-helper: refactor process_connect_service
 - transport-helper: remove name parameter
 - connect: don't request v2 when pushing
 - connect: refactor git_connect to only get the protocol version once
 - fetch-pack: support shallow requests
 - fetch-pack: perform a fetch using v2
 - upload-pack: introduce fetch server command
 - push: pass ref patterns when pushing
 - fetch: pass ref patterns when fetching
 - ls-remote: pass ref patterns when requesting a remote's refs
 - transport: convert transport_get_remote_refs to take a list of ref patterns
 - transport: convert get_refs_list to take a list of ref patterns
 - connect: request remote refs using v2
 - ls-refs: introduce ls-refs server command
 - serve: introduce git-serve
 - test-pkt-line: introduce a packet-line test helper
 - protocol: introduce enum protocol_version value protocol_v2
 - transport: store protocol version
 - connect: discover protocol version outside of get_remote_heads
 - connect: convert get_remote_heads to use struct packet_reader
 - transport: use get_refs_via_connect to get refs
 - upload-pack: factor out processing lines
 - upload-pack: convert to a builtin
 - pkt-line: add delim packet support
 - pkt-line: allow peeking a packet line without consuming it
 - pkt-line: introduce packet_read_with_status

 The beginning of the next-gen transfer protocol.


* ls/checkout-encoding (2018-03-01) 7 commits
 - convert: add round trip check based on 'core.checkRoundtripEncoding'
 - convert: add tracing for 'working-tree-encoding' attribute
 - convert: add 'working-tree-encoding' attribute
 - utf8: add function to detect a missing UTF-16/32 BOM
 - utf8: add function to detect prohibited UTF-16/32 BOM
 - strbuf: add xstrdup_toupper()
 - strbuf: remove unnecessary NUL assignment in xstrdup_tolower()

 The new "checkout-encoding" attribute can ask Git to convert the
 contents to the specified encoding when checking out to the working
 tree (and the other way around when checking in).

 Expecting a reroll; it is almost there, though.
 cf. <CAPig+cR81J3fTOtrgAumAs=RC5hqYFfSmeb-ru-Yf_ahFuBiew@mail.gmail.com>
 cf. <8EE59DC3-69E0-412B-AC50-5D348D6D5BE0@gmail.com>


* sb/blame-color (2018-02-13) 3 commits
 - builtin/blame: highlight recently changed lines
 - builtin/blame: add option to color metadata fields separately
 - builtin/blame: dim uninteresting metadata
 (this branch uses sb/color-h-cleanup.)

 Expecting a reroll.
 cf. https://public-inbox.org/git/20171110011002.10179-1-sbeller@google.com/#t
 error messages are funny, can segfault, ...


* en/rename-directory-detection (2018-02-27) 29 commits
 - merge-recursive: ensure we write updates for directory-renamed file
 - merge-recursive: avoid spurious rename/rename conflict from dir renames
 - directory rename detection: new testcases showcasing a pair of bugs
 - merge-recursive: fix remaining directory rename + dirty overwrite cases
 - merge-recursive: fix overwriting dirty files involved in renames
 - merge-recursive: avoid clobbering untracked files with directory renames
 - merge-recursive: apply necessary modifications for directory renames
 - merge-recursive: when comparing files, don't include trees
 - merge-recursive: check for file level conflicts then get new name
 - merge-recursive: add computation of collisions due to dir rename & merging
 - merge-recursive: check for directory level conflicts
 - merge-recursive: add get_directory_renames()
 - merge-recursive: make a helper function for cleanup for handle_renames
 - merge-recursive: split out code for determining diff_filepairs
 - merge-recursive: make !o->detect_rename codepath more obvious
 - merge-recursive: fix leaks of allocated renames and diff_filepairs
 - merge-recursive: introduce new functions to handle rename logic
 - merge-recursive: move the get_renames() function
 - directory rename detection: tests for handling overwriting dirty files
 - directory rename detection: tests for handling overwriting untracked files
 - directory rename detection: miscellaneous testcases to complete coverage
 - directory rename detection: testcases exploring possibly suboptimal merges
 - directory rename detection: more involved edge/corner testcases
 - directory rename detection: testcases checking which side did the rename
 - directory rename detection: files/directories in the way of some renames
 - directory rename detection: partially renamed directory testcase/discussion
 - directory rename detection: testcases to avoid taking detection too far
 - directory rename detection: directory splitting testcases
 - directory rename detection: basic testcases

 Rename detection logic in "diff" family that is used in "merge" has
 learned to guess when all of x/a, x/b and x/c have moved to z/a,
 z/b and z/c, it is likely that x/d added in the meantime would also
 want to move to z/d by taking the hint that the entire directory
 'x' moved to 'z'.  A bug causing dirty files involved in a rename
 to be overwritten during merge has also been fixed as part of this
 work.

 Will merge to 'next'.

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Feb 2018, #03; Wed, 21)
@ 2018-02-22  0:31  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2018-02-22  0:31 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* ab/sha1dc-build (2017-12-08) 3 commits
  (merged to 'next' on 2018-02-08 at ba9ff2b836)
 + sha1dc_git.h: re-arrange an ifdef chain for a subsequent change
 + Makefile: under "make dist", include the sha1collisiondetection submodule
 + Makefile: don't error out under DC_SHA1_EXTERNAL if DC_SHA1_SUBMODULE=auto

 Push the submodule version of collision-detecting SHA-1 hash
 implementation a bit harder on builders.


* ab/wildmatch-tests (2018-01-30) 10 commits
  (merged to 'next' on 2018-02-08 at f999a3d732)
 + wildmatch test: mark test as EXPENSIVE_ON_WINDOWS
 + test-lib: add an EXPENSIVE_ON_WINDOWS prerequisite
 + wildmatch test: create & test files on disk in addition to in-memory
 + wildmatch test: perform all tests under all wildmatch() modes
 + wildmatch test: use test_must_fail, not ! for test-wildmatch
 + wildmatch test: remove dead fnmatch() test code
 + wildmatch test: use a paranoia pattern from nul_match()
 + wildmatch test: don't try to vertically align our output
 + wildmatch test: use more standard shell style
 + wildmatch test: indent with tabs, not spaces

 More tests for wildmatch functions.


* bc/hash-algo (2018-02-09) 13 commits
  (merged to 'next' on 2018-02-09 at 4437f3f132)
 + hash: update obsolete reference to SHA1_HEADER
  (merged to 'next' on 2018-02-08 at 18f36d12ed)
 + bulk-checkin: abstract SHA-1 usage
 + csum-file: abstract uses of SHA-1
 + csum-file: rename sha1file to hashfile
 + read-cache: abstract away uses of SHA-1
 + pack-write: switch various SHA-1 values to abstract forms
 + pack-check: convert various uses of SHA-1 to abstract forms
 + fast-import: switch various uses of SHA-1 to the_hash_algo
 + sha1_file: switch uses of SHA-1 to the_hash_algo
 + builtin/unpack-objects: switch uses of SHA-1 to the_hash_algo
 + builtin/index-pack: improve hash function abstraction
 + hash: create union for hash context allocation
 + hash: move SHA-1 macros to hash.h

 More abstraction of hash function from the codepath.


* cc/perf-aggregate (2018-02-02) 3 commits
  (merged to 'next' on 2018-02-08 at d8f074e6fb)
 + perf/aggregate: sort JSON fields in output
 + perf/aggregate: add --reponame option
 + perf/aggregate: add --subsection option

 "make perf" enhancement.


* en/merge-recursive-fixes (2018-01-19) 3 commits
  (merged to 'next' on 2018-02-08 at c254292070)
 + merge-recursive: add explanation for src_entry and dst_entry
 + merge-recursive: fix logic ordering issue
 + Tighten and correct a few testcases for merging and cherry-picking
 (this branch is used by en/rename-directory-detection.)


* gs/rebase-allow-empty-message (2018-02-07) 1 commit
  (merged to 'next' on 2018-02-08 at 9d81a2496c)
 + rebase: add --allow-empty-message option

 "git rebase" learned to take "--allow-empty-message" option.


* jc/worktree-add-short-help (2018-01-17) 1 commit
  (merged to 'next' on 2018-02-08 at 9f59ca72ab)
 + worktree: say that "add" takes an arbitrary commit in short-help

 Error message fix.


* jt/fsck-code-cleanup (2018-01-23) 1 commit
  (merged to 'next' on 2018-02-08 at 199ad41486)
 + fsck: fix leak when traversing trees

 Plug recently introduced leaks in fsck.


* kg/packed-ref-cache-fix (2018-01-24) 6 commits
  (merged to 'next' on 2018-02-08 at 370f06a565)
 + packed_ref_cache: don't use mmap() for small files
 + load_contents(): don't try to mmap an empty file
 + packed_ref_iterator_begin(): make optimization more general
 + find_reference_location(): make function safe for empty snapshots
 + create_snapshot(): use `xmemdupz()` rather than a strbuf
 + struct snapshot: store `start` rather than `header_len`

 Avoid mmapping small files while using packed refs (especially ones
 with zero size, which would cause later munmap() to fail).
 A change to a binsearch loop to work around picky complers was
 unnecessarily hard to reason about, but it should do.


* lw/daemon-log-destination (2018-02-05) 1 commit
  (merged to 'next' on 2018-02-08 at da91bd56f4)
 + daemon: add --log-destination=(stderr|syslog|none)

 The log from "git daemon" can be redirected with a new option; one
 relevant use case is to send the log to standard error (instead of
 syslog) when running it from inetd.


* nd/format-patch-stat-width (2018-02-02) 2 commits
  (merged to 'next' on 2018-02-08 at c03e8a084e)
 + format-patch: reduce patch diffstat width to 72
 + format-patch: keep cover-letter diffstat wrapped in 72 columns

 "git format-patch" learned to give 72-cols to diffstat, which is
 consistent with other line length limits the subcommand uses for
 its output meant for e-mails.


* nd/ignore-glob-doc-update (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 22ba92e49b)
 + gitignore.txt: elaborate shell glob syntax

 Doc update.


* nd/trace-index-ops (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 91e362b26a)
 + trace: measure where the time is spent in the index-heavy operations


* po/object-id (2018-01-30) 12 commits
  (merged to 'next' on 2018-02-08 at 701311e8ea)
 + sha1_file: rename hash_sha1_file_literally
 + sha1_file: convert write_loose_object to object_id
 + sha1_file: convert force_object_loose to object_id
 + sha1_file: convert write_sha1_file to object_id
 + notes: convert write_notes_tree to object_id
 + notes: convert combine_notes_* to object_id
 + commit: convert commit_tree* to object_id
 + match-trees: convert splice_tree to object_id
 + cache: clear whole hash buffer with oidclr
 + sha1_file: convert hash_sha1_file to object_id
 + dir: convert struct sha1_stat to use object_id
 + sha1_file: convert pretend_sha1_file to object_id

 Conversion from uchar[20] to struct object_id continues.


* rs/cocci-strbuf-addf-to-addstr (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 0016008a97)
 + cocci: simplify check for trivial format strings


* sb/pull-rebase-submodule (2018-01-25) 1 commit
  (merged to 'next' on 2018-02-08 at 38fa97f855)
 + builtin/pull: respect verbosity settings in submodules

 "git pull --rebase" did not pass verbosity setting down when
 recursing into a submodule.


* sg/test-i18ngrep (2018-02-08) 9 commits
  (merged to 'next' on 2018-02-08 at e83eb33909)
 + t: make 'test_i18ngrep' more informative on failure
 + t: validate 'test_i18ngrep's parameters
 + t: move 'test_i18ncmp' and 'test_i18ngrep' to 'test-lib-functions.sh'
 + t5536: let 'test_i18ngrep' read the file without redirection
 + t5510: consolidate 'grep' and 'test_i18ngrep' patterns
 + t4001: don't run 'git status' upstream of a pipe
 + t6022: don't run 'git merge' upstream of a pipe
 + t5812: add 'test_i18ngrep's missing filename parameter
 + t5541: add 'test_i18ngrep's missing filename parameter

 Test fixes.


* tg/reset-hard-show-head-with-pretty (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 596a4ec00d)
 + reset --hard: make use of the pretty machinery

 The way "git reset --hard" reports the commit the updated HEAD
 points at is made consistent with the way how the commit title is
 generated by the other parts of the system.  This matters when the
 title is spread across physically multiple lines.

--------------------------------------------------
[New Topics]

* bp/fsmonitor (2018-02-14) 1 commit
  (merged to 'next' on 2018-02-14 at 5c508858fb)
 + fsmonitor: update documentation to remove reference to invalid config settings

 Doc update for a recently added feature.

 Will merge to 'master'.


* jk/sq-dequote-on-bogus-input (2018-02-14) 1 commit
  (merged to 'next' on 2018-02-14 at 75d4f1eaf8)
 + sq_dequote: fix extra consumption of source string

 Code to unquote single-quoted string (used in the parser for
 configuration files, etc.) did not diagnose bogus input correctly
 and produced bogus results instead.

 Will merge to 'master'.


* jk/test-hashmap-updates (2018-02-14) 6 commits
  (merged to 'next' on 2018-02-14 at a61a9bd8f0)
 + test-hashmap: use "unsigned int" for hash storage
 + test-hashmap: simplify alloc_test_entry
 + test-hashmap: use strbuf_getline rather than fgets
 + test-hashmap: use xsnprintf rather than snprintf
 + test-hashmap: check allocation computation for overflow
 + test-hashmap: use ALLOC_ARRAY rather than bare malloc

 Code clean-up.

 Will merge to 'master'.


* nd/am-quit (2018-02-14) 1 commit
  (merged to 'next' on 2018-02-21 at 9a9cb40c2f)
 + am: support --quit

 "git am" has learned "--quit" option, in addition to the existing
 "--abort" option; having the pair mirrors a few other commands like
 "rebase" and "cherry-pick".

 Will merge to 'master'.


* nd/tilde-expand-opt-file-value (2018-02-14) 2 commits
 - init-db: change --template type to OPTION_FILENAME
 - parse-options: expand $HOME on filename options

 "git cmd --opt=~u/path/to/file" did not tilde-expand "~u" part to
 the path to the home directory of user 'u'

 Will discard.
 This may make the resulting whole more confusing, though.
 cf. <87wozffavp.fsf@evledraar.gmail.com>


* rd/typofix (2018-02-14) 2 commits
  (merged to 'next' on 2018-02-14 at e770601de4)
 + Correct mispellings of ".gitmodule" to ".gitmodules"
 + t/: correct obvious typo "detahced"

 Typofix.

 Will merge to 'master'.


* jc/allow-ff-merging-kept-tags (2018-02-16) 1 commit
 - merge: allow fast-forward when merging a tracked tag

 Since Git 1.7.9, "git merge" defaulted to --no-ff (i.e. even when
 the side branch being merged is a descendant of the current commit,
 create a merge commit instead of fast-forwarding) when merging a
 tag object.  This was appropriate default for integrators who pull
 signed tags from their downstream contributors, but caused an
 unnecessary merges when used by downstream contributors who
 habitually "catch up" their topic branches with tagged releases
 from the upstream.  Update "git merge" to default to --no-ff only
 when merging a tag object that does *not* sit at its usual place in
 refs/tags/ hierarchy, and allow fast-forwarding otherwise, to
 mitigate the problem.

 Will merge to 'next'.


* ab/perl-fixes (2018-02-15) 2 commits
 - perl: move CPAN loader wrappers to another namespace
 - perl: *.pm files should not have the executable bit

 Only the first few of a series of several small patches.

 Expecting a reroll.


* ab/simplify-perl-makefile (2018-02-15) 1 commit
 - Makefile: generate Git(3pm) as dependency of the 'doc' and 'man' targets

 Hotfix for a topic already in 'master'.

 Will merge to 'next'.


* es/worktree-add-post-checkout-hook (2018-02-15) 1 commit
  (merged to 'next' on 2018-02-21 at 6ef6a130bf)
 + worktree: add: fix 'post-checkout' not knowing new worktree location

 "git worktree add" learned to run the post-checkout hook, just like
 "git clone" runs it upon the initial checkout.

 Will merge to 'master'.


* sb/status-doc-fix (2018-02-15) 1 commit
  (merged to 'next' on 2018-02-21 at 5e68f3dac8)
 + Documentation/git-status: clarify status table for porcelain mode

 Docfix.

 Will merge to 'master'.


* tk/apply-dev-null-verify-name-fix (2018-02-15) 2 commits
  (merged to 'next' on 2018-02-21 at dab449203b)
 + apply: handle Subversion diffs with /dev/null gracefully
 + apply: demonstrate a problem applying svn diffs

 Many places in "git apply" knew that "/dev/null" that signals
 "there is no such file on this side of the diff" can be followed by
 whitespace and garbage when parsing a patch, except for one, which
 made an otherwise valid patch (e.g. ones from subversion) rejected.

 Will merge to 'master'.


* gs/test-unset-xdg-cache-home (2018-02-16) 1 commit
  (merged to 'next' on 2018-02-21 at 9aec46d404)
 + test-lib.sh: unset XDG_CACHE_HOME

 Test update.

 Will merge to 'master'.


* tg/worktree-create-tracking (2018-02-16) 2 commits
  (merged to 'next' on 2018-02-21 at 3e00a10cd8)
 + git-worktree.txt: fix indentation of example and text of 'add' command
 + git-worktree.txt: fix missing ")" typo

 Hotfix for a recent topic.

 Will merge to 'master'.


* jk/push-options-via-transport-fix (2018-02-20) 2 commits
  (merged to 'next' on 2018-02-21 at a037cbfa2b)
 + remote-curl: unquote incoming push-options
 + t5545: factor out http repository setup

 "git push" over http transport did not unquote the push-options
 correctly.

 Will merge to 'master'.


* tz/do-not-clean-spec-file (2018-02-17) 1 commit
  (merged to 'next' on 2018-02-21 at c1336418a8)
 + Makefile: remove *.spec from clean target

 We no longer create any *.spec file, so "make clean" should not
 remove it.

 Will merge to 'master'.


* bw/doc-submodule-recurse-config-with-clone (2018-02-21) 1 commit
 - submodule: indicate that 'submodule.recurse' doesn't apply to clone

 Doc update.

 Will merge to 'next'.


* ds/commit-graph (2018-02-20) 13 commits
 - commit-graph: build graph from starting commits
 - commit-graph: read only from specific pack-indexes
 - commit: integrate commit graph with commit parsing
 - commit-graph: close under reachability
 - commit-graph: add core.commitGraph setting
 - commit-graph: implement --delete-expired
 - commit-graph: implement --set-latest
 - commit-graph: implement git commit-graph read
 - commit-graph: implement 'git-commit-graph write'
 - commit-graph: implement write_commit_graph()
 - commit-graph: create git-commit-graph builtin
 - graph: add commit graph design document
 - commit-graph: add format document
 (this branch uses jt/binsearch-with-fanout.)


* ot/ref-filter-cleanup (2018-02-21) 2 commits
 - ref-filter: get rid of goto
 - ref-filter: get rid of duplicate code

--------------------------------------------------
[Stalled]

* np/send-email-header-parsing (2017-12-15) 1 commit
 - send-email: extract email-parsing code into a subroutine

 Code refactoring.

 Undecided but inclined to drop.  A "refactor" without the code that
 benefit from the refactoring is hard to tell from code churn whose
 only effect is potential to introduce bugs.


* sg/travis-build-during-script-phase (2018-01-08) 1 commit
 - travis-ci: build Git during the 'script' phase

 So... what do we want to do with this thing?


* jh/status-no-ahead-behind (2018-01-24) 4 commits
 - status: support --no-ahead-behind in long format
 - status: update short status to respect --no-ahead-behind
 - status: add --[no-]ahead-behind to status and commit for V2 format.
 - stat_tracking_info: return +1 when branches not equal

 "git status" can spend a lot of cycles to compute the relation
 between the current branch and its upstream, which can now be
 disabled with "--no-ahead-behind" option.

 At v5; is this ready for 'next'?


* av/fsmonitor-updates (2018-01-04) 6 commits
 - fsmonitor: use fsmonitor data in `git diff`
 - fsmonitor: remove debugging lines from t/t7519-status-fsmonitor.sh
 - fsmonitor: make output of test-dump-fsmonitor more concise
 - fsmonitor: update helper tool, now that flags are filled later
 - fsmonitor: stop inline'ing mark_fsmonitor_valid / _invalid
 - dir.c: update comments to match argument name

 Code clean-up on fsmonitor integration, plus optional utilization
 of the fsmonitor data in diff-files.

 Waiting for an update.
 cf. <alpine.DEB.2.21.1.1801042335130.32@MININT-6BKU6QN.europe.corp.microsoft.com>


* pb/bisect-helper-2 (2017-10-28) 8 commits
 - t6030: make various test to pass GETTEXT_POISON tests
 - bisect--helper: `bisect_start` shell function partially in C
 - bisect--helper: `get_terms` & `bisect_terms` shell function in C
 - bisect--helper: `bisect_next_check` shell function in C
 - bisect--helper: `check_and_set_terms` shell function in C
 - wrapper: move is_empty_file() and rename it as is_empty_or_missing_file()
 - bisect--helper: `bisect_write` shell function in C
 - bisect--helper: `bisect_reset` shell function in C

 Expecting a reroll.
 cf. <0102015f5e5ee171-f30f4868-886f-47a1-a4e4-b4936afc545d-000000@eu-west-1.amazonses.com>


* dj/runtime-prefix (2017-12-05) 4 commits
 . exec_cmd: RUNTIME_PREFIX on some POSIX systems
 . Makefile: add Perl runtime prefix support
 . Makefile: add support for "perllibdir"
 . Makefile: generate Perl header from template file

 A build-time option has been added to allow Git to be told to refer
 to its associated files relative to the main binary, in the same
 way that has been possible on Windows for quite some time, for
 Linux, BSDs and Darwin.

 Tentatively kicked out of 'next' to see how well another topic
 ab/simplify-perl-makefile that heavily conflicts with this fares.


* mk/http-backend-content-length (2017-11-27) 4 commits
 - SQUASH???
 - t5560-http-backend-noserver.sh: add CONTENT_LENGTH cases
 - SQUASH???
 - http-backend: respect CONTENT_LENGTH as specified by rfc3875

 The http-backend (used for smart-http transport) used to slurp the
 whole input until EOF, without paying attention to CONTENT_LENGTH
 that is supplied in the environment and instead expecting the Web
 server to close the input stream.  This has been fixed.

 Expecting a reroll.
 Suggested fixes to be used when rerolling is queued, but I'd
 prefer _not_ squashing them myself.

 Also, it may be too complex solution for the problem.
 cf. <20171204171308.GA13332@sigill.intra.peff.net>


* cc/require-tcl-tk-for-build (2017-11-29) 2 commits
 - travis-ci: avoid new tcl/tk build requirement
 - Makefile: check that tcl/tk is installed

 A first-time builder of Git may have installed neither tclsh nor
 msgfmt, in which case git-gui and gitk part will fail and break the
 build.  As a workaround, refuse to run a build when tclsh is not
 installed and NO_TCLTK is not set.

 Undecided.
 I still feel that requring tclsh to be installed, with or without
 "escape hatch" for experts, may be too heavy-handed.


* mg/merge-base-fork-point (2017-09-17) 3 commits
 - merge-base: find fork-point outside partial reflog
 - merge-base: return fork-point outside reflog
 - t6010: test actual test output

 "merge-base --fork-point $branch $commit" is used to guess on which
 commit among the commits that were once at the tip of the $branch the
 $commit was built on top of, and it learns these historical tips from
 the reflog of the $branch.  When the true fork-point is lost due to
 pruning of old reflog entries, the command does not give any output,
 because it has no way to guess correctly and does not want to mislead
 the user with a wrong guess.

 The command has been updated to give the best but not known to be
 correct guess, based on a hope that a merge-base between $commit and a
 virtual merge across all the reflog entries that still are available
 for $branch may still be a closer to the true fork-point than the
 merge-base between $commit and the current tip of the $branch.

 This may have to be offered by an additional option, to allow the
 users that are prepared to see a potentially incorrect guess to opt
 into the feature, without affecting the current callers that may not
 be prepared to accept a guess that is not known to be correct.

 What's the doneness of this one?


* jk/drop-ancient-curl (2017-08-09) 5 commits
 - http: #error on too-old curl
 - curl: remove ifdef'd code never used with curl >=7.19.4
 - http: drop support for curl < 7.19.4
 - http: drop support for curl < 7.16.0
 - http: drop support for curl < 7.11.1

 Some code in http.c that has bitrot is being removed.

 Expecting a reroll.


* mk/use-size-t-in-zlib (2017-08-10) 1 commit
 . zlib.c: use size_t for size

 The wrapper to call into zlib followed our long tradition to use
 "unsigned long" for sizes of regions in memory, which have been
 updated to use "size_t".

 Needs resurrecting by making sure the fix is good and still applies
 (or adjusted to today's codebase).


* mg/status-in-progress-info (2017-05-10) 2 commits
 - status --short --inprogress: spell it as --in-progress
 - status: show in-progress info for short status

 "git status" learns an option to report various operations
 (e.g. "merging") that the user is in the middle of.

 cf. <xmqqmvakcdqw.fsf@gitster.mtv.corp.google.com>

--------------------------------------------------
[Cooking]

* bp/name-hash-dirname-fix (2018-02-08) 1 commit
  (merged to 'next' on 2018-02-14 at 2f564fb4b3)
 + name-hash: properly fold directory names in adjust_dirname_case()

 "git add" files in the same directory, but spelling the directory
 path in different cases on case insensitive filesystem, corrupted
 the name hash data structure and led to unexpected results.  This
 has been corrected.

 Will merge to 'master'.


* jk/doc-do-not-write-extern (2018-02-08) 1 commit
  (merged to 'next' on 2018-02-14 at e55b5127de)
 + CodingGuidelines: mention "static" and "extern"

 Devdoc update.

 Will merge to 'master'.


* jk/gettext-poison (2018-02-08) 2 commits
  (merged to 'next' on 2018-02-14 at cca3719a59)
 + git-sh-i18n: check GETTEXT_POISON before USE_GETTEXT_SCHEME
 + t0205: drop redundant test

 Test updates.

 Will merge to 'master'.


* js/fix-merge-arg-quoting-in-rebase-p (2018-02-08) 1 commit
  (merged to 'next' on 2018-02-14 at 27ebf001a1)
 + rebase -p: fix incorrect commit message when calling `git merge`.

 "git rebase -p" mangled log messages of a merge commit, which is
 now fixed.

 Will merge to 'master'.


* js/packet-read-line-check-null (2018-02-08) 2 commits
  (merged to 'next' on 2018-02-14 at 6ba237b284)
 + always check for NULL return from packet_read_line()
 + correct error messages for NULL packet_read_line()

 Some low level protocol codepath could crash when they get an
 unexpected flush packet, which is now fixed.

 Will merge to 'master'.


* sb/color-h-cleanup (2018-02-13) 1 commit
 - color.h: document and modernize header
 (this branch is used by sb/blame-color.)

 Devdoc update.

 Will merge to 'next'.


* ab/untracked-cache-invalidation-docs (2018-02-09) 2 commits
  (merged to 'next' on 2018-02-14 at 11d2d07c4a)
 + update-index doc: note the caveat with "could not open..."
 + update-index doc: note a fixed bug in the untracked cache
 (this branch uses nd/fix-untracked-cache-invalidation.)

 Doc update to warn against remaining bugs in untracked cache.

 Will merge to 'master'.


* as/ll-i18n (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-14 at b30154a04c)
 + Mark messages for translations

 Some messages in low level start-up codepath have been i18n-ized.

 Will merge to 'master'.


* bc/doc-interpret-trailers-grammofix (2018-02-13) 1 commit
  (merged to 'next' on 2018-02-14 at 940e6dc7a5)
 + docs/interpret-trailers: fix agreement error

 Docfix.

 Will merge to 'master'.


* jk/t0002-simplify (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at a7a24f5f29)
 + t0002: simplify error checking

 Code cleanup.

 Will merge to 'master'.


* ma/config-page-only-in-list-mode (2018-02-21) 3 commits
 - config: change default of `pager.config` to "on"
 - config: respect `pager.config` in list/get-mode only
 - t7006: add tests for how git config paginates

 In a way similar to how "git tag" learned to honor the pager
 setting only in the list mode, "git config" learned to ignore the
 pager setting when it is used for setting values (i.e. when the
 purpose of the operation is not to "show").

 Waiting for discussion to conclude.


* ot/cat-batch-format (2018-02-12) 23 commits
 - cat-file: update of docs
 - cat-file: tests for new atoms added
 - for-each-ref: tests for new atoms added
 - ref-filter: unifying formatting of cat-file opts
 - ref-filter: make populate_value() internal again
 - cat-file: reuse printing logic from ref-filter
 - ref-filter: make valid_atom general again
 - ref-filter: make cat_file_info independent
 - cat-file: move skip_object_info into ref-filter
 - ref_filter: add is_atom_used function
 - ref-filter: get rid of mark_atom_in_object_info()
 - cat-file: start reusing populate_value()
 - ref-filter: rename field in ref_array_item stuct
 - ref-filter: make populate_value() global
 - cat-file: start use ref_array_item struct
 - ref-filter: reuse parse_ref_filter_atom()
 - cat-file: start migrating formatting to ref-filter
 - cat-file: split expand_atom() into 2 functions
 - cat-file: move struct expand_data into ref-filter
 - ref-filter: make valid_atom as function parameter
 - cat-file: reuse struct ref_format
 - ref-filter: add return value to some functions
 - ref-filter: get rid of goto

 Teach "cat-file --batch" to reuse the formatting machinery shared
 by for-each-ref, branch --list, and tag --list.

 Allocates flex-array on stack, etc.
 cf. <58b2bdcd-d621-fd21-ab4d-6a9478319b19@ramsayjones.plus.com>


* rj/sparse-updates (2018-02-12) 2 commits
  (merged to 'next' on 2018-02-14 at 072df8ed5b)
 + Makefile: suppress a sparse warning for pack-revindex.c
 + config.mak.uname: remove SPARSE_FLAGS setting for cygwin

 Devtool update.

 Will merge to 'master'.


* rs/check-ignore-multi (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at 43cb0704af)
 + check-ignore: fix mix of directories and other file types

 "git check-ignore" with multiple paths got confused when one is a
 file and the other is a directory, which has been fixed.

 Will merge to 'master'.


* sb/describe-blob (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at 23e4c13944)
 + describe: confirm that blobs actually exist

 "git describe $garbage" stopped giving any errors when the garbage
 happens to be a string with 40 hexadecimal letters.

 Will merge to 'master'.


* sg/doc-test-must-fail-args (2018-02-12) 1 commit
  (merged to 'next' on 2018-02-14 at 28662d145b)
 + t: document 'test_must_fail ok=<signal-name>'

 Devdoc update.

 Will merge to 'master'.


* sg/t6300-modernize (2018-02-13) 1 commit
 - t6300-for-each-ref: fix "more than one quoting style" tests

 Test update.

 Will merge to 'next'.


* xz/send-email-batch-size (2018-02-12) 1 commit
 - send-email: error out when relogin delay is missing

 "git send-email" learned to complain when the batch-size option is
 not defined when the relogin-delay option is, since these two are
 mutually required.

 Will merge to 'next'.


* pw/add-p-recount (2018-02-20) 9 commits
 - add -p: don't rely on apply's '--recount' option
 - add -p: fix counting when splitting and coalescing
 - add -p: calculate offset delta for edited patches
 - add -p: adjust offsets of subsequent hunks when one is skipped
 - t3701: add failing test for pathological context lines
 - t3701: don't hard code sha1 hash values
 - t3701: use test_write_lines and write_script
 - t3701: indent here documents
 - add -i: add function to format hunk header

 "git add -p" has been lazy in coalescing split patches before
 passing the result to underlying "git apply", leading to corner
 case bugs; the logic to prepare the patch to be applied after hunk
 selections has been tightened.

 Will merge to 'next'.


* pw/add-p-single (2018-02-13) 3 commits
 - add -p: improve error messages
 - add -p: only bind search key if there's more than one hunk
 - add -p: only display help for active keys

 "git add -p" used to offer "/" (look for a matching hunk) as a
 choice, even there was only one hunk, which has been corrected.
 Also the single-key help is now given only for keys that are
 enabled (e.g. help for '/' won't be shown when there is only one
 hunk).

 Will merge to 'next'.


* bp/untracked-cache-noflush (2018-02-05) 1 commit
 - dir.c: don't flag the index as dirty for changes to the untracked cache

 Writing out the index file when the only thing that changed in it
 is the untracked cache information is often wasteful, and this has
 been optimized out.

 Waiting for the discussion to finish.
 cf. <CACsJy8DLP=j-h3knwX9zOpejAfUbv1YJwfB-iw4476oy0hTfxg@mail.gmail.com>


* jc/blame-missing-path (2018-02-07) 1 commit
  (merged to 'next' on 2018-02-14 at 883d266e1e)
 + blame: tighten command line parser

 "git blame HEAD COPYING" in a bare repository failed to run, while
 "git blame HEAD -- COPYING" run just fine.  This has been corrected.

 Will merge to 'master'.


* jt/binsearch-with-fanout (2018-02-15) 2 commits
  (merged to 'next' on 2018-02-15 at 7648891022)
 + packfile: refactor hash search with fanout table
 + packfile: remove GIT_DEBUG_LOOKUP log statements
 (this branch is used by ds/commit-graph.)

 Refactor the code to binary search starting from a fan-out table
 (which is how the packfile is indexed with object names) into a
 reusable helper.

 Will merge to 'master'.


* nd/diff-stat-with-summary (2018-02-02) 2 commits
 - diff: add --stat-with-summary
 - diff.c: refactor pprint_rename() to use strbuf

 Waiting for the discussion to finish.


* nd/parseopt-completion (2018-02-09) 41 commits
 - completion: use __gitcomp_builtin in _git_worktree
 - completion: use __gitcomp_builtin in _git_tag
 - completion: use __gitcomp_builtin in _git_status
 - completion: use __gitcomp_builtin in _git_show_branch
 - completion: use __gitcomp_builtin in _git_rm
 - completion: use __gitcomp_builtin in _git_revert
 - completion: use __gitcomp_builtin in _git_reset
 - completion: use __gitcomp_builtin in _git_replace
 - remote: force completing --mirror= instead of --mirror
 - completion: use __gitcomp_builtin in _git_remote
 - completion: use __gitcomp_builtin in _git_push
 - completion: use __gitcomp_builtin in _git_pull
 - completion: use __gitcomp_builtin in _git_notes
 - completion: use __gitcomp_builtin in _git_name_rev
 - completion: use __gitcomp_builtin in _git_mv
 - completion: use __gitcomp_builtin in _git_merge_base
 - completion: use __gitcomp_builtin in _git_merge
 - completion: use __gitcomp_builtin in _git_ls_remote
 - completion: use __gitcomp_builtin in _git_ls_files
 - completion: use __gitcomp_builtin in _git_init
 - completion: use __gitcomp_builtin in _git_help
 - completion: use __gitcomp_builtin in _git_grep
 - completion: use __gitcomp_builtin in _git_gc
 - completion: use __gitcomp_builtin in _git_fsck
 - completion: use __gitcomp_builtin in _git_fetch
 - completion: use __gitcomp_builtin in _git_difftool
 - completion: use __gitcomp_builtin in _git_describe
 - completion: use __gitcomp_builtin in _git_config
 - completion: use __gitcomp_builtin in _git_commit
 - completion: use __gitcomp_builtin in _git_clone
 - completion: use __gitcomp_builtin in _git_clean
 - completion: use __gitcomp_builtin in _git_cherry_pick
 - completion: use __gitcomp_builtin in _git_checkout
 - completion: use __gitcomp_builtin in _git_branch
 - completion: use __gitcomp_builtin in _git_apply
 - completion: use __gitcomp_builtin in _git_am
 - completion: use __gitcomp_builtin in _git_add
 - git-completion.bash: introduce __gitcomp_builtin
 - parse-options: let OPT__FORCE take optional flags argument
 - parse-options: add OPT_xxx_F() variants
 - parse-options: support --git-completion-helper

 Teach parse-options API an option to help the completion script,
 and make use of the mechanism in command line completion.

 Will merge to 'next'.


* pc/submodule-helper-foreach (2018-02-02) 5 commits
 - submodule: port submodule subcommand 'foreach' from shell to C
 - submodule foreach: document variable '$displaypath'
 - submodule foreach: clarify the '$toplevel' variable documentation
 - submodule foreach: document '$sm_path' instead of '$path'
 - submodule foreach: correct '$path' in nested submodules from a subdirectory

 Expecting a response to review comments
 e.g. cf. <20180206150044.1bffbb573c088d38c8e44bf5@google.com>


* tg/worktree-add-existing-branch (2018-02-05) 3 commits
 - worktree: teach "add" to check out existing branches
 - worktree: be clearer when "add" dwim-ery kicks in
 - worktree: improve message when creating a new worktree

 "git worktree add" learned to check out an existing branch.

 Expecting a reroll.
 cf. <CAPig+cRLohiqR_Drh7P0q3XbvC22WLjNwH0YLZo3dqFzZZuAPw@mail.gmail.com>
 cf. <CACsJy8BEKYqW+Ne_WY2RBaSbb9OKcjREtrawStj=eJsVsia_Jw@mail.gmail.com>
 The general idea is good, just end-user facing messages are found
 suboptimal.


* nm/tag-edit (2018-02-07) 1 commit
 - tag: add --edit option

 "git tag" learned an explicit "--edit" option that allows the
 message given via "-m" and "-F" to be further edited.

 Will merge to 'next'.

* sm/mv-dry-run-update (2018-02-07) 2 commits
 - mv: remove unneeded 'if (!show_only)'
 - t7001: add test case for --dry-run

 Code clean-up.

 Will merge to 'next'.


* ab/fetch-prune (2018-02-09) 17 commits
 - fetch: make the --prune-tags work with <url>
 - fetch: add a --prune-tags option and fetch.pruneTags config
 - fetch tests: add scaffolding for the new fetch.pruneTags
 - git-fetch & config doc: link to the new PRUNING section
 - git remote doc: correct dangerous lies about what prune does
 - git fetch doc: add a new section to explain the ins & outs of pruning
 - fetch tests: fetch <url> <spec> as well as fetch [<remote>]
 - fetch tests: expand case/esac for later change
 - fetch tests: double quote a variable for interpolation
 - fetch tests: test --prune and refspec interaction
 - fetch tests: add a tag to be deleted to the pruning tests
 - fetch tests: re-arrange arguments for future readability
 - fetch tests: refactor in preparation for testing tag pruning
 - remote: add a macro for "refs/tags/*:refs/tags/*"
 - fetch: stop accessing "remote" variable indirectly
 - fetch: trivially refactor assignment to ref_nr
 - fetch: don't redundantly NULL something calloc() gave us

 Clarify how configured fetch refspecs interact with the "--prune"
 option of "git fetch", and also add a handy short-hand for getting
 rid of stale tags that are locally held.


* bw/c-plus-plus (2018-02-14) 38 commits
 - fixup! diff: rename 'this' variables
 - replace: rename 'new' variables
 - trailer: rename 'template' variables
 - tempfile: rename 'template' variables
 - wrapper: rename 'template' variables
 - environment: rename 'namespace' variables
 - diff: rename 'template' variables
 - environment: rename 'template' variables
 - init-db: rename 'template' variables
 - unpack-trees: rename 'new' variables
 - trailer: rename 'new' variables
 - submodule: rename 'new' variables
 - split-index: rename 'new' variables
 - remote: rename 'new' variables
 - ref-filter: rename 'new' variables
 - read-cache: rename 'new' variables
 - line-log: rename 'new' variables
 - imap-send: rename 'new' variables
 - http: rename 'new' variables
 - entry: rename 'new' variables
 - diffcore-delta: rename 'new' variables
 - diff: rename 'new' variables
 - diff-lib: rename 'new' variable
 - commit: rename 'new' variables
 - combine-diff: rename 'new' variables
 - remote: rename 'new' variables
 - reflog: rename 'new' variables
 - pack-redundant: rename 'new' variables
 - help: rename 'new' variables
 - checkout: rename 'new' variables
 - apply: rename 'new' variables
 - apply: rename 'try' variables
 - diff: rename 'this' variables
 - rev-parse: rename 'this' variable
 - pack-objects: rename 'this' variables
 - blame: rename 'this' variables
 - object: rename function 'typename' to 'type_name'
 - object_info: change member name from 'typename' to 'type_name'

 Avoid using identifiers that clash with C++ keywords.  Even though
 it is not a goal to compile Git with C++ compilers, changes like
 this help use of code analysis tools that targets C++ on our
 codebase.

 Is the 'fixup!' cleanly squashable to the problematic one, or does
 this series require another reroll to get it in a good enough shape?


* nd/rebase-show-current-patch (2018-02-12) 3 commits
 - rebase: introduce and use pseudo-ref REBASE_HEAD
 - rebase: add --show-current-patch
 - am: add --show-current-patch

 The new "--show-current-patch" option gives an end-user facing way
 to get the diff being applied when "git rebase" (and "git am")
 stops with a conflict.

 Will merge to 'next'.


* nd/worktree-move (2018-02-12) 7 commits
 - worktree remove: allow it when $GIT_WORK_TREE is already gone
 - worktree remove: new command
 - worktree move: refuse to move worktrees with submodules
 - worktree move: accept destination as directory
 - worktree move: new command
 - worktree.c: add update_worktree_location()
 - worktree.c: add validate_worktree()

 "git worktree" learned move and remove subcommands.

 Expecting a reroll.
 cf. <20180124095357.19645-1-pclouds@gmail.com>


* cl/send-email-reply-to (2018-01-17) 2 commits
 - send-email: support separate "Reply-To" address
 - send-email: rename variables for "In-reply-to" to $foo_in_reply_to

 "git send-email" learned "--reply-to=<address>" option.

 May want to get the log messages updated.
 cf. <CAN0heSqxmLoh33i65JPhyQbmPaAcJcwrTCO+ZD4eb+qh8Pf8+w@mail.gmail.com>


* js/rebase-recreate-merge (2018-02-12) 12 commits
 - rebase -i: introduce --recreate-merges=[no-]rebase-cousins
 - pull: accept --rebase=recreate to recreate the branch topology
 - sequencer: handle post-rewrite for merge commands
 - sequencer: make refs generated by the `label` command worktree-local
 - rebase: introduce the --recreate-merges option
 - rebase-helper --make-script: introduce a flag to recreate merges
 - sequencer: fast-forward merge commits, if possible
 - sequencer: introduce the `merge` command
 - sequencer: introduce new commands to reset the revision
 - git-rebase--interactive: clarify arguments
 - sequencer: make rearrange_squash() a bit more obvious
 - sequencer: avoid using errno clobbered by rollback_lock_file()

 "git rebase" learned "--recreate-merges" to transplant the whole
 topology of commit graph elsewhere.

 Is this ready for 'next'?


* bw/protocol-v2 (2018-02-07) 35 commits
 - remote-curl: don't request v2 when pushing
 - remote-curl: implement stateless-connect command
 - http: don't always add Git-Protocol header
 - http: allow providing extra headers for http requests
 - remote-curl: store the protocol version the server responded with
 - remote-curl: create copy of the service name
 - pkt-line: add packet_buf_write_len function
 - transport-helper: introduce stateless-connect
 - transport-helper: refactor process_connect_service
 - transport-helper: remove name parameter
 - connect: don't request v2 when pushing
 - connect: refactor git_connect to only get the protocol version once
 - fetch-pack: support shallow requests
 - upload-pack: support shallow requests
 - fetch-pack: perform a fetch using v2
 - upload-pack: introduce fetch server command
 - push: pass ref patterns when pushing
 - fetch: pass ref patterns when fetching
 - ls-remote: pass ref patterns when requesting a remote's refs
 - transport: convert transport_get_remote_refs to take a list of ref patterns
 - transport: convert get_refs_list to take a list of ref patterns
 - connect: request remote refs using v2
 - ls-refs: introduce ls-refs server command
 - serve: introduce git-serve
 - test-pkt-line: introduce a packet-line test helper
 - protocol: introduce enum protocol_version value protocol_v2
 - transport: store protocol version
 - connect: discover protocol version outside of get_remote_heads
 - connect: convert get_remote_heads to use struct packet_reader
 - transport: use get_refs_via_connect to get refs
 - upload-pack: factor out processing lines
 - upload-pack: convert to a builtin
 - pkt-line: add delim packet support
 - pkt-line: introduce struct packet_reader
 - pkt-line: introduce packet_read_with_status

 The beginning of the next-gen transfer protocol.


* ls/checkout-encoding (2018-02-15) 7 commits
 - convert: add round trip check based on 'core.checkRoundtripEncoding'
 - convert: add tracing for 'working-tree-encoding' attribute
 - convert: add 'working-tree-encoding' attribute
 - utf8: add function to detect a missing UTF-16/32 BOM
 - utf8: add function to detect prohibited UTF-16/32 BOM
 - strbuf: add xstrdup_toupper()
 - strbuf: remove unnecessary NUL assignment in xstrdup_tolower()

 The new "checkout-encoding" attribute can ask Git to convert the
 contents to the specified encoding when checking out to the working
 tree (and the other way around when checking in).

 Expecting a reroll.
 The code and general design looked ready.  The documentation needs
 to be refined to unconfuse general audience.
 cf. <xmqq1shk7o2y.fsf@gitster-ct.c.googlers.com>


* sb/blame-color (2018-02-13) 3 commits
 - builtin/blame: highlight recently changed lines
 - builtin/blame: add option to color metadata fields separately
 - builtin/blame: dim uninteresting metadata
 (this branch uses sb/color-h-cleanup.)

 Expecting a reroll.
 cf. https://public-inbox.org/git/20171110011002.10179-1-sbeller@google.com/#t
 error messages are funny, can segfault, ...


* nd/fix-untracked-cache-invalidation (2018-02-07) 5 commits
  (merged to 'next' on 2018-02-08 at 23bd5a5d2d)
 + dir.c: ignore paths containing .git when invalidating untracked cache
 + dir.c: stop ignoring opendir() error in open_cached_dir()
 + dir.c: fix missing dir invalidation in untracked code
 + dir.c: avoid stat() in valid_cached_dir()
 + status: add a failing test showing a core.untrackedCache bug
 (this branch is used by ab/untracked-cache-invalidation-docs.)

 Some bugs around "untracked cache" feature have been fixed.

 Will merge to 'master'.
 Seems to uncover bad untracked cache information a bit too loudly,
 for which there is ab/untracked-cache-invalidation-docs topic.
 cf. <87d11omi2o.fsf@evledraar.gmail.com>
 They have to graduate together.


* en/rename-directory-detection (2018-02-14) 29 commits
 - merge-recursive: ensure we write updates for directory-renamed file
 - merge-recursive: avoid spurious rename/rename conflict from dir renames
 - directory rename detection: new testcases showcasing a pair of bugs
 - merge-recursive: fix remaining directory rename + dirty overwrite cases
 - merge-recursive: fix overwriting dirty files involved in renames
 - merge-recursive: avoid clobbering untracked files with directory renames
 - merge-recursive: apply necessary modifications for directory renames
 - merge-recursive: when comparing files, don't include trees
 - merge-recursive: check for file level conflicts then get new name
 - merge-recursive: add computation of collisions due to dir rename & merging
 - merge-recursive: check for directory level conflicts
 - merge-recursive: add get_directory_renames()
 - merge-recursive: make a helper function for cleanup for handle_renames
 - merge-recursive: split out code for determining diff_filepairs
 - merge-recursive: make !o->detect_rename codepath more obvious
 - merge-recursive: fix leaks of allocated renames and diff_filepairs
 - merge-recursive: introduce new functions to handle rename logic
 - merge-recursive: move the get_renames() function
 - directory rename detection: tests for handling overwriting dirty files
 - directory rename detection: tests for handling overwriting untracked files
 - directory rename detection: miscellaneous testcases to complete coverage
 - directory rename detection: testcases exploring possibly suboptimal merges
 - directory rename detection: more involved edge/corner testcases
 - directory rename detection: testcases checking which side did the rename
 - directory rename detection: files/directories in the way of some renames
 - directory rename detection: partially renamed directory testcase/discussion
 - directory rename detection: testcases to avoid taking detection too far
 - directory rename detection: directory splitting testcases
 - directory rename detection: basic testcases

 Rename detection logic in "diff" family that is used in "merge" has
 learned to guess when all of x/a, x/b and x/c have moved to z/a,
 z/b and z/c, it is likely that x/d added in the meantime would also
 want to move to z/d by taking the hint that the entire directory
 'x' moved to 'z'.  A bug causing dirty files involved in a rename
 to be overwritten during merge has also been fixed as part of this
 work.

 Will merge to 'next'.

^ permalink raw reply	[relevance 1%]

* [PATCH] t/known-leaky: add list of known-leaky test scripts
  @ 2018-02-14 21:56  5% ` Martin Ågren
  0 siblings, 0 replies; 200+ results
From: Martin Ågren @ 2018-02-14 21:56 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: git, Kaartic Sivaraam, Duy Nguyen, Jeff King, Eric Sunshine

Here's what a list of known leaks might look like. It feels a bit
awkward to post a known-incomplete list (I don't run all tests). Duy
offered to pick up the ball if I gave up, maybe you could complete and
post this as your own? :-? Even if I (or others) can't reproduce the
complete list locally, regressions will be trivial to find, and newly
leak-free tests fairly easy to notice.

I'm not sure if the shamelessly stolen shell snippets warrant their own
scripts, or how make targets overriding various variables would be
received. At least they're in the commit message.

-- >8 --
We have quite a lot of leaks in the code base. Using SANITIZE=leak, it
is easy to find them, and every now and then we simply stumble upon one.
Still, we can expect it to take some time to get to the point where
`make SANITIZE=leak test` succeeds.

Until that happens, it would be nice if we could at least try not to
regress in the sense that a test tXXXX which was at one point leak-free
turns leaky. Such a regression would indicate that leak-free code
turned leaky, that a new feature is leaky, or that we simply happen to
trigger an existing leak as part of a newly added/modified test.

To that end, introduce a list of known-leaky tests, i.e., a list of
tXXXX-values. Now this will be able to find such regressions:

    make SANITIZE=leak test GIT_SKIP_TESTS="$(cat t/known-leaky)"

The list was generated, and can be updated, as follows:

    # Assume we're using prove, which will keep running after failure,
    # and will record the results for us to parse (using "--state=").
    # Otherwise use "make -k" and grep in t/test-results.
    GIT_TEST_OPTS=-i make SANITIZE=leak test
    cd t
    prove --dry --state=failed |
    perl -lne '/^(t[0-9]{4})-.*\.sh$/ and print $1' |
    sort >known-leaky

The list added in this commit might be incomplete, since I do not run
all tests (I'm missing svn, cvs, p4, Windows-only and
filesystem-dependent tests, as well as "writeable /"). The majority of
these do not primarily test our C code, but all of them might trigger
leaks, in which case they would belong in this list.

Suggested-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
---
 t/known-leaky | 539 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 539 insertions(+)
 create mode 100644 t/known-leaky

diff --git a/t/known-leaky b/t/known-leaky
new file mode 100644
index 0000000000..80a0af4d09
--- /dev/null
+++ b/t/known-leaky
@@ -0,0 +1,539 @@
+t0002
+t0003
+t0006
+t0008
+t0009
+t0012
+t0020
+t0021
+t0023
+t0040
+t0050
+t0056
+t0060
+t0062
+t0064
+t0070
+t0090
+t0100
+t0101
+t0110
+t0203
+t0300
+t0301
+t0302
+t1001
+t1002
+t1004
+t1005
+t1006
+t1007
+t1008
+t1011
+t1012
+t1013
+t1020
+t1021
+t1050
+t1051
+t1090
+t1301
+t1302
+t1304
+t1306
+t1308
+t1350
+t1400
+t1401
+t1402
+t1403
+t1404
+t1405
+t1406
+t1407
+t1408
+t1409
+t1410
+t1411
+t1412
+t1413
+t1414
+t1430
+t1450
+t1500
+t1502
+t1505
+t1507
+t1508
+t1510
+t1511
+t1512
+t1514
+t1700
+t2007
+t2008
+t2009
+t2010
+t2011
+t2012
+t2013
+t2014
+t2015
+t2016
+t2017
+t2018
+t2019
+t2020
+t2021
+t2022
+t2023
+t2024
+t2025
+t2026
+t2027
+t2030
+t2103
+t2106
+t2200
+t2203
+t2204
+t3001
+t3004
+t3005
+t3007
+t3010
+t3020
+t3030
+t3031
+t3032
+t3033
+t3034
+t3040
+t3050
+t3060
+t3200
+t3201
+t3202
+t3203
+t3204
+t3205
+t3210
+t3301
+t3302
+t3303
+t3304
+t3306
+t3307
+t3308
+t3309
+t3310
+t3311
+t3400
+t3402
+t3403
+t3404
+t3405
+t3406
+t3407
+t3408
+t3409
+t3410
+t3411
+t3412
+t3413
+t3414
+t3415
+t3416
+t3417
+t3418
+t3419
+t3420
+t3421
+t3425
+t3426
+t3427
+t3428
+t3429
+t3500
+t3501
+t3502
+t3503
+t3504
+t3505
+t3506
+t3507
+t3508
+t3509
+t3510
+t3511
+t3512
+t3513
+t3600
+t3700
+t3701
+t3800
+t3900
+t3901
+t3903
+t3904
+t3905
+t3906
+t4001
+t4008
+t4010
+t4013
+t4014
+t4015
+t4016
+t4017
+t4018
+t4020
+t4021
+t4022
+t4023
+t4026
+t4027
+t4028
+t4030
+t4031
+t4036
+t4038
+t4039
+t4041
+t4042
+t4043
+t4044
+t4045
+t4047
+t4048
+t4049
+t4051
+t4052
+t4053
+t4055
+t4056
+t4057
+t4059
+t4060
+t4061
+t4064
+t4065
+t4103
+t4107
+t4108
+t4111
+t4114
+t4115
+t4117
+t4118
+t4120
+t4121
+t4122
+t4124
+t4125
+t4127
+t4131
+t4135
+t4137
+t4138
+t4150
+t4151
+t4152
+t4153
+t4200
+t4201
+t4202
+t4203
+t4204
+t4205
+t4206
+t4207
+t4208
+t4209
+t4210
+t4211
+t4212
+t4213
+t4252
+t4253
+t4254
+t4255
+t4300
+t5000
+t5001
+t5002
+t5003
+t5004
+t5100
+t5150
+t5300
+t5301
+t5302
+t5303
+t5304
+t5305
+t5306
+t5310
+t5311
+t5312
+t5313
+t5314
+t5315
+t5316
+t5317
+t5400
+t5401
+t5402
+t5403
+t5404
+t5405
+t5406
+t5407
+t5408
+t5500
+t5501
+t5502
+t5503
+t5504
+t5505
+t5506
+t5509
+t5510
+t5512
+t5513
+t5514
+t5515
+t5516
+t5517
+t5518
+t5519
+t5520
+t5521
+t5522
+t5523
+t5524
+t5525
+t5526
+t5527
+t5528
+t5531
+t5532
+t5533
+t5534
+t5535
+t5536
+t5537
+t5538
+t5539
+t5540
+t5541
+t5542
+t5543
+t5544
+t5545
+t5546
+t5547
+t5550
+t5551
+t5560
+t5561
+t5570
+t5571
+t5572
+t5573
+t5600
+t5601
+t5603
+t5604
+t5605
+t5606
+t5607
+t5609
+t5610
+t5611
+t5612
+t5613
+t5614
+t5700
+t5801
+t5802
+t5810
+t5811
+t5812
+t5813
+t5814
+t5815
+t5900
+t6000
+t6002
+t6003
+t6004
+t6006
+t6007
+t6008
+t6009
+t6010
+t6011
+t6012
+t6013
+t6014
+t6015
+t6016
+t6017
+t6018
+t6019
+t6020
+t6021
+t6022
+t6024
+t6025
+t6026
+t6027
+t6028
+t6029
+t6030
+t6031
+t6032
+t6033
+t6034
+t6035
+t6036
+t6037
+t6038
+t6040
+t6041
+t6042
+t6044
+t6045
+t6050
+t6060
+t6100
+t6101
+t6110
+t6111
+t6112
+t6120
+t6130
+t6131
+t6132
+t6133
+t6134
+t6200
+t6300
+t6301
+t6302
+t6500
+t6501
+t7001
+t7003
+t7004
+t7005
+t7006
+t7007
+t7008
+t7009
+t7010
+t7011
+t7012
+t7030
+t7060
+t7061
+t7062
+t7063
+t7064
+t7102
+t7103
+t7104
+t7105
+t7106
+t7110
+t7111
+t7112
+t7201
+t7300
+t7301
+t7400
+t7401
+t7402
+t7403
+t7405
+t7406
+t7407
+t7408
+t7409
+t7410
+t7411
+t7412
+t7413
+t7414
+t7500
+t7501
+t7502
+t7503
+t7504
+t7505
+t7506
+t7507
+t7508
+t7509
+t7510
+t7511
+t7512
+t7513
+t7514
+t7515
+t7516
+t7517
+t7519
+t7520
+t7521
+t7600
+t7601
+t7602
+t7603
+t7604
+t7605
+t7606
+t7607
+t7608
+t7609
+t7610
+t7611
+t7612
+t7613
+t7614
+t7700
+t7701
+t7702
+t7800
+t7810
+t7811
+t7814
+t8001
+t8002
+t8003
+t8004
+t8005
+t8006
+t8007
+t8008
+t8009
+t8010
+t8011
+t9001
+t9002
+t9003
+t9004
+t9010
+t9020
+t9300
+t9301
+t9302
+t9303
+t9350
+t9351
+t9500
+t9502
+t9700
+t9902
+t9903
-- 
2.16.1.72.g5be1f00a9a


^ permalink raw reply related	[relevance 5%]

* What's cooking in git.git (Feb 2018, #02; Tue, 13)
@ 2018-02-14  1:51  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2018-02-14  1:51 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* ab/simplify-perl-makefile (2018-01-03) 3 commits
  (merged to 'next' on 2018-01-23 at 1506e0651a)
 + perl: treat PERLLIB_EXTRA as an extra path again
 + perl: avoid *.pmc and fix Error.pm further
 + Makefile: replace perl/Makefile.PL with simple make rules

 Originally merged to 'next' on 2018-01-03

 The build procedure for perl/ part has been greatly simplified by
 weaning ourselves off of MakeMaker.


* cc/sha1-file-name (2018-01-19) 2 commits
  (merged to 'next' on 2018-02-07 at a50b171a84)
 + sha1_file: improve sha1_file_name() perfs
 + sha1_file: remove static strbuf from sha1_file_name()

 Code clean-up.


* cl/t9001-cleanup (2018-01-12) 1 commit
  (merged to 'next' on 2018-02-07 at 9b194a9999)
 + t9001: use existing helper in send-email test

 Test clean-up.


* ds/use-get-be64 (2018-01-19) 1 commit
  (merged to 'next' on 2018-02-07 at 6d6d5ba71d)
 + packfile: use get_be64() for large offsets

 Code clean-up.


* ew/svn-branch-segfault-fix (2018-01-30) 1 commit
  (merged to 'next' on 2018-02-07 at 1bf8d8f74f)
 + git-svn: control destruction order to avoid segfault

 Workaround for segfault with more recent versions of SVN.


* gs/retire-mru (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 4b2e893911)
 + mru: Replace mru.[ch] with list.h implementation
 (this branch uses ot/mru-on-list.)

 Retire mru API as it does not give enough abstraction over
 underlying list API to be worth it.


* jc/mailinfo-cleanup-fix (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 65d41f993b)
 + mailinfo: avoid segfault when can't open files

 Corner case bugfix.


* jh/fsck-promisors (2017-12-08) 10 commits
  (merged to 'next' on 2018-01-23 at ca59f5c18e)
 + gc: do not repack promisor packfiles
 + rev-list: support termination at promisor objects
 + sha1_file: support lazily fetching missing objects
 + introduce fetch-object: fetch one promisor object
 + index-pack: refactor writing of .keep files
 + fsck: support promisor objects as CLI argument
 + fsck: support referenced promisor objects
 + fsck: support refs pointing to promisor objects
 + fsck: introduce partialclone extension
 + extension.partialclone: introduce partial clone extension
 (this branch is used by jh/partial-clone.)

 Originally merged to 'next' on 2018-01-17

 In preparation for implementing narrow/partial clone, the machinery
 for checking object connectivity used by gc and fsck has been
 taught that a missing object is OK when it is referenced by a
 packfile specially marked as coming from trusted repository that
 promises to make them available on-demand and lazily.


* jh/partial-clone (2017-12-08) 13 commits
  (merged to 'next' on 2018-01-23 at de0f0111ea)
 + t5616: test bulk prefetch after partial fetch
 + fetch: inherit filter-spec from partial clone
 + t5616: end-to-end tests for partial clone
 + fetch-pack: restore save_commit_buffer after use
 + unpack-trees: batch fetching of missing blobs
 + clone: partial clone
 + partial-clone: define partial clone settings in config
 + fetch: support filters
 + fetch: refactor calculation of remote list
 + fetch-pack: test support excluding large blobs
 + fetch-pack: add --no-filter
 + fetch-pack, index-pack, transport: partial clone
 + upload-pack: add object filtering for partial clone
 (this branch uses jh/fsck-promisors.)

 Originally merged to 'next' on 2018-01-17

 The machinery to clone & fetch, which in turn involves packing and
 unpacking objects, have been told how to omit certain objects using
 the filtering mechanism introduced by the jh/object-filtering
 topic, and also mark the resulting pack as a promisor pack to
 tolerate missing objects, taking advantage of the mechanism
 introduced by the jh/fsck-promisors topic.


* jk/daemon-fixes (2018-01-25) 6 commits
  (merged to 'next' on 2018-02-07 at 0e4fe8f8cc)
 + daemon: fix length computation in newline stripping
 + t/lib-git-daemon: add network-protocol helpers
 + daemon: handle NULs in extended attribute string
 + daemon: fix off-by-one in logging extended attributes
 + t/lib-git-daemon: record daemon log
 + t5570: use ls-remote instead of clone for interp tests

 Assorted fixes to "git daemon".


* jt/http-redact-cookies (2018-01-19) 2 commits
  (merged to 'next' on 2018-02-07 at a8c3416a7d)
 + http: support omitting data from traces
 + http: support cookie redaction when tracing

 The http tracing code, often used to debug connection issues,
 learned to redact potentially sensitive information from its output
 so that it can be more safely sharable.


* jt/long-running-process-doc (2018-01-25) 1 commit
  (merged to 'next' on 2018-02-07 at 8bbb42ad3c)
 + Docs: split out long-running subprocess handshake

 Doc updates.


* ks/submodule-doc-updates (2018-01-16) 2 commits
  (merged to 'next' on 2018-02-07 at aff2fa1650)
 + Doc/git-submodule: improve readability and grammar of a sentence
 + Doc/gitsubmodules: make some changes to improve readability and syntax

 Doc updates.


* mr/packed-ref-store-fix (2018-01-19) 1 commit
  (merged to 'next' on 2018-02-07 at 17d32e99da)
 + files_initial_transaction_commit(): only unlock if locked

 Crash fix for a corner case where an error codepath tried to unlock
 what it did not acquire lock on.


* nd/diff-flush-before-warning (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at 9c67f58ae0)
 + diff.c: flush stdout before printing rename warnings

 Avoid showing a warning message in the middle of a line of "git
 diff" output.


* nd/list-merge-strategy (2018-01-26) 1 commit
  (merged to 'next' on 2018-02-07 at a75d04a675)
 + completion: fix completing merge strategies on non-C locales

 Completion of "git merge -s<strategy>" (in contrib/) did not work
 well in non-C locale.


* nd/shared-index-fix (2018-01-24) 3 commits
  (merged to 'next' on 2018-02-07 at c5d6e68c91)
 + read-cache: don't write index twice if we can't write shared index
 + read-cache.c: move tempfile creation/cleanup out of write_shared_index
 + read-cache.c: change type of "temp" in write_shared_index()

 Code clean-up.


* nd/trace-with-env (2018-01-19) 7 commits
  (merged to 'next' on 2018-02-07 at 68399411d9)
 + run-command.c: print new cwd in trace_run_command()
 + run-command.c: print env vars in trace_run_command()
 + run-command.c: print program 'git' when tracing git_cmd mode
 + run-command.c: introduce trace_run_command()
 + trace.c: move strbuf_release() out of print_trace_line()
 + trace: avoid unnecessary quoting
 + sq_quote_argv: drop maxlen parameter

 The tracing machinery learned to report tweaking of environment
 variables as well.


* ot/mru-on-list (2017-10-01) 1 commit
  (merged to 'next' on 2018-02-07 at ee1ee4ac79)
 + mru: use double-linked list from list.h
 (this branch is used by gs/retire-mru.)

 The first step to getting rid of mru API and using the
 doubly-linked list API directly instead.


* pc/submodule-helper (2018-01-16) 2 commits
  (merged to 'next' on 2018-02-07 at 53b4524eca)
 + submodule: port submodule subcommand 'deinit' from shell to C
 + submodule: port submodule subcommand 'sync' from shell to C

 Rewrite two more "git submodule" subcommands in C.


* po/clang-format-functype-weight (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 0724aaae38)
 + clang-format: adjust penalty for return type line break

 Prevent "clang-format" from breaking line after function return type.


* po/http-push-error-message (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 3dccd32857)
 + http-push: improve error log

 Debugging aid.


* pw/sequencer-in-process-commit (2018-01-24) 14 commits
  (merged to 'next' on 2018-02-07 at ab5961edd9)
 + sequencer: run 'prepare-commit-msg' hook
 + t7505: add tests for cherry-pick and rebase -i/-p
 + t7505: style fixes
 + sequencer: assign only free()able strings to gpg_sign
 + sequencer: improve config handling
 + t3512/t3513: remove KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
 + sequencer: try to commit without forking 'git commit'
 + sequencer: load commit related config
 + sequencer: simplify adding Signed-off-by: trailer
 + commit: move print_commit_summary() to libgit
 + commit: move post-rewrite code to libgit
 + Add a function to update HEAD after creating a commit
 + commit: move empty message checks to libgit
 + t3404: check intermediate squash messages

 The sequencer infrastructure is shared across "git cherry-pick",
 "git rebase -i", etc., and has always spawned "git commit" when it
 needs to create a commit.  It has been taught to do so internally,
 when able, by reusing the codepath "git commit" itself uses, which
 gives performance boost for a few tens of percents in some sample
 scenarios.


* rb/hashmap-h-compilation-fix (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at 780bc6d06b)
 + hashmap.h: remove unused variable

 Code clean-up.


* rs/describe-unique-abbrev (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at b5383e2d05)
 + describe: use strbuf_add_unique_abbrev() for adding short hashes

 Code clean-up.


* rs/strbuf-cocci-workaround (2018-01-19) 1 commit
  (merged to 'next' on 2018-02-07 at 73a2c4c769)
 + cocci: use format keyword instead of a literal string

 Update Coccinelle rules to catch and optimize strbuf_addf(&buf, "%s", str)


* sg/cocci-move-array (2018-01-22) 1 commit
  (merged to 'next' on 2018-02-07 at 6ced765979)
 + Use MOVE_ARRAY

 Code clean-up.


* sg/travis-linux32-sanity (2018-01-30) 5 commits
  (merged to 'next' on 2018-02-07 at 0349cf505c)
 + travis-ci: don't fail if user already exists on 32 bit Linux build job
 + travis-ci: don't run the test suite as root in the 32 bit Linux build
 + travis-ci: don't repeat the path of the cache directory
 + travis-ci: use 'set -e' in the 32 bit Linux build job
 + travis-ci: use 'set -x' for the commands under 'su' in the 32 bit Linux build

 Travis updates.


* tb/crlf-conv-flags (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at 1981be1b46)
 + convert_to_git(): safe_crlf/checksafe becomes int conv_flags
 (this branch is used by ls/checkout-encoding.)

 Code clean-up.


* tg/split-index-fixes (2018-01-19) 3 commits
  (merged to 'next' on 2018-02-07 at 52d7a92ec5)
 + travis: run tests with GIT_TEST_SPLIT_INDEX
 + split-index: don't write cache tree with null oid entries
 + read-cache: fix reading the shared index for other repos

 The split-index mode had a few corner case bugs fixed.


* tz/doc-show-defaults-to-head (2018-01-30) 1 commit
  (merged to 'next' on 2018-02-07 at fa21fb2ec8)
 + doc: mention 'git show' defaults to HEAD

 Doc update.

--------------------------------------------------
[New Topics]

* bp/name-hash-dirname-fix (2018-02-08) 1 commit
 - name-hash: properly fold directory names in adjust_dirname_case()

 "git add" files in the same directory, but spelling the directory
 path in different cases on case insensitive filesystem, corrupted
 the name hash data structure and led to unexpected results.  This
 has been corrected.

 Will merge to 'next'.


* jk/doc-do-not-write-extern (2018-02-08) 1 commit
 - CodingGuidelines: mention "static" and "extern"

 Devdoc update.

 Will merge to 'next'.


* jk/gettext-poison (2018-02-08) 2 commits
 - git-sh-i18n: check GETTEXT_POISON before USE_GETTEXT_SCHEME
 - t0205: drop redundant test

 Test updates.

 Will merge to 'next'.


* js/fix-merge-arg-quoting-in-rebase-p (2018-02-08) 1 commit
 - rebase -p: fix incorrect commit message when calling `git merge`.

 "git rebase -p" mangled log messages of a merge commit, which is
 now fixed.

 Will merge to 'next'.


* js/packet-read-line-check-null (2018-02-08) 2 commits
 - always check for NULL return from packet_read_line()
 - correct error messages for NULL packet_read_line()

 Some low level protocol codepath could crash when they get an
 unexpected flush packet, which is now fixed.

 Will merge to 'next'.


* sb/color-h-cleanup (2018-02-13) 1 commit
 - color.h: document and modernize header
 (this branch is used by sb/blame-color.)

 Devdoc update.

 Will merge to 'next'.


* ab/untracked-cache-invalidation-docs (2018-02-09) 2 commits
 - update-index doc: note the caveat with "could not open..."
 - update-index doc: note a fixed bug in the untracked cache
 (this branch uses nd/fix-untracked-cache-invalidation.)

 Doc update to warn against remaining bugs in untracked cache.

 Will merge to 'next'.


* as/ll-i18n (2018-02-13) 1 commit
 - Mark messages for translations

 Some messages in low level start-up codepath have been i18n-ized.

 Will merge to 'next'.


* bc/doc-interpret-trailers-grammofix (2018-02-13) 1 commit
 - docs/interpret-trailers: fix agreement error

 Docfix.

 Will merge to 'next'.


* jk/t0002-simplify (2018-02-12) 1 commit
 - t0002: simplify error checking

 Code cleanup.

 Will merge to 'next'.


* ma/config-page-only-in-list-mode (2018-02-12) 3 commits
 - config: change default of `pager.config` to "on"
 - config: respect `pager.config` in list/get-mode only
 - t7006: add tests for how git config paginates

 In a way similar to how "git tag" learned to honor the pager
 setting only in the list mode, "git config" learned to ignore the
 pager setting when it is used for setting values (i.e. when the
 purpose of the operation is not to "show").

 Waiting for discussion to conclude.


* ot/cat-batch-format (2018-02-12) 23 commits
 - cat-file: update of docs
 - cat-file: tests for new atoms added
 - for-each-ref: tests for new atoms added
 - ref-filter: unifying formatting of cat-file opts
 - ref-filter: make populate_value() internal again
 - cat-file: reuse printing logic from ref-filter
 - ref-filter: make valid_atom general again
 - ref-filter: make cat_file_info independent
 - cat-file: move skip_object_info into ref-filter
 - ref_filter: add is_atom_used function
 - ref-filter: get rid of mark_atom_in_object_info()
 - cat-file: start reusing populate_value()
 - ref-filter: rename field in ref_array_item stuct
 - ref-filter: make populate_value() global
 - cat-file: start use ref_array_item struct
 - ref-filter: reuse parse_ref_filter_atom()
 - cat-file: start migrating formatting to ref-filter
 - cat-file: split expand_atom() into 2 functions
 - cat-file: move struct expand_data into ref-filter
 - ref-filter: make valid_atom as function parameter
 - cat-file: reuse struct ref_format
 - ref-filter: add return value to some functions
 - ref-filter: get rid of goto

 Teach "cat-file --batch" to reuse the formatting machinery shared
 by for-each-ref, branch --list, and tag --list.


* rj/sparse-updates (2018-02-12) 2 commits
 - Makefile: suppress a sparse warning for pack-revindex.c
 - config.mak.uname: remove SPARSE_FLAGS setting for cygwin

 Devtool update.

 Will merge to 'next'.


* rs/check-ignore-multi (2018-02-12) 1 commit
 - check-ignore: fix mix of directories and other file types

 "git check-ignore" with multiple paths got confused when one is a
 file and the other is a directory, which has been fixed.

 Will merge to 'next'.


* sb/describe-blob (2018-02-12) 1 commit
 - describe: confirm that blobs actually exist

 "git describe $garbage" stopped giving any errors when the garbage
 happens to be a string with 40 hexadecimal letters.

 Will merge to 'next'.


* sg/doc-test-must-fail-args (2018-02-12) 1 commit
 - t: document 'test_must_fail ok=<signal-name>'

 Devdoc update.

 Will merge to 'next'.


* sg/t6300-modernize (2018-02-13) 1 commit
 - t6300-for-each-ref: fix "more than one quoting style" tests

 Test update.

 WIll merge to 'next'.


* xz/send-email-batch-size (2018-02-12) 1 commit
 - send-email: error out when relogin delay is missing

 "git send-email" learned to complain when the batch-size option is
 not defined when the relogin-delay option is, since these two are
 mutually required.


* pw/add-p-recount (2018-02-13) 4 commits
 - add -p: calculate offset delta for edited patches
 - add -p: adjust offsets of subsequent hunks when one is skipped
 - t3701: add failing test for pathological context lines
 - add -i: add function to format hunk header


* pw/add-p-single (2018-02-13) 3 commits
 - add -p: improve error messages
 - add -p: only bind search key if there's more than one hunk
 - add -p: only display help for active keys

--------------------------------------------------
[Stalled]

* av/fsmonitor-updates (2018-01-04) 6 commits
 - fsmonitor: use fsmonitor data in `git diff`
 - fsmonitor: remove debugging lines from t/t7519-status-fsmonitor.sh
 - fsmonitor: make output of test-dump-fsmonitor more concise
 - fsmonitor: update helper tool, now that flags are filled later
 - fsmonitor: stop inline'ing mark_fsmonitor_valid / _invalid
 - dir.c: update comments to match argument name

 Code clean-up on fsmonitor integration, plus optional utilization
 of the fsmonitor data in diff-files.

 Waiting for an update.
 cf. <alpine.DEB.2.21.1.1801042335130.32@MININT-6BKU6QN.europe.corp.microsoft.com>


* pb/bisect-helper-2 (2017-10-28) 8 commits
 - t6030: make various test to pass GETTEXT_POISON tests
 - bisect--helper: `bisect_start` shell function partially in C
 - bisect--helper: `get_terms` & `bisect_terms` shell function in C
 - bisect--helper: `bisect_next_check` shell function in C
 - bisect--helper: `check_and_set_terms` shell function in C
 - wrapper: move is_empty_file() and rename it as is_empty_or_missing_file()
 - bisect--helper: `bisect_write` shell function in C
 - bisect--helper: `bisect_reset` shell function in C

 Expecting a reroll.
 cf. <0102015f5e5ee171-f30f4868-886f-47a1-a4e4-b4936afc545d-000000@eu-west-1.amazonses.com>


* dj/runtime-prefix (2017-12-05) 4 commits
 . exec_cmd: RUNTIME_PREFIX on some POSIX systems
 . Makefile: add Perl runtime prefix support
 . Makefile: add support for "perllibdir"
 . Makefile: generate Perl header from template file

 A build-time option has been added to allow Git to be told to refer
 to its associated files relative to the main binary, in the same
 way that has been possible on Windows for quite some time, for
 Linux, BSDs and Darwin.

 Tentatively kicked out of 'next' to see how well another topic
 ab/simplify-perl-makefile that heavily conflicts with this fares.


* mk/http-backend-content-length (2017-11-27) 4 commits
 - SQUASH???
 - t5560-http-backend-noserver.sh: add CONTENT_LENGTH cases
 - SQUASH???
 - http-backend: respect CONTENT_LENGTH as specified by rfc3875

 The http-backend (used for smart-http transport) used to slurp the
 whole input until EOF, without paying attention to CONTENT_LENGTH
 that is supplied in the environment and instead expecting the Web
 server to close the input stream.  This has been fixed.

 Expecting a reroll.
 Suggested fixes to be used when rerolling is queued, but I'd
 prefer _not_ squashing them myself.

 Also, it may be too complex solution for the problem.
 cf. <20171204171308.GA13332@sigill.intra.peff.net>


* cc/require-tcl-tk-for-build (2017-11-29) 2 commits
 - travis-ci: avoid new tcl/tk build requirement
 - Makefile: check that tcl/tk is installed

 A first-time builder of Git may have installed neither tclsh nor
 msgfmt, in which case git-gui and gitk part will fail and break the
 build.  As a workaround, refuse to run a build when tclsh is not
 installed and NO_TCLTK is not set.

 Undecided.
 I still feel that requring tclsh to be installed, with or without
 "escape hatch" for experts, may be too heavy-handed.


* mg/merge-base-fork-point (2017-09-17) 3 commits
 - merge-base: find fork-point outside partial reflog
 - merge-base: return fork-point outside reflog
 - t6010: test actual test output

 "merge-base --fork-point $branch $commit" is used to guess on which
 commit among the commits that were once at the tip of the $branch the
 $commit was built on top of, and it learns these historical tips from
 the reflog of the $branch.  When the true fork-point is lost due to
 pruning of old reflog entries, the command does not give any output,
 because it has no way to guess correctly and does not want to mislead
 the user with a wrong guess.

 The command has been updated to give the best but not known to be
 correct guess, based on a hope that a merge-base between $commit and a
 virtual merge across all the reflog entries that still are available
 for $branch may still be a closer to the true fork-point than the
 merge-base between $commit and the current tip of the $branch.

 This may have to be offered by an additional option, to allow the
 users that are prepared to see a potentially incorrect guess to opt
 into the feature, without affecting the current callers that may not
 be prepared to accept a guess that is not known to be correct.

 What's the doneness of this one?


* jk/drop-ancient-curl (2017-08-09) 5 commits
 - http: #error on too-old curl
 - curl: remove ifdef'd code never used with curl >=7.19.4
 - http: drop support for curl < 7.19.4
 - http: drop support for curl < 7.16.0
 - http: drop support for curl < 7.11.1

 Some code in http.c that has bitrot is being removed.

 Expecting a reroll.


* mk/use-size-t-in-zlib (2017-08-10) 1 commit
 . zlib.c: use size_t for size

 The wrapper to call into zlib followed our long tradition to use
 "unsigned long" for sizes of regions in memory, which have been
 updated to use "size_t".

 Needs resurrecting by making sure the fix is good and still applies
 (or adjusted to today's codebase).


* mg/status-in-progress-info (2017-05-10) 2 commits
 - status --short --inprogress: spell it as --in-progress
 - status: show in-progress info for short status

 "git status" learns an option to report various operations
 (e.g. "merging") that the user is in the middle of.

 cf. <xmqqmvakcdqw.fsf@gitster.mtv.corp.google.com>

--------------------------------------------------
[Cooking]

* bc/hash-algo (2018-02-09) 13 commits
  (merged to 'next' on 2018-02-09 at 4437f3f132)
 + hash: update obsolete reference to SHA1_HEADER
  (merged to 'next' on 2018-02-08 at 18f36d12ed)
 + bulk-checkin: abstract SHA-1 usage
 + csum-file: abstract uses of SHA-1
 + csum-file: rename sha1file to hashfile
 + read-cache: abstract away uses of SHA-1
 + pack-write: switch various SHA-1 values to abstract forms
 + pack-check: convert various uses of SHA-1 to abstract forms
 + fast-import: switch various uses of SHA-1 to the_hash_algo
 + sha1_file: switch uses of SHA-1 to the_hash_algo
 + builtin/unpack-objects: switch uses of SHA-1 to the_hash_algo
 + builtin/index-pack: improve hash function abstraction
 + hash: create union for hash context allocation
 + hash: move SHA-1 macros to hash.h

 More abstraction of hash function from the codepath.

 Will merge to 'master'.


* bp/untracked-cache-noflush (2018-02-05) 1 commit
 - dir.c: don't flag the index as dirty for changes to the untracked cache

 Writing out the index file when the only thing that changed in it
 is the untracked cache information is often wasteful, and this has
 been optimized out.

 Waiting for the discussion to finish.
 cf. <CACsJy8DLP=j-h3knwX9zOpejAfUbv1YJwfB-iw4476oy0hTfxg@mail.gmail.com>


* cc/perf-aggregate (2018-02-02) 3 commits
  (merged to 'next' on 2018-02-08 at d8f074e6fb)
 + perf/aggregate: sort JSON fields in output
 + perf/aggregate: add --reponame option
 + perf/aggregate: add --subsection option

 "make perf" enhancement.

 Will merge to 'master'.


* gs/rebase-allow-empty-message (2018-02-07) 1 commit
  (merged to 'next' on 2018-02-08 at 9d81a2496c)
 + rebase: add --allow-empty-message option

 "git rebase" learned to take "--allow-empty-message" option.

 Will merge to 'master'.


* jc/blame-missing-path (2018-02-07) 1 commit
 - blame: tighten command line parser

 "git blame HEAD COPYING" in a bare repository failed to run, while
 "git blame HEAD -- COPYING" run just fine.

 Will merge to 'next'.


* jt/binsearch-with-fanout (2018-02-02) 2 commits
  (merged to 'next' on 2018-02-08 at 86fc3e8104)
 + packfile: refactor hash search with fanout table
 + packfile: remove GIT_DEBUG_LOOKUP log statements

 Refactor the code to binary search starting from a fan-out table
 (which is how the packfile is indexed with object names) into a
 reusable helper.

 cf. <cfbde137-dbac-8796-f49f-2a543303d33a@web.de>


* lw/daemon-log-destination (2018-02-05) 1 commit
  (merged to 'next' on 2018-02-08 at da91bd56f4)
 + daemon: add --log-destination=(stderr|syslog|none)

 The log from "git daemon" can be redirected with a new option; one
 relevant use case is to send the log to standard error (instead of
 syslog) when running it from inetd.

 Will merge to 'master'.


* nd/diff-stat-with-summary (2018-02-02) 2 commits
 - diff: add --stat-with-summary
 - diff.c: refactor pprint_rename() to use strbuf

 Waiting for the discussion to finish.


* nd/parseopt-completion (2018-02-09) 42 commits
 - git-completion.bash: add GIT_COMPLETION_OPTIONS=all config
 - completion: use __gitcomp_builtin in _git_worktree
 - completion: use __gitcomp_builtin in _git_tag
 - completion: use __gitcomp_builtin in _git_status
 - completion: use __gitcomp_builtin in _git_show_branch
 - completion: use __gitcomp_builtin in _git_rm
 - completion: use __gitcomp_builtin in _git_revert
 - completion: use __gitcomp_builtin in _git_reset
 - completion: use __gitcomp_builtin in _git_replace
 - remote: force completing --mirror= instead of --mirror
 - completion: use __gitcomp_builtin in _git_remote
 - completion: use __gitcomp_builtin in _git_push
 - completion: use __gitcomp_builtin in _git_pull
 - completion: use __gitcomp_builtin in _git_notes
 - completion: use __gitcomp_builtin in _git_name_rev
 - completion: use __gitcomp_builtin in _git_mv
 - completion: use __gitcomp_builtin in _git_merge_base
 - completion: use __gitcomp_builtin in _git_merge
 - completion: use __gitcomp_builtin in _git_ls_remote
 - completion: use __gitcomp_builtin in _git_ls_files
 - completion: use __gitcomp_builtin in _git_init
 - completion: use __gitcomp_builtin in _git_help
 - completion: use __gitcomp_builtin in _git_grep
 - completion: use __gitcomp_builtin in _git_gc
 - completion: use __gitcomp_builtin in _git_fsck
 - completion: use __gitcomp_builtin in _git_fetch
 - completion: use __gitcomp_builtin in _git_difftool
 - completion: use __gitcomp_builtin in _git_describe
 - completion: use __gitcomp_builtin in _git_config
 - completion: use __gitcomp_builtin in _git_commit
 - completion: use __gitcomp_builtin in _git_clone
 - completion: use __gitcomp_builtin in _git_clean
 - completion: use __gitcomp_builtin in _git_cherry_pick
 - completion: use __gitcomp_builtin in _git_checkout
 - completion: use __gitcomp_builtin in _git_branch
 - completion: use __gitcomp_builtin in _git_apply
 - completion: use __gitcomp_builtin in _git_am
 - completion: use __gitcomp_builtin in _git_add
 - git-completion.bash: introduce __gitcomp_builtin
 - parse-options: let OPT__FORCE take optional flags argument
 - parse-options: add OPT_xxx_F() variants
 - parse-options: support --git-completion-helper

 Will see another reroll.
 cf. <CACsJy8BoPxbt=hqAd9fS7MLiF33FVtAk0=Fr_q7UgYy1YvEg0w@mail.gmail.com>


* nd/trace-index-ops (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 91e362b26a)
 + trace: measure where the time is spent in the index-heavy operations

 Will merge to 'master'.


* pc/submodule-helper-foreach (2018-02-02) 5 commits
 - submodule: port submodule subcommand 'foreach' from shell to C
 - submodule foreach: document variable '$displaypath'
 - submodule foreach: clarify the '$toplevel' variable documentation
 - submodule foreach: document '$sm_path' instead of '$path'
 - submodule foreach: correct '$path' in nested submodules from a subdirectory

 Waiting for the discussion to finish.
 cf. <20180206150044.1bffbb573c088d38c8e44bf5@google.com>


* rs/cocci-strbuf-addf-to-addstr (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 0016008a97)
 + cocci: simplify check for trivial format strings

 Will merge to 'master'.


* tg/reset-hard-show-head-with-pretty (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 596a4ec00d)
 + reset --hard: make use of the pretty machinery

 The way "git reset --hard" reports the commit the updated HEAD
 points at is made consistent with the way how the commit title is
 generated by the other parts of the system.  This matters when the
 title is spread across physically multiple lines.

 Will merge to 'master'.


* tg/worktree-add-existing-branch (2018-02-05) 3 commits
 - worktree: teach "add" to check out existing branches
 - worktree: be clearer when "add" dwim-ery kicks in
 - worktree: improve message when creating a new worktree

 "git worktree add" learned to check out an existing branch.

 Expecting a reroll.
 cf. <CAPig+cRLohiqR_Drh7P0q3XbvC22WLjNwH0YLZo3dqFzZZuAPw@mail.gmail.com>
 cf. <CACsJy8BEKYqW+Ne_WY2RBaSbb9OKcjREtrawStj=eJsVsia_Jw@mail.gmail.com>
 The general idea is good, just end-user facing messages are found
 suboptimal.


* nm/tag-edit (2018-02-07) 1 commit
 - tag: add --edit option


* sm/mv-dry-run-update (2018-02-07) 2 commits
 - mv: remove unneeded 'if (!show_only)'
 - t7001: add test case for --dry-run


* ab/fetch-prune (2018-02-09) 17 commits
 - fetch: make the --prune-tags work with <url>
 - fetch: add a --prune-tags option and fetch.pruneTags config
 - fetch tests: add scaffolding for the new fetch.pruneTags
 - git-fetch & config doc: link to the new PRUNING section
 - git remote doc: correct dangerous lies about what prune does
 - git fetch doc: add a new section to explain the ins & outs of pruning
 - fetch tests: fetch <url> <spec> as well as fetch [<remote>]
 - fetch tests: expand case/esac for later change
 - fetch tests: double quote a variable for interpolation
 - fetch tests: test --prune and refspec interaction
 - fetch tests: add a tag to be deleted to the pruning tests
 - fetch tests: re-arrange arguments for future readability
 - fetch tests: refactor in preparation for testing tag pruning
 - remote: add a macro for "refs/tags/*:refs/tags/*"
 - fetch: stop accessing "remote" variable indirectly
 - fetch: trivially refactor assignment to ref_nr
 - fetch: don't redundantly NULL something calloc() gave us

 Clarify how configured fetch refspecs interact with the "--prune"
 option of "git fetch", and also add a handy short-hand for getting
 rid of stale tags that are locally held.


* po/object-id (2018-01-30) 12 commits
  (merged to 'next' on 2018-02-08 at 701311e8ea)
 + sha1_file: rename hash_sha1_file_literally
 + sha1_file: convert write_loose_object to object_id
 + sha1_file: convert force_object_loose to object_id
 + sha1_file: convert write_sha1_file to object_id
 + notes: convert write_notes_tree to object_id
 + notes: convert combine_notes_* to object_id
 + commit: convert commit_tree* to object_id
 + match-trees: convert splice_tree to object_id
 + cache: clear whole hash buffer with oidclr
 + sha1_file: convert hash_sha1_file to object_id
 + dir: convert struct sha1_stat to use object_id
 + sha1_file: convert pretend_sha1_file to object_id

 Conversion from uchar[20] to struct object_id continues.

 Will merge to 'master'.


* nd/format-patch-stat-width (2018-02-02) 2 commits
  (merged to 'next' on 2018-02-08 at c03e8a084e)
 + format-patch: reduce patch diffstat width to 72
 + format-patch: keep cover-letter diffstat wrapped in 72 columns

 "git format-patch" learned to give 72-cols to diffstat, which is
 consistent with other line length limits the subcommand uses for
 its output meant for e-mails.

 Will merge to 'master'.


* sb/pull-rebase-submodule (2018-01-25) 1 commit
  (merged to 'next' on 2018-02-08 at 38fa97f855)
 + builtin/pull: respect verbosity settings in submodules

 "git pull --rebase" did not pass verbosity setting down when
 recursing into a submodule.

 Will merge to 'master'.


* sg/test-i18ngrep (2018-02-08) 9 commits
  (merged to 'next' on 2018-02-08 at e83eb33909)
 + t: make 'test_i18ngrep' more informative on failure
 + t: validate 'test_i18ngrep's parameters
 + t: move 'test_i18ncmp' and 'test_i18ngrep' to 'test-lib-functions.sh'
 + t5536: let 'test_i18ngrep' read the file without redirection
 + t5510: consolidate 'grep' and 'test_i18ngrep' patterns
 + t4001: don't run 'git status' upstream of a pipe
 + t6022: don't run 'git merge' upstream of a pipe
 + t5812: add 'test_i18ngrep's missing filename parameter
 + t5541: add 'test_i18ngrep's missing filename parameter

 Test fixes.

 Will merge to 'master'.


* bw/c-plus-plus (2018-01-30) 37 commits
 - replace: rename 'new' variables
 - trailer: rename 'template' variables
 - tempfile: rename 'template' variables
 - wrapper: rename 'template' variables
 - environment: rename 'namespace' variables
 - diff: rename 'template' variables
 - environment: rename 'template' variables
 - init-db: rename 'template' variables
 - unpack-trees: rename 'new' variables
 - trailer: rename 'new' variables
 - submodule: rename 'new' variables
 - split-index: rename 'new' variables
 - remote: rename 'new' variables
 - ref-filter: rename 'new' variables
 - read-cache: rename 'new' variables
 - line-log: rename 'new' variables
 - imap-send: rename 'new' variables
 - http: rename 'new' variables
 - entry: rename 'new' variables
 - diffcore-delta: rename 'new' variables
 - diff: rename 'new' variables
 - diff-lib: rename 'new' variable
 - commit: rename 'new' variables
 - combine-diff: rename 'new' variables
 - remote: rename 'new' variables
 - reflog: rename 'new' variables
 - pack-redundant: rename 'new' variables
 - help: rename 'new' variables
 - checkout: rename 'new' variables
 - apply: rename 'new' variables
 - apply: rename 'try' variables
 - diff: rename 'this' variables
 - rev-parse: rename 'this' variable
 - pack-objects: rename 'this' variables
 - blame: rename 'this' variables
 - object: rename function 'typename' to 'type_name'
 - object_info: change member name from 'typename' to 'type_name'

 I do not mind refraining from using these keywords in a foreign
 language in our codebase too much, but at the same time, renaming
 must be done a bit more thoughtfully.  When the original uses 'new'
 together with and in contrast to 'old', renaming 'new' must be done
 while preserving the pairing (which may involve renaming 'old' as
 well), for example.

 Backburnered, i.e. will drop if other topics start to conflict with
 it, but will accept rerolls.


* nd/ignore-glob-doc-update (2018-02-02) 1 commit
  (merged to 'next' on 2018-02-08 at 22ba92e49b)
 + gitignore.txt: elaborate shell glob syntax

 Doc update.

 Will merge to 'master'.


* nd/rebase-show-current-patch (2018-02-12) 3 commits
 - rebase: introduce and use pseudo-ref REBASE_HEAD
 - rebase: add --show-current-patch
 - am: add --show-current-patch

 The new "--show-current-patch" option gives an end-user facing way
 to get the diff being applied when "git rebase" (and "git am")
 stops with a conflict.


* jh/status-no-ahead-behind (2018-01-24) 4 commits
 - status: support --no-ahead-behind in long format
 - status: update short status to respect --no-ahead-behind
 - status: add --[no-]ahead-behind to status and commit for V2 format.
 - stat_tracking_info: return +1 when branches not equal

 "git status" can spend a lot of cycles to compute the relation
 between the current branch and its upstream, which can now be
 disabled with "--no-ahead-behind" option.

 At v5; is this ready for 'next'?


* nd/worktree-move (2018-02-12) 7 commits
 - worktree remove: allow it when $GIT_WORK_TREE is already gone
 - worktree remove: new command
 - worktree move: refuse to move worktrees with submodules
 - worktree move: accept destination as directory
 - worktree move: new command
 - worktree.c: add update_worktree_location()
 - worktree.c: add validate_worktree()

 "git worktree" learned move and remove subcommands.

 Expecting a reroll.
 cf. <20180124095357.19645-1-pclouds@gmail.com>


* kg/packed-ref-cache-fix (2018-01-24) 6 commits
  (merged to 'next' on 2018-02-08 at 370f06a565)
 + packed_ref_cache: don't use mmap() for small files
 + load_contents(): don't try to mmap an empty file
 + packed_ref_iterator_begin(): make optimization more general
 + find_reference_location(): make function safe for empty snapshots
 + create_snapshot(): use `xmemdupz()` rather than a strbuf
 + struct snapshot: store `start` rather than `header_len`

 Avoid mmapping small files while using packed refs (especially ones
 with zero size, which would cause later munmap() to fail).

 Will merge to 'master'.
 A change to a binsearch loop to work around picky complers was
 unnecessarily hard to reason about, but it should do.


* cl/send-email-reply-to (2018-01-17) 2 commits
 - send-email: support separate "Reply-To" address
 - send-email: rename variables for "In-reply-to" to $foo_in_reply_to

 "git send-email" learned "--reply-to=<address>" option.

 May want to get the log messages updated.
 cf. <CAN0heSqxmLoh33i65JPhyQbmPaAcJcwrTCO+ZD4eb+qh8Pf8+w@mail.gmail.com>


* en/merge-recursive-fixes (2018-01-19) 3 commits
  (merged to 'next' on 2018-02-08 at c254292070)
 + merge-recursive: add explanation for src_entry and dst_entry
 + merge-recursive: fix logic ordering issue
 + Tighten and correct a few testcases for merging and cherry-picking
 (this branch is used by en/rename-directory-detection.)

 Will merge to 'master'.


* jc/worktree-add-short-help (2018-01-17) 1 commit
  (merged to 'next' on 2018-02-08 at 9f59ca72ab)
 + worktree: say that "add" takes an arbitrary commit in short-help

 Error message fix.

 Will merge to 'master'.


* js/rebase-recreate-merge (2018-02-12) 12 commits
 - rebase -i: introduce --recreate-merges=[no-]rebase-cousins
 - pull: accept --rebase=recreate to recreate the branch topology
 - sequencer: handle post-rewrite for merge commands
 - sequencer: make refs generated by the `label` command worktree-local
 - rebase: introduce the --recreate-merges option
 - rebase-helper --make-script: introduce a flag to recreate merges
 - sequencer: fast-forward merge commits, if possible
 - sequencer: introduce the `merge` command
 - sequencer: introduce new commands to reset the revision
 - git-rebase--interactive: clarify arguments
 - sequencer: make rearrange_squash() a bit more obvious
 - sequencer: avoid using errno clobbered by rollback_lock_file()

 "git rebase" learned "--recreate-merges" to transplant the whole
 topology of commit graph elsewhere.


* jt/fsck-code-cleanup (2018-01-23) 1 commit
  (merged to 'next' on 2018-02-08 at 199ad41486)
 + fsck: fix leak when traversing trees

 Plug recently introduced leaks in fsck.

 Will merge to 'master'.


* ab/wildmatch-tests (2018-01-30) 10 commits
  (merged to 'next' on 2018-02-08 at f999a3d732)
 + wildmatch test: mark test as EXPENSIVE_ON_WINDOWS
 + test-lib: add an EXPENSIVE_ON_WINDOWS prerequisite
 + wildmatch test: create & test files on disk in addition to in-memory
 + wildmatch test: perform all tests under all wildmatch() modes
 + wildmatch test: use test_must_fail, not ! for test-wildmatch
 + wildmatch test: remove dead fnmatch() test code
 + wildmatch test: use a paranoia pattern from nul_match()
 + wildmatch test: don't try to vertically align our output
 + wildmatch test: use more standard shell style
 + wildmatch test: indent with tabs, not spaces

 More tests for wildmatch functions.

 Will merge to 'master'.


* bw/protocol-v2 (2018-02-07) 35 commits
 - remote-curl: don't request v2 when pushing
 - remote-curl: implement stateless-connect command
 - http: don't always add Git-Protocol header
 - http: allow providing extra headers for http requests
 - remote-curl: store the protocol version the server responded with
 - remote-curl: create copy of the service name
 - pkt-line: add packet_buf_write_len function
 - transport-helper: introduce stateless-connect
 - transport-helper: refactor process_connect_service
 - transport-helper: remove name parameter
 - connect: don't request v2 when pushing
 - connect: refactor git_connect to only get the protocol version once
 - fetch-pack: support shallow requests
 - upload-pack: support shallow requests
 - fetch-pack: perform a fetch using v2
 - upload-pack: introduce fetch server command
 - push: pass ref patterns when pushing
 - fetch: pass ref patterns when fetching
 - ls-remote: pass ref patterns when requesting a remote's refs
 - transport: convert transport_get_remote_refs to take a list of ref patterns
 - transport: convert get_refs_list to take a list of ref patterns
 - connect: request remote refs using v2
 - ls-refs: introduce ls-refs server command
 - serve: introduce git-serve
 - test-pkt-line: introduce a packet-line test helper
 - protocol: introduce enum protocol_version value protocol_v2
 - transport: store protocol version
 - connect: discover protocol version outside of get_remote_heads
 - connect: convert get_remote_heads to use struct packet_reader
 - transport: use get_refs_via_connect to get refs
 - upload-pack: factor out processing lines
 - upload-pack: convert to a builtin
 - pkt-line: add delim packet support
 - pkt-line: introduce struct packet_reader
 - pkt-line: introduce packet_read_with_status

 The beginning of the next-gen transfer protocol.


* ls/checkout-encoding (2018-02-09) 7 commits
 - convert: add round trip check based on 'core.checkRoundtripEncoding'
 - convert: add tracing for 'working-tree-encoding' attribute
 - convert: add 'working-tree-encoding' attribute
 - utf8: add function to detect a missing UTF-16/32 BOM
 - utf8: add function to detect prohibited UTF-16/32 BOM
 - strbuf: add xstrdup_toupper()
 - strbuf: remove unnecessary NUL assignment in xstrdup_tolower()

 The new "checkout-encoding" attribute can ask Git to convert the
 contents to the specified encoding when checking out to the working
 tree (and the other way around when checking in).


* sb/blame-color (2018-02-13) 3 commits
 - builtin/blame: highlight recently changed lines
 - builtin/blame: add option to color metadata fields separately
 - builtin/blame: dim uninteresting metadata
 (this branch uses sb/color-h-cleanup.)

 Expecting a reroll.
 cf. https://public-inbox.org/git/20171110011002.10179-1-sbeller@google.com/#t
 error messages are funny, can segfault, ...


* sg/travis-build-during-script-phase (2018-01-08) 1 commit
 - travis-ci: build Git during the 'script' phase

 So... what do we want to do with this thing?


* nd/fix-untracked-cache-invalidation (2018-02-07) 5 commits
  (merged to 'next' on 2018-02-08 at 23bd5a5d2d)
 + dir.c: ignore paths containing .git when invalidating untracked cache
 + dir.c: stop ignoring opendir() error in open_cached_dir()
 + dir.c: fix missing dir invalidation in untracked code
 + dir.c: avoid stat() in valid_cached_dir()
 + status: add a failing test showing a core.untrackedCache bug
 (this branch is used by ab/untracked-cache-invalidation-docs.)

 Some bugs around "untracked cache" feature have been fixed.

 Seems to uncover bad untracked cache information a bit too loudly.
 cf. <87d11omi2o.fsf@evledraar.gmail.com>


* np/send-email-header-parsing (2017-12-15) 1 commit
 - send-email: extract email-parsing code into a subroutine

 Code refactoring.

 Undecided but inclined to drop.  A "refactor" without the code that
 benefit from the refactoring is hard to tell from code churn whose
 only effect is potential to introduce bugs.


* ab/sha1dc-build (2017-12-08) 3 commits
  (merged to 'next' on 2018-02-08 at ba9ff2b836)
 + sha1dc_git.h: re-arrange an ifdef chain for a subsequent change
 + Makefile: under "make dist", include the sha1collisiondetection submodule
 + Makefile: don't error out under DC_SHA1_EXTERNAL if DC_SHA1_SUBMODULE=auto

 Push the submodule version of collision-detecting SHA-1 hash
 implementation a bit harder on builders.

 Will merge to 'master'.


* en/rename-directory-detection (2018-01-31) 31 commits
 - merge-recursive: ensure we write updates for directory-renamed file
 - merge-recursive: avoid spurious rename/rename conflict from dir renames
 - directory rename detection: new testcases showcasing a pair of bugs
 - merge-recursive: fix remaining directory rename + dirty overwrite cases
 - merge-recursive: fix overwriting dirty files involved in renames
 - merge-recursive: avoid clobbering untracked files with directory renames
 - merge-recursive: apply necessary modifications for directory renames
 - merge-recursive: when comparing files, don't include trees
 - merge-recursive: check for file level conflicts then get new name
 - merge-recursive: add computation of collisions due to dir rename & merging
 - merge-recursive: add a new hashmap for storing file collisions
 - merge-recursive: check for directory level conflicts
 - merge-recursive: add get_directory_renames()
 - merge-recursive: make a helper function for cleanup for handle_renames
 - merge-recursive: add a new hashmap for storing directory renames
 - merge-recursive: split out code for determining diff_filepairs
 - merge-recursive: make !o->detect_rename codepath more obvious
 - merge-recursive: fix leaks of allocated renames and diff_filepairs
 - merge-recursive: introduce new functions to handle rename logic
 - merge-recursive: move the get_renames() function
 - directory rename detection: tests for handling overwriting dirty files
 - directory rename detection: tests for handling overwriting untracked files
 - directory rename detection: miscellaneous testcases to complete coverage
 - directory rename detection: testcases exploring possibly suboptimal merges
 - directory rename detection: more involved edge/corner testcases
 - directory rename detection: testcases checking which side did the rename
 - directory rename detection: files/directories in the way of some renames
 - directory rename detection: partially renamed directory testcase/discussion
 - directory rename detection: testcases to avoid taking detection too far
 - directory rename detection: directory splitting testcases
 - directory rename detection: basic testcases
 (this branch uses en/merge-recursive-fixes.)

 Rename detection logic in "diff" family that is used in "merge" has
 learned to guess when all of x/a, x/b and x/c have moved to z/a,
 z/b and z/c, it is likely that x/d added in the meantime would also
 want to move to z/d by taking the hint that the entire directory
 'x' moved to 'z'.

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Feb 2018, #01; Wed, 7)
@ 2018-02-07 23:13  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2018-02-07 23:13 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

I am migrating my build and integration environment to a different
machine; if you notice anything out of ordinary, please let me know
before I decomission and reimage my usual environment ;-)

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[New Topics]

* bc/hash-algo (2018-02-02) 12 commits
 - bulk-checkin: abstract SHA-1 usage
 - csum-file: abstract uses of SHA-1
 - csum-file: rename sha1file to hashfile
 - read-cache: abstract away uses of SHA-1
 - pack-write: switch various SHA-1 values to abstract forms
 - pack-check: convert various uses of SHA-1 to abstract forms
 - fast-import: switch various uses of SHA-1 to the_hash_algo
 - sha1_file: switch uses of SHA-1 to the_hash_algo
 - builtin/unpack-objects: switch uses of SHA-1 to the_hash_algo
 - builtin/index-pack: improve hash function abstraction
 - hash: create union for hash context allocation
 - hash: move SHA-1 macros to hash.h

 More abstraction of hash function from the codepath.

 Will merge to 'next'.


* bp/untracked-cache-noflush (2018-02-05) 1 commit
 - dir.c: don't flag the index as dirty for changes to the untracked cache

 Writing out the index file when the only thing that changed in it
 is the untracked cache information is often wasteful, and this has
 been optimized out.

 Waiting for the discussion to finish.
 cf. <CACsJy8DLP=j-h3knwX9zOpejAfUbv1YJwfB-iw4476oy0hTfxg@mail.gmail.com>


* cc/perf-aggregate (2018-02-02) 3 commits
 - perf/aggregate: sort JSON fields in output
 - perf/aggregate: add --reponame option
 - perf/aggregate: add --subsection option

 Will merge to 'next'.


* gs/rebase-allow-empty-message (2018-02-07) 1 commit
 - rebase: add --allow-empty-message option

 "git rebase" learned to take "--allow-empty-message" option.

 Will merge to 'next'.


* jc/blame-missing-path (2018-02-07) 1 commit
 - blame: tighten command line parser

 "git blame HEAD COPYING" in a bare repository failed to run, while
 "git blame HEAD -- COPYING" run just fine.

 Will merge to 'next'.


* jt/binsearch-with-fanout (2018-02-02) 2 commits
 - packfile: refactor hash search with fanout table
 - packfile: remove GIT_DEBUG_LOOKUP log statements

 Refactor the code to binary search starting from a fan-out table
 (which is how the packfile is indexed with object names) into a
 reusable helper.

 Will merge to 'next'.


* lw/daemon-log-destination (2018-02-05) 1 commit
 - daemon: add --log-destination=(stderr|syslog|none)

 The log from "git daemon" can be redirected with a new option; one
 relevant use case is to send the log to standard error (instead of
 syslog) when running it from inetd.

 Will merge to 'next'.


* nd/diff-stat-with-summary (2018-02-02) 2 commits
 - diff: add --stat-with-summary
 - diff.c: refactor pprint_rename() to use strbuf

 Waiting for the discussion to finish.


* nd/parseopt-completion (2018-02-07) 42 commits
 - SQUASH???
 - completion: use __gitcomp_builtin in _git_worktree
 - completion: use __gitcomp_builtin in _git_tag
 - completion: use __gitcomp_builtin in _git_status
 - completion: use __gitcomp_builtin in _git_show_branch
 - completion: use __gitcomp_builtin in _git_rm
 - completion: use __gitcomp_builtin in _git_revert
 - completion: use __gitcomp_builtin in _git_reset
 - completion: use __gitcomp_builtin in _git_replace
 - remote: force completing --mirror= instead of --mirror
 - completion: use __gitcomp_builtin in _git_remote
 - completion: use __gitcomp_builtin in _git_push
 - completion: use __gitcomp_builtin in _git_pull
 - completion: use __gitcomp_builtin in _git_notes
 - completion: use __gitcomp_builtin in _git_name_rev
 - completion: use __gitcomp_builtin in _git_mv
 - completion: use __gitcomp_builtin in _git_merge_base
 - completion: use __gitcomp_builtin in _git_merge
 - completion: use __gitcomp_builtin in _git_ls_remote
 - completion: use __gitcomp_builtin in _git_ls_files
 - completion: use __gitcomp_builtin in _git_init
 - completion: use __gitcomp_builtin in _git_help
 - completion: use __gitcomp_builtin in _git_grep
 - completion: use __gitcomp_builtin in _git_gc
 - completion: use __gitcomp_builtin in _git_fsck
 - completion: use __gitcomp_builtin in _git_fetch
 - completion: use __gitcomp_builtin in _git_difftool
 - completion: use __gitcomp_builtin in _git_describe
 - completion: use __gitcomp_builtin in _git_config
 - completion: use __gitcomp_builtin in _git_commit
 - completion: use __gitcomp_builtin in _git_clone
 - completion: use __gitcomp_builtin in _git_clean
 - completion: use __gitcomp_builtin in _git_cherry_pick
 - completion: use __gitcomp_builtin in _git_checkout
 - completion: use __gitcomp_builtin in _git_branch
 - completion: use __gitcomp_builtin in _git_apply
 - completion: use __gitcomp_builtin in _git_am
 - completion: use __gitcomp_builtin in _git_add
 - git-completion.bash: introduce __gitcomp_builtin
 - parse-options: let OPT__FORCE take optional flags argument
 - parse-options: add OPT_xxx_F() variants
 - parse-options: support --git-completion-helper


* nd/trace-index-ops (2018-02-02) 1 commit
 - trace: measure where the time is spent in the index-heavy operations

 Will merge to 'next'.


* pc/submodule-helper-foreach (2018-02-02) 5 commits
 - submodule: port submodule subcommand 'foreach' from shell to C
 - submodule foreach: document variable '$displaypath'
 - submodule foreach: clarify the '$toplevel' variable documentation
 - submodule foreach: document '$sm_path' instead of '$path'
 - submodule foreach: correct '$path' in nested submodules from a subdirectory

 Waiting for the discussion to finish.
 cf. <20180206150044.1bffbb573c088d38c8e44bf5@google.com>


* rs/cocci-strbuf-addf-to-addstr (2018-02-02) 1 commit
 - cocci: simplify check for trivial format strings

 Will merge to 'next'.


* tg/reset-hard-show-head-with-pretty (2018-02-02) 1 commit
 - reset --hard: make use of the pretty machinery

 The way "git reset --hard" reports the commit the updated HEAD
 points at is made consistent with the way how the commit title is
 generated by the other parts of the system.  This matters when the
 title is spread across physically multiple lines.

 Will merge to 'next'.


* tg/worktree-add-existing-branch (2018-02-05) 3 commits
 - worktree: teach "add" to check out existing branches
 - worktree: be clearer when "add" dwim-ery kicks in
 - worktree: improve message when creating a new worktree

 "git worktree add" learned to check out an existing branch.

 Expecting a reroll.
 cf. <CAPig+cRLohiqR_Drh7P0q3XbvC22WLjNwH0YLZo3dqFzZZuAPw@mail.gmail.com>
 cf. <CACsJy8BEKYqW+Ne_WY2RBaSbb9OKcjREtrawStj=eJsVsia_Jw@mail.gmail.com>
 The general idea is good, just end-user facing messages are found
 suboptimal.


* nm/tag-edit (2018-02-07) 1 commit
 - tag: add --edit option


* sm/mv-dry-run-update (2018-02-07) 2 commits
 - mv: remove unneeded 'if (!show_only)'
 - t7001: add test case for --dry-run

--------------------------------------------------
[Stalled]

* av/fsmonitor-updates (2018-01-04) 6 commits
 - fsmonitor: use fsmonitor data in `git diff`
 - fsmonitor: remove debugging lines from t/t7519-status-fsmonitor.sh
 - fsmonitor: make output of test-dump-fsmonitor more concise
 - fsmonitor: update helper tool, now that flags are filled later
 - fsmonitor: stop inline'ing mark_fsmonitor_valid / _invalid
 - dir.c: update comments to match argument name

 Code clean-up on fsmonitor integration, plus optional utilization
 of the fsmonitor data in diff-files.

 Waiting for an update.
 cf. <alpine.DEB.2.21.1.1801042335130.32@MININT-6BKU6QN.europe.corp.microsoft.com>


* pb/bisect-helper-2 (2017-10-28) 8 commits
 - t6030: make various test to pass GETTEXT_POISON tests
 - bisect--helper: `bisect_start` shell function partially in C
 - bisect--helper: `get_terms` & `bisect_terms` shell function in C
 - bisect--helper: `bisect_next_check` shell function in C
 - bisect--helper: `check_and_set_terms` shell function in C
 - wrapper: move is_empty_file() and rename it as is_empty_or_missing_file()
 - bisect--helper: `bisect_write` shell function in C
 - bisect--helper: `bisect_reset` shell function in C

 Expecting a reroll.
 cf. <0102015f5e5ee171-f30f4868-886f-47a1-a4e4-b4936afc545d-000000@eu-west-1.amazonses.com>


* dj/runtime-prefix (2017-12-05) 4 commits
 . exec_cmd: RUNTIME_PREFIX on some POSIX systems
 . Makefile: add Perl runtime prefix support
 . Makefile: add support for "perllibdir"
 . Makefile: generate Perl header from template file

 A build-time option has been added to allow Git to be told to refer
 to its associated files relative to the main binary, in the same
 way that has been possible on Windows for quite some time, for
 Linux, BSDs and Darwin.

 Tentatively kicked out of 'next' to see how well another topic
 ab/simplify-perl-makefile that heavily conflicts with this fares.


* mk/http-backend-content-length (2017-11-27) 4 commits
 - SQUASH???
 - t5560-http-backend-noserver.sh: add CONTENT_LENGTH cases
 - SQUASH???
 - http-backend: respect CONTENT_LENGTH as specified by rfc3875

 The http-backend (used for smart-http transport) used to slurp the
 whole input until EOF, without paying attention to CONTENT_LENGTH
 that is supplied in the environment and instead expecting the Web
 server to close the input stream.  This has been fixed.

 Expecting a reroll.
 Suggested fixes to be used when rerolling is queued, but I'd
 prefer _not_ squashing them myself.

 Also, it may be too complex solution for the problem.
 cf. <20171204171308.GA13332@sigill.intra.peff.net>


* cc/require-tcl-tk-for-build (2017-11-29) 2 commits
 - travis-ci: avoid new tcl/tk build requirement
 - Makefile: check that tcl/tk is installed

 A first-time builder of Git may have installed neither tclsh nor
 msgfmt, in which case git-gui and gitk part will fail and break the
 build.  As a workaround, refuse to run a build when tclsh is not
 installed and NO_TCLTK is not set.

 Undecided.
 I still feel that requring tclsh to be installed, with or without
 "escape hatch" for experts, may be too heavy-handed.


* mg/merge-base-fork-point (2017-09-17) 3 commits
 - merge-base: find fork-point outside partial reflog
 - merge-base: return fork-point outside reflog
 - t6010: test actual test output

 "merge-base --fork-point $branch $commit" is used to guess on which
 commit among the commits that were once at the tip of the $branch the
 $commit was built on top of, and it learns these historical tips from
 the reflog of the $branch.  When the true fork-point is lost due to
 pruning of old reflog entries, the command does not give any output,
 because it has no way to guess correctly and does not want to mislead
 the user with a wrong guess.

 The command has been updated to give the best but not known to be
 correct guess, based on a hope that a merge-base between $commit and a
 virtual merge across all the reflog entries that still are available
 for $branch may still be a closer to the true fork-point than the
 merge-base between $commit and the current tip of the $branch.

 This may have to be offered by an additional option, to allow the
 users that are prepared to see a potentially incorrect guess to opt
 into the feature, without affecting the current callers that may not
 be prepared to accept a guess that is not known to be correct.

 What's the doneness of this one?


* jk/drop-ancient-curl (2017-08-09) 5 commits
 - http: #error on too-old curl
 - curl: remove ifdef'd code never used with curl >=7.19.4
 - http: drop support for curl < 7.19.4
 - http: drop support for curl < 7.16.0
 - http: drop support for curl < 7.11.1

 Some code in http.c that has bitrot is being removed.

 Expecting a reroll.


* mk/use-size-t-in-zlib (2017-08-10) 1 commit
 . zlib.c: use size_t for size

 The wrapper to call into zlib followed our long tradition to use
 "unsigned long" for sizes of regions in memory, which have been
 updated to use "size_t".

 Needs resurrecting by making sure the fix is good and still applies
 (or adjusted to today's codebase).


* mg/status-in-progress-info (2017-05-10) 2 commits
 - status --short --inprogress: spell it as --in-progress
 - status: show in-progress info for short status

 "git status" learns an option to report various operations
 (e.g. "merging") that the user is in the middle of.

 cf. <xmqqmvakcdqw.fsf@gitster.mtv.corp.google.com>

--------------------------------------------------
[Cooking]

* ab/fetch-prune (2018-01-24) 11 commits
 - fetch: add a --fetch-prune option and fetch.pruneTags config
 - fetch tests: add scaffolding for the new fetch.pruneTags
 - git-fetch & config doc: link to the new PRUNING section
 - git remote doc: correct dangerous lies about what prune does
 - git fetch doc: add a new section to explain the ins & outs of pruning
 - fetch tests: test --prune and refspec interaction
 - fetch tests: add a tag to be deleted to the pruning tests
 - fetch tests: re-arrange arguments for future readability
 - fetch tests: refactor in preparation for testing tag pruning
 - fetch: stop accessing "remote" variable indirectly
 - fetch: don't redundantly NULL something calloc() gave us

 Clarify how configured fetch refspecs interact with the "--prune"
 option of "git fetch", and also add a handy short-hand for getting
 rid of stale tags that are locally held.

 Expecting a reroll.
 cf. <87h8quytmq.fsf@evledraar.gmail.com>


* gs/retire-mru (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 4b2e893911)
 + mru: Replace mru.[ch] with list.h implementation
 (this branch uses ot/mru-on-list.)

 Retire mru API as it does not give enough abstraction over
 underlying list API to be worth it.

 Will merge to 'master'.


* ot/mru-on-list (2017-10-01) 1 commit
  (merged to 'next' on 2018-02-07 at ee1ee4ac79)
 + mru: use double-linked list from list.h
 (this branch is used by gs/retire-mru.)

 The first step to getting rid of mru API and using the
 doubly-linked list API directly instead.

 Will merge to 'master'.


* jc/mailinfo-cleanup-fix (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 65d41f993b)
 + mailinfo: avoid segfault when can't open files

 Corner case bugfix.

 Will merge to 'master'.


* po/clang-format-functype-weight (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 0724aaae38)
 + clang-format: adjust penalty for return type line break

 Prevent "clang-format" from breaking line after function return type.

 Will merge to 'master'.


* po/http-push-error-message (2018-01-24) 1 commit
  (merged to 'next' on 2018-02-07 at 3dccd32857)
 + http-push: improve error log

 Debugging aid.

 Will merge to 'master'.


* po/object-id (2018-01-30) 12 commits
 - sha1_file: rename hash_sha1_file_literally
 - sha1_file: convert write_loose_object to object_id
 - sha1_file: convert force_object_loose to object_id
 - sha1_file: convert write_sha1_file to object_id
 - notes: convert write_notes_tree to object_id
 - notes: convert combine_notes_* to object_id
 - commit: convert commit_tree* to object_id
 - match-trees: convert splice_tree to object_id
 - cache: clear whole hash buffer with oidclr
 - sha1_file: convert hash_sha1_file to object_id
 - dir: convert struct sha1_stat to use object_id
 - sha1_file: convert pretend_sha1_file to object_id

 Conversion from uchar[20] to struct object_id continues.

 Will merge to 'next'.


* sg/travis-linux32-sanity (2018-01-30) 5 commits
  (merged to 'next' on 2018-02-07 at 0349cf505c)
 + travis-ci: don't fail if user already exists on 32 bit Linux build job
 + travis-ci: don't run the test suite as root in the 32 bit Linux build
 + travis-ci: don't repeat the path of the cache directory
 + travis-ci: use 'set -e' in the 32 bit Linux build job
 + travis-ci: use 'set -x' for the commands under 'su' in the 32 bit Linux build

 Travis updates.

 Will merge to 'master'.


* jk/daemon-fixes (2018-01-25) 6 commits
  (merged to 'next' on 2018-02-07 at 0e4fe8f8cc)
 + daemon: fix length computation in newline stripping
 + t/lib-git-daemon: add network-protocol helpers
 + daemon: handle NULs in extended attribute string
 + daemon: fix off-by-one in logging extended attributes
 + t/lib-git-daemon: record daemon log
 + t5570: use ls-remote instead of clone for interp tests

 Assorted fixes to "git daemon".

 Will merge to 'master'.


* jt/long-running-process-doc (2018-01-25) 1 commit
  (merged to 'next' on 2018-02-07 at 8bbb42ad3c)
 + Docs: split out long-running subprocess handshake

 Doc updates.

 Will merge to 'master'.


* nd/format-patch-stat-width (2018-02-02) 2 commits
 - format-patch: reduce patch diffstat width to 72
 - format-patch: keep cover-letter diffstat wrapped in 72 columns

 "git format-patch" learned to give 72-cols to diffstat, which is
 consistent with other line length limits the subcommand uses for
 its output meant for e-mails.

 Will merge to 'next'.


* nd/list-merge-strategy (2018-01-26) 1 commit
  (merged to 'next' on 2018-02-07 at a75d04a675)
 + completion: fix completing merge strategies on non-C locales

 Completion of "git merge -s<strategy>" (in contrib/) did not work
 well in non-C locale.

 Will merge to 'master'.


* sb/pull-rebase-submodule (2018-01-25) 1 commit
 - builtin/pull: respect verbosity settings in submodules

 Will merge to 'next'.


* sg/test-i18ngrep (2018-01-26) 10 commits
 - t: make 'test_i18ngrep' more informative on failure
 - t: make sure that 'test_i18ngrep' got enough parameters
 - t: forbid piping into 'test_i18ngrep'
 - t: move 'test_i18ncmp' and 'test_i18ngrep' to 'test-lib-functions.sh'
 - t5536: let 'test_i18ngrep' read the file without redirection
 - t5510: consolidate 'grep' and 'test_i18ngrep' patterns
 - t4001: don't run 'git status' upstream of a pipe
 - t6022: don't run 'git merge' upstream of a pipe
 - t5812: add 'test_i18ngrep's missing filename parameter
 - t5541: add 'test_i18ngrep's missing filename parameter

 Test fixes.

 Expecting a reroll.
 cf. <CAM0VKjkf=51i1YPqdNm=pyPHaNNguXLu0T1iHDYv28jW92QTow@mail.gmail.com>


* bw/c-plus-plus (2018-01-30) 37 commits
 - replace: rename 'new' variables
 - trailer: rename 'template' variables
 - tempfile: rename 'template' variables
 - wrapper: rename 'template' variables
 - environment: rename 'namespace' variables
 - diff: rename 'template' variables
 - environment: rename 'template' variables
 - init-db: rename 'template' variables
 - unpack-trees: rename 'new' variables
 - trailer: rename 'new' variables
 - submodule: rename 'new' variables
 - split-index: rename 'new' variables
 - remote: rename 'new' variables
 - ref-filter: rename 'new' variables
 - read-cache: rename 'new' variables
 - line-log: rename 'new' variables
 - imap-send: rename 'new' variables
 - http: rename 'new' variables
 - entry: rename 'new' variables
 - diffcore-delta: rename 'new' variables
 - diff: rename 'new' variables
 - diff-lib: rename 'new' variable
 - commit: rename 'new' variables
 - combine-diff: rename 'new' variables
 - remote: rename 'new' variables
 - reflog: rename 'new' variables
 - pack-redundant: rename 'new' variables
 - help: rename 'new' variables
 - checkout: rename 'new' variables
 - apply: rename 'new' variables
 - apply: rename 'try' variables
 - diff: rename 'this' variables
 - rev-parse: rename 'this' variable
 - pack-objects: rename 'this' variables
 - blame: rename 'this' variables
 - object: rename function 'typename' to 'type_name'
 - object_info: change member name from 'typename' to 'type_name'

 I do not mind refraining from using these keywords in a foreign
 language in our codebase too much, but at the same time, renaming
 must be done a bit more thoughtfully.  When the original uses 'new'
 together with and in contrast to 'old', renaming 'new' must be done
 while preserving the pairing (which may involve renaming 'old' as
 well), for example.

 Backburnered, i.e. will drop if other topics start to conflict with
 it, but will accept rerolls.


* ew/svn-branch-segfault-fix (2018-01-30) 1 commit
  (merged to 'next' on 2018-02-07 at 1bf8d8f74f)
 + git-svn: control destruction order to avoid segfault

 Workaround for segfault with more recent versions of SVN.

 Will merge to 'master'.


* tz/doc-show-defaults-to-head (2018-01-30) 1 commit
  (merged to 'next' on 2018-02-07 at fa21fb2ec8)
 + doc: mention 'git show' defaults to HEAD

 Doc update.

 Will merge to 'master'.


* nd/ignore-glob-doc-update (2018-02-02) 1 commit
 - gitignore.txt: elaborate shell glob syntax

 Doc update.

 Will merge to 'next'.


* nd/rebase-show-current-patch (2018-01-31) 3 commits
 - rebase: introduce and use pseudo-ref ORIG_COMMIT
 - rebase: add --show-current-patch
 - am: add --show-current-patch

 The new "--show-current-patch" option gives an end-user facing way
 to get the diff being applied when "git rebase" (and "git am")
 stops with a conflict.

 Expecting a reroll.
 cf. <CACsJy8D8PaDR0r+6AKMgPo9UBcWYQC8goaVkVhxMCXCa1E9F9A@mail.gmail.com>


* jh/status-no-ahead-behind (2018-01-24) 4 commits
 - status: support --no-ahead-behind in long format
 - status: update short status to respect --no-ahead-behind
 - status: add --[no-]ahead-behind to status and commit for V2 format.
 - stat_tracking_info: return +1 when branches not equal

 "git status" can spend a lot of cycles to compute the relation
 between the current branch and its upstream, which can now be
 disabled with "--no-ahead-behind" option.

 At v5; is this ready for 'next'?


* nd/worktree-move (2018-01-24) 7 commits
 - worktree remove: allow it when $GIT_WORK_TREE is already gone
 - worktree remove: new command
 - worktree move: refuse to move worktrees with submodules
 - worktree move: accept destination as directory
 - worktree move: new command
 - worktree.c: add update_worktree_location()
 - worktree.c: add validate_worktree()

 "git worktree" learned move and remove subcommands.

 Expecting a reroll.
 cf. <20180124095357.19645-1-pclouds@gmail.com>


* nd/trace-with-env (2018-01-19) 7 commits
  (merged to 'next' on 2018-02-07 at 68399411d9)
 + run-command.c: print new cwd in trace_run_command()
 + run-command.c: print env vars in trace_run_command()
 + run-command.c: print program 'git' when tracing git_cmd mode
 + run-command.c: introduce trace_run_command()
 + trace.c: move strbuf_release() out of print_trace_line()
 + trace: avoid unnecessary quoting
 + sq_quote_argv: drop maxlen parameter

 The tracing machinery learned to report tweaking of environment
 variables as well.

 Will merge to 'master'.


* cl/t9001-cleanup (2018-01-12) 1 commit
  (merged to 'next' on 2018-02-07 at 9b194a9999)
 + t9001: use existing helper in send-email test

 Test clean-up.

 Will merge to 'master'.


* kg/packed-ref-cache-fix (2018-01-24) 6 commits
 - packed_ref_cache: don't use mmap() for small files
 - load_contents(): don't try to mmap an empty file
 - packed_ref_iterator_begin(): make optimization more general
 - find_reference_location(): make function safe for empty snapshots
 - create_snapshot(): use `xmemdupz()` rather than a strbuf
 - struct snapshot: store `start` rather than `header_len`

 Avoid mmapping small files while using packed refs (especially ones
 with zero size, which would cause later munmap() to fail).

 Will merge to 'next'.
 A change to a binsearch loop to work around picky complers was
 unnecessarily hard to reason about, but it should do.


* ks/submodule-doc-updates (2018-01-16) 2 commits
  (merged to 'next' on 2018-02-07 at aff2fa1650)
 + Doc/git-submodule: improve readability and grammar of a sentence
 + Doc/gitsubmodules: make some changes to improve readability and syntax

 Doc updates.

 Will merge to 'master'.


* nd/shared-index-fix (2018-01-24) 3 commits
  (merged to 'next' on 2018-02-07 at c5d6e68c91)
 + read-cache: don't write index twice if we can't write shared index
 + read-cache.c: move tempfile creation/cleanup out of write_shared_index
 + read-cache.c: change type of "temp" in write_shared_index()

 Code clean-up.

 Will merge to 'master'.


* rs/describe-unique-abbrev (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at b5383e2d05)
 + describe: use strbuf_add_unique_abbrev() for adding short hashes

 Code clean-up.

 Will merge to 'master'.


* tb/crlf-conv-flags (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at 1981be1b46)
 + convert_to_git(): safe_crlf/checksafe becomes int conv_flags
 (this branch is used by ls/checkout-encoding.)

 Code clean-up.

 Will merge to 'master'.


* nd/diff-flush-before-warning (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at 9c67f58ae0)
 + diff.c: flush stdout before printing rename warnings

 Avoid showing a warning message in the middle of a line of "git
 diff" output.

 Will merge to 'master'.


* rb/hashmap-h-compilation-fix (2018-01-16) 1 commit
  (merged to 'next' on 2018-02-07 at 780bc6d06b)
 + hashmap.h: remove unused variable

 Code clean-up.

 Will merge to 'master'.


* cc/sha1-file-name (2018-01-19) 2 commits
  (merged to 'next' on 2018-02-07 at a50b171a84)
 + sha1_file: improve sha1_file_name() perfs
 + sha1_file: remove static strbuf from sha1_file_name()

 Code clean-up.

 Will merge to 'master'.


* cl/send-email-reply-to (2018-01-17) 2 commits
 - send-email: support separate "Reply-To" address
 - send-email: rename variables for "In-reply-to" to $foo_in_reply_to

 "git send-email" learned "--reply-to=<address>" option.

 May want to get the log messages updated.
 cf. <CAN0heSqxmLoh33i65JPhyQbmPaAcJcwrTCO+ZD4eb+qh8Pf8+w@mail.gmail.com>


* ds/use-get-be64 (2018-01-19) 1 commit
  (merged to 'next' on 2018-02-07 at 6d6d5ba71d)
 + packfile: use get_be64() for large offsets

 Code clean-up.

 Will merge to 'master'.


* en/merge-recursive-fixes (2018-01-19) 3 commits
 - merge-recursive: add explanation for src_entry and dst_entry
 - merge-recursive: fix logic ordering issue
 - Tighten and correct a few testcases for merging and cherry-picking
 (this branch is used by en/rename-directory-detection.)

 Will merge to 'next'.


* jc/worktree-add-short-help (2018-01-17) 1 commit
 - worktree: say that "add" takes an arbitrary commit in short-help

 Error message fix.

 Will merge to 'next'.


* js/rebase-recreate-merge (2018-01-30) 10 commits
 - rebase -i: introduce --recreate-merges=[no-]rebase-cousins
 - pull: accept --rebase=recreate to recreate the branch topology
 - sequencer: handle autosquash and post-rewrite for merge commands
 - sequencer: make refs generated by the `label` command worktree-local
 - rebase: introduce the --recreate-merges option
 - rebase-helper --make-script: introduce a flag to recreate merges
 - sequencer: fast-forward merge commits, if possible
 - sequencer: introduce the `merge` command
 - sequencer: introduce new commands to reset the revision
 - git-rebase--interactive: clarify arguments

 "git rebase" learned "--recreate-merges" to transplant the whole
 topology of commit graph elsewhere.

 Not learning anything other than the parent info from an existing
 merge was found unsatisfactory by some.  It is something that can
 be fixed incrementally without breaking end-user experience, I
 would think, by doing the same cherry-pick 3-way merge.
 cf. <87k1vpqq85.fsf@javad.com>


* jt/http-redact-cookies (2018-01-19) 2 commits
  (merged to 'next' on 2018-02-07 at a8c3416a7d)
 + http: support omitting data from traces
 + http: support cookie redaction when tracing

 The http tracing code, often used to debug connection issues,
 learned to redact potentially sensitive information from its output
 so that it can be more safely sharable.

 Will merge to 'master'.


* mr/packed-ref-store-fix (2018-01-19) 1 commit
  (merged to 'next' on 2018-02-07 at 17d32e99da)
 + files_initial_transaction_commit(): only unlock if locked

 Crash fix for a corner case where an error codepath tried to unlock
 what it did not acquire lock on.

 Will merge to 'master'.


* rs/strbuf-cocci-workaround (2018-01-19) 1 commit
  (merged to 'next' on 2018-02-07 at 73a2c4c769)
 + cocci: use format keyword instead of a literal string

 Update Coccinelle rules to catch and optimize strbuf_addf(&buf, "%s", str)

 Will merge to 'master'.


* sg/cocci-move-array (2018-01-22) 1 commit
  (merged to 'next' on 2018-02-07 at 6ced765979)
 + Use MOVE_ARRAY

 Code clean-up.

 Will merge to 'master'.


* tg/split-index-fixes (2018-01-19) 3 commits
  (merged to 'next' on 2018-02-07 at 52d7a92ec5)
 + travis: run tests with GIT_TEST_SPLIT_INDEX
 + split-index: don't write cache tree with null oid entries
 + read-cache: fix reading the shared index for other repos

 The split-index mode had a few corner case bugs fixed.

 Will merge to 'master'.


* jt/fsck-code-cleanup (2018-01-23) 1 commit
 - fsck: fix leak when traversing trees

 Will merge to 'next'.


* ab/wildmatch-tests (2018-01-30) 10 commits
 - wildmatch test: mark test as EXPENSIVE_ON_WINDOWS
 - test-lib: add an EXPENSIVE_ON_WINDOWS prerequisite
 - wildmatch test: create & test files on disk in addition to in-memory
 - wildmatch test: perform all tests under all wildmatch() modes
 - wildmatch test: use test_must_fail, not ! for test-wildmatch
 - wildmatch test: remove dead fnmatch() test code
 - wildmatch test: use a paranoia pattern from nul_match()
 - wildmatch test: don't try to vertically align our output
 - wildmatch test: use more standard shell style
 - wildmatch test: indent with tabs, not spaces

 More tests for wildmatch functions.

 Will merge to 'next'.


* bw/protocol-v2 (2018-02-07) 35 commits
 - remote-curl: don't request v2 when pushing
 - remote-curl: implement stateless-connect command
 - http: don't always add Git-Protocol header
 - http: allow providing extra headers for http requests
 - remote-curl: store the protocol version the server responded with
 - remote-curl: create copy of the service name
 - pkt-line: add packet_buf_write_len function
 - transport-helper: introduce stateless-connect
 - transport-helper: refactor process_connect_service
 - transport-helper: remove name parameter
 - connect: don't request v2 when pushing
 - connect: refactor git_connect to only get the protocol version once
 - fetch-pack: support shallow requests
 - upload-pack: support shallow requests
 - fetch-pack: perform a fetch using v2
 - upload-pack: introduce fetch server command
 - push: pass ref patterns when pushing
 - fetch: pass ref patterns when fetching
 - ls-remote: pass ref patterns when requesting a remote's refs
 - transport: convert transport_get_remote_refs to take a list of ref patterns
 - transport: convert get_refs_list to take a list of ref patterns
 - connect: request remote refs using v2
 - ls-refs: introduce ls-refs server command
 - serve: introduce git-serve
 - test-pkt-line: introduce a packet-line test helper
 - protocol: introduce enum protocol_version value protocol_v2
 - transport: store protocol version
 - connect: discover protocol version outside of get_remote_heads
 - connect: convert get_remote_heads to use struct packet_reader
 - transport: use get_refs_via_connect to get refs
 - upload-pack: factor out processing lines
 - upload-pack: convert to a builtin
 - pkt-line: add delim packet support
 - pkt-line: introduce struct packet_reader
 - pkt-line: introduce packet_read_with_status

 The beginning of the next-gen transfer protocol.


* ls/checkout-encoding (2018-01-30) 6 commits
 - convert: add tracing for 'working-tree-encoding' attribute
 - convert: add 'working-tree-encoding' attribute
 - utf8: add function to detect a missing UTF-16/32 BOM
 - utf8: add function to detect prohibited UTF-16/32 BOM
 - strbuf: add xstrdup_toupper()
 - strbuf: remove unnecessary NUL assignment in xstrdup_tolower()
 (this branch uses tb/crlf-conv-flags.)

 The new "checkout-encoding" attribute can ask Git to convert the
 contents to the specified encoding when checking out to the working
 tree (and the other way around when checking in).


* pc/submodule-helper (2018-01-16) 2 commits
  (merged to 'next' on 2018-02-07 at 53b4524eca)
 + submodule: port submodule subcommand 'deinit' from shell to C
 + submodule: port submodule subcommand 'sync' from shell to C

 Rewrite two more "git submodule" subcommands in C.

 Will merge to 'master'.


* sb/blame-color (2018-01-08) 4 commits
 - builtin/blame: highlight recently changed lines
 - builtin/blame: add option to color metadata fields separately
 - builtin/blame: dim uninteresting metadata
 - color.h: document and modernize header

 Expecting a reroll.
 cf. https://public-inbox.org/git/20171110011002.10179-1-sbeller@google.com/#t
 error messages are funny, can segfault, ...


* sg/travis-build-during-script-phase (2018-01-08) 1 commit
 - travis-ci: build Git during the 'script' phase

 Still under discussion.
 cf. <5DE3FA05-2347-4BE7-8A1A-A6E5FEEC7C2B@gmail.com>


* nd/fix-untracked-cache-invalidation (2018-02-07) 5 commits
 - dir.c: ignore paths containing .git when invalidating untracked cache
 - dir.c: stop ignoring opendir() error in open_cached_dir()
 - dir.c: fix missing dir invalidation in untracked code
 - dir.c: avoid stat() in valid_cached_dir()
 - status: add a failing test showing a core.untrackedCache bug

 Some bugs around "untracked cache" feature have been fixed.

 Will merge to 'next'.


* np/send-email-header-parsing (2017-12-15) 1 commit
 - send-email: extract email-parsing code into a subroutine

 Code refactoring.

 Undecided but inclined to drop.  A "refactor" without the code that
 benefit from the refactoring is hard to tell from code churn whose
 only effect is potential to introduce bugs.


* ab/sha1dc-build (2017-12-08) 3 commits
 - sha1dc_git.h: re-arrange an ifdef chain for a subsequent change
 - Makefile: under "make dist", include the sha1collisiondetection submodule
 - Makefile: don't error out under DC_SHA1_EXTERNAL if DC_SHA1_SUBMODULE=auto

 Push the submodule version of collision-detecting SHA-1 hash
 implementation a bit harder on builders.

 Will merge to 'next'.


* ab/simplify-perl-makefile (2018-01-03) 3 commits
  (merged to 'next' on 2018-01-23 at 1506e0651a)
 + perl: treat PERLLIB_EXTRA as an extra path again
 + perl: avoid *.pmc and fix Error.pm further
 + Makefile: replace perl/Makefile.PL with simple make rules

 Originally merged to 'next' on 2018-01-03

 The build procedure for perl/ part has been greatly simplified by
 weaning ourselves off of MakeMaker.

 Will merge to 'master'.


* en/rename-directory-detection (2018-01-31) 31 commits
 - merge-recursive: ensure we write updates for directory-renamed file
 - merge-recursive: avoid spurious rename/rename conflict from dir renames
 - directory rename detection: new testcases showcasing a pair of bugs
 - merge-recursive: fix remaining directory rename + dirty overwrite cases
 - merge-recursive: fix overwriting dirty files involved in renames
 - merge-recursive: avoid clobbering untracked files with directory renames
 - merge-recursive: apply necessary modifications for directory renames
 - merge-recursive: when comparing files, don't include trees
 - merge-recursive: check for file level conflicts then get new name
 - merge-recursive: add computation of collisions due to dir rename & merging
 - merge-recursive: add a new hashmap for storing file collisions
 - merge-recursive: check for directory level conflicts
 - merge-recursive: add get_directory_renames()
 - merge-recursive: make a helper function for cleanup for handle_renames
 - merge-recursive: add a new hashmap for storing directory renames
 - merge-recursive: split out code for determining diff_filepairs
 - merge-recursive: make !o->detect_rename codepath more obvious
 - merge-recursive: fix leaks of allocated renames and diff_filepairs
 - merge-recursive: introduce new functions to handle rename logic
 - merge-recursive: move the get_renames() function
 - directory rename detection: tests for handling overwriting dirty files
 - directory rename detection: tests for handling overwriting untracked files
 - directory rename detection: miscellaneous testcases to complete coverage
 - directory rename detection: testcases exploring possibly suboptimal merges
 - directory rename detection: more involved edge/corner testcases
 - directory rename detection: testcases checking which side did the rename
 - directory rename detection: files/directories in the way of some renames
 - directory rename detection: partially renamed directory testcase/discussion
 - directory rename detection: testcases to avoid taking detection too far
 - directory rename detection: directory splitting testcases
 - directory rename detection: basic testcases
 (this branch uses en/merge-recursive-fixes.)

 Rename detection logic in "diff" family that is used in "merge" has
 learned to guess when all of x/a, x/b and x/c have moved to z/a,
 z/b and z/c, it is likely that x/d added in the meantime would also
 want to move to z/d by taking the hint that the entire directory
 'x' moved to 'z'.


* pw/sequencer-in-process-commit (2018-01-24) 14 commits
  (merged to 'next' on 2018-02-07 at ab5961edd9)
 + sequencer: run 'prepare-commit-msg' hook
 + t7505: add tests for cherry-pick and rebase -i/-p
 + t7505: style fixes
 + sequencer: assign only free()able strings to gpg_sign
 + sequencer: improve config handling
 + t3512/t3513: remove KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
 + sequencer: try to commit without forking 'git commit'
 + sequencer: load commit related config
 + sequencer: simplify adding Signed-off-by: trailer
 + commit: move print_commit_summary() to libgit
 + commit: move post-rewrite code to libgit
 + Add a function to update HEAD after creating a commit
 + commit: move empty message checks to libgit
 + t3404: check intermediate squash messages

 The sequencer infrastructure is shared across "git cherry-pick",
 "git rebase -i", etc., and has always spawned "git commit" when it
 needs to create a commit.  It has been taught to do so internally,
 when able, by reusing the codepath "git commit" itself uses, which
 gives performance boost for a few tens of percents in some sample
 scenarios.

 Will merge to 'master'.


* jh/fsck-promisors (2017-12-08) 10 commits
  (merged to 'next' on 2018-01-23 at ca59f5c18e)
 + gc: do not repack promisor packfiles
 + rev-list: support termination at promisor objects
 + sha1_file: support lazily fetching missing objects
 + introduce fetch-object: fetch one promisor object
 + index-pack: refactor writing of .keep files
 + fsck: support promisor objects as CLI argument
 + fsck: support referenced promisor objects
 + fsck: support refs pointing to promisor objects
 + fsck: introduce partialclone extension
 + extension.partialclone: introduce partial clone extension
 (this branch is used by jh/partial-clone.)

 Originally merged to 'next' on 2018-01-17

 In preparation for implementing narrow/partial clone, the machinery
 for checking object connectivity used by gc and fsck has been
 taught that a missing object is OK when it is referenced by a
 packfile specially marked as coming from trusted repository that
 promises to make them available on-demand and lazily.

 Will merge to 'master'.


* jh/partial-clone (2017-12-08) 13 commits
  (merged to 'next' on 2018-01-23 at de0f0111ea)
 + t5616: test bulk prefetch after partial fetch
 + fetch: inherit filter-spec from partial clone
 + t5616: end-to-end tests for partial clone
 + fetch-pack: restore save_commit_buffer after use
 + unpack-trees: batch fetching of missing blobs
 + clone: partial clone
 + partial-clone: define partial clone settings in config
 + fetch: support filters
 + fetch: refactor calculation of remote list
 + fetch-pack: test support excluding large blobs
 + fetch-pack: add --no-filter
 + fetch-pack, index-pack, transport: partial clone
 + upload-pack: add object filtering for partial clone
 (this branch uses jh/fsck-promisors.)

 Originally merged to 'next' on 2018-01-17

 The machinery to clone & fetch, which in turn involves packing and
 unpacking objects, have been told how to omit certain objects using
 the filtering mechanism introduced by the jh/object-filtering
 topic, and also mark the resulting pack as a promisor pack to
 tolerate missing objects, taking advantage of the mechanism
 introduced by the jh/fsck-promisors topic.

 Will merge to 'master'.

^ permalink raw reply	[relevance 1%]

* [PATCH 1/2] Add test case for mv --dry-run to t7001-mv.sh
  @ 2017-12-31 19:11 19%   ` Stefan Moch
  0 siblings, 0 replies; 200+ results
From: Stefan Moch @ 2017-12-31 19:11 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Simon Doodkin, git, Stefan Moch

It checks if mv --dry-run does not move file.

Signed-off-by: Stefan Moch <stefanmoch@mail.de>
---
 t/t7001-mv.sh | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 6e5031f56..d4e6485a2 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -38,6 +38,12 @@ test_expect_success \
     'git diff-tree -r -M --name-status  HEAD^ HEAD | \
     grep "^R100..*path1/COPYING..*path0/COPYING"'
 
+test_expect_success \
+    'mv --dry-run does not move file' \
+    'git mv -n path0/COPYING MOVED &&
+     test -f path0/COPYING &&
+     test ! -f MOVED'
+
 test_expect_success \
     'checking -k on non-existing file' \
     'git mv -k idontexist path0'
-- 
2.14.3


^ permalink raw reply related	[relevance 19%]

* Re: [PATCH 1/2] wrapper.c: consistently quote filenames in error messages
  @ 2017-11-02  5:16 12%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2017-11-02  5:16 UTC (permalink / raw)
  To: Simon Ruderich
  Cc: René Scharfe, Git List, Ralf Thielow, Johannes Schindelin

Junio C Hamano <gitster@pobox.com> writes:

> Simon Ruderich <simon@ruderich.org> writes:
>
>> All other error messages in the file use quotes around the file name.
>>
>> This change removes two translations as "could not write to '%s'" and
>> "could not close '%s'" are already translated and these two are the only
>> occurrences without quotes.
>>
>> Signed-off-by: Simon Ruderich <simon@ruderich.org>
>> ---
>>  wrapper.c | 8 ++++----
>>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> This patch is incomplete without adjusting a handful of tests to
> expect the updated messages, no?

I'll squash these in while queuing, but there might be more that I
didn't notice.

Thansk.

 t/t3600-rm.sh | 2 +-
 t/t7001-mv.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index f8568f8841..ab5500db44 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -688,7 +688,7 @@ test_expect_success 'checking out a commit after submodule removal needs manual
 	git submodule update &&
 	git checkout -q HEAD^ &&
 	git checkout -q master 2>actual &&
-	test_i18ngrep "^warning: unable to rmdir submod:" actual &&
+	test_i18ngrep "^warning: unable to rmdir '\''submod'\'':" actual &&
 	git status -s submod >actual &&
 	echo "?? submod/" >expected &&
 	test_cmp expected actual &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index f5929c46f3..6e5031f56f 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -452,7 +452,7 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
 	git mv sub sub2 &&
 	git commit -m "moved sub to sub2" &&
 	git checkout -q HEAD^ 2>actual &&
-	test_i18ngrep "^warning: unable to rmdir sub2:" actual &&
+	test_i18ngrep "^warning: unable to rmdir '\''sub2'\'':" actual &&
 	git status -s sub2 >actual &&
 	echo "?? sub2/" >expected &&
 	test_cmp expected actual &&

^ permalink raw reply related	[relevance 12%]

* [PATCH 2/2] tests: fix diff order arguments in test_cmp
  @ 2017-10-06 19:00  6% ` Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2017-10-06 19:00 UTC (permalink / raw)
  To: git; +Cc: Stefan Beller

Fix the argument order for test_cmp. When given the expected
result first the diff shows the actual output with '+' and the
expectation with '-', which is the convention for our tests.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 t/t1004-read-tree-m-u-wf.sh          |  2 +-
 t/t4015-diff-whitespace.sh           |  4 ++--
 t/t4205-log-pretty-formats.sh        |  2 +-
 t/t6007-rev-list-cherry-pick-file.sh | 32 ++++++++++++++++----------------
 t/t6013-rev-list-reverse-parents.sh  |  4 ++--
 t/t7001-mv.sh                        |  2 +-
 t/t7005-editor.sh                    |  6 +++---
 t/t7102-reset.sh                     |  4 ++--
 t/t7201-co.sh                        |  4 ++--
 t/t7400-submodule-basic.sh           |  2 +-
 t/t7405-submodule-merge.sh           |  2 +-
 t/t7506-status-submodule.sh          |  4 ++--
 t/t7600-merge.sh                     |  6 +++---
 t/t7610-mergetool.sh                 |  4 ++--
 t/t9001-send-email.sh                |  6 +++---
 15 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh
index c70cf42300..c7ce5d8bb5 100755
--- a/t/t1004-read-tree-m-u-wf.sh
+++ b/t/t1004-read-tree-m-u-wf.sh
@@ -218,7 +218,7 @@ test_expect_success 'D/F' '
 		echo "100644 $a 2	subdir/file2"
 		echo "100644 $b 3	subdir/file2/another"
 	) >expect &&
-	test_cmp actual expect
+	test_cmp expect actual
 
 '
 
diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
index 12d182dc1b..1709e4578b 100755
--- a/t/t4015-diff-whitespace.sh
+++ b/t/t4015-diff-whitespace.sh
@@ -155,7 +155,7 @@ test_expect_success 'ignore-blank-lines: only new lines' '
 " >x &&
 	git diff --ignore-blank-lines >out &&
 	>expect &&
-	test_cmp out expect
+	test_cmp expect out
 '
 
 test_expect_success 'ignore-blank-lines: only new lines with space' '
@@ -165,7 +165,7 @@ test_expect_success 'ignore-blank-lines: only new lines with space' '
  " >x &&
 	git diff -w --ignore-blank-lines >out &&
 	>expect &&
-	test_cmp out expect
+	test_cmp expect out
 '
 
 test_expect_success 'ignore-blank-lines: after change' '
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index ec5f530102..42f584f8b3 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -590,7 +590,7 @@ test_expect_success '%(trailers:unfold) unfolds trailers' '
 test_expect_success ':only and :unfold work together' '
 	git log --no-walk --pretty="%(trailers:only:unfold)" >actual &&
 	git log --no-walk --pretty="%(trailers:unfold:only)" >reverse &&
-	test_cmp actual reverse &&
+	test_cmp reverse actual &&
 	{
 		grep -v patch.description <trailers | unfold &&
 		echo
diff --git a/t/t6007-rev-list-cherry-pick-file.sh b/t/t6007-rev-list-cherry-pick-file.sh
index 2959745196..f0268372d2 100755
--- a/t/t6007-rev-list-cherry-pick-file.sh
+++ b/t/t6007-rev-list-cherry-pick-file.sh
@@ -57,7 +57,7 @@ test_expect_success '--left-right' '
 	git rev-list --left-right B...C > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 test_expect_success '--count' '
@@ -77,14 +77,14 @@ test_expect_success '--cherry-pick bar does not come up empty' '
 	git rev-list --left-right --cherry-pick B...C -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 test_expect_success 'bar does not come up empty' '
 	git rev-list --left-right B...C -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 cat >expect <<EOF
@@ -96,14 +96,14 @@ test_expect_success '--cherry-pick bar does not come up empty (II)' '
 	git rev-list --left-right --cherry-pick F...E -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 test_expect_success 'name-rev multiple --refs combine inclusive' '
 	git rev-list --left-right --cherry-pick F...E -- bar >actual &&
 	git name-rev --stdin --name-only --refs="*tags/F" --refs="*tags/E" \
 		<actual >actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 cat >expect <<EOF
@@ -115,7 +115,7 @@ test_expect_success 'name-rev --refs excludes non-matched patterns' '
 	git rev-list --left-right --cherry-pick F...E -- bar >actual &&
 	git name-rev --stdin --name-only --refs="*tags/F" \
 		<actual >actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 cat >expect <<EOF
@@ -127,14 +127,14 @@ test_expect_success 'name-rev --exclude excludes matched patterns' '
 	git rev-list --left-right --cherry-pick F...E -- bar >actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" --exclude="*E" \
 		<actual >actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 test_expect_success 'name-rev --no-refs clears the refs list' '
 	git rev-list --left-right --cherry-pick F...E -- bar >expect &&
 	git name-rev --stdin --name-only --refs="*tags/F" --refs="*tags/E" --no-refs --refs="*tags/G" \
 		<expect >actual &&
-	test_cmp actual expect
+	test_cmp expect actual
 '
 
 cat >expect <<EOF
@@ -148,7 +148,7 @@ test_expect_success '--cherry-mark' '
 	git rev-list --cherry-mark F...E -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 cat >expect <<EOF
@@ -162,7 +162,7 @@ test_expect_success '--cherry-mark --left-right' '
 	git rev-list --cherry-mark --left-right F...E -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 cat >expect <<EOF
@@ -173,14 +173,14 @@ test_expect_success '--cherry-pick --right-only' '
 	git rev-list --cherry-pick --right-only F...E -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 test_expect_success '--cherry-pick --left-only' '
 	git rev-list --cherry-pick --left-only E...F -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 cat >expect <<EOF
@@ -192,7 +192,7 @@ test_expect_success '--cherry' '
 	git rev-list --cherry F...E -- bar > actual &&
 	git name-rev --stdin --name-only --refs="*tags/*" \
 		< actual > actual.named &&
-	test_cmp actual.named expect
+	test_cmp expect actual.named
 '
 
 cat >expect <<EOF
@@ -201,7 +201,7 @@ EOF
 
 test_expect_success '--cherry --count' '
 	git rev-list --cherry --count F...E -- bar > actual &&
-	test_cmp actual expect
+	test_cmp expect actual
 '
 
 cat >expect <<EOF
@@ -210,7 +210,7 @@ EOF
 
 test_expect_success '--cherry-mark --count' '
 	git rev-list --cherry-mark --count F...E -- bar > actual &&
-	test_cmp actual expect
+	test_cmp expect actual
 '
 
 cat >expect <<EOF
@@ -219,7 +219,7 @@ EOF
 
 test_expect_success '--cherry-mark --left-right --count' '
 	git rev-list --cherry-mark --left-right --count F...E -- bar > actual &&
-	test_cmp actual expect
+	test_cmp expect actual
 '
 
 test_expect_success '--cherry-pick with independent, but identical branches' '
diff --git a/t/t6013-rev-list-reverse-parents.sh b/t/t6013-rev-list-reverse-parents.sh
index 59fc2f06e0..89458d370f 100755
--- a/t/t6013-rev-list-reverse-parents.sh
+++ b/t/t6013-rev-list-reverse-parents.sh
@@ -28,7 +28,7 @@ test_expect_success '--reverse --parents --full-history combines correctly' '
 		perl -e "print reverse <>" > expected &&
 	git rev-list --reverse --parents --full-history master -- foo \
 		> actual &&
-	test_cmp actual expected
+	test_cmp expected actual
 	'
 
 test_expect_success '--boundary does too' '
@@ -36,7 +36,7 @@ test_expect_success '--boundary does too' '
 		perl -e "print reverse <>" > expected &&
 	git rev-list --boundary --reverse --parents --full-history \
 		master ^root -- foo > actual &&
-	test_cmp actual expected
+	test_cmp expected actual
 	'
 
 test_done
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index cbc5fb37fe..f5929c46f3 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -488,7 +488,7 @@ test_expect_success 'moving a submodule in nested directories' '
 		git config -f ../.gitmodules submodule.deep/directory/hierarchy/sub.path >../actual &&
 		echo "directory/hierarchy/sub" >../expect
 	) &&
-	test_cmp actual expect
+	test_cmp expect actual
 '
 
 test_expect_failure 'moving nested submodules' '
diff --git a/t/t7005-editor.sh b/t/t7005-editor.sh
index 1b530b5022..29e5043b94 100755
--- a/t/t7005-editor.sh
+++ b/t/t7005-editor.sh
@@ -38,7 +38,7 @@ test_expect_success setup '
 	test_commit "$msg" &&
 	echo "$msg" >expect &&
 	git show -s --format=%s > actual &&
-	test_cmp actual expect
+	test_cmp expect actual
 
 '
 
@@ -85,7 +85,7 @@ do
 		git --exec-path=. commit --amend &&
 		git show -s --pretty=oneline |
 		sed -e "s/^[0-9a-f]* //" >actual &&
-		test_cmp actual expect
+		test_cmp expect actual
 	'
 done
 
@@ -107,7 +107,7 @@ do
 		git --exec-path=. commit --amend &&
 		git show -s --pretty=oneline |
 		sed -e "s/^[0-9a-f]* //" >actual &&
-		test_cmp actual expect
+		test_cmp expect actual
 	'
 done
 
diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh
index 86f23be34a..95653a08ca 100755
--- a/t/t7102-reset.sh
+++ b/t/t7102-reset.sh
@@ -428,9 +428,9 @@ test_expect_success 'test --mixed <paths>' '
 	git reset HEAD -- file1 file2 file3 &&
 	test_must_fail git diff --quiet &&
 	git diff > output &&
-	test_cmp output expect &&
+	test_cmp expect output &&
 	git diff --cached > output &&
-	test_cmp output cached_expect
+	test_cmp cached_expect output
 '
 
 test_expect_success 'test resetting the index at give paths' '
diff --git a/t/t7201-co.sh b/t/t7201-co.sh
index d4b217b0ee..76c223c967 100755
--- a/t/t7201-co.sh
+++ b/t/t7201-co.sh
@@ -187,7 +187,7 @@ test_expect_success 'format of merge conflict from checkout -m' '
 	d
 	>>>>>>> local
 	EOF
-	test_cmp two expect
+	test_cmp expect two
 '
 
 test_expect_success 'checkout --merge --conflict=diff3 <branch>' '
@@ -213,7 +213,7 @@ test_expect_success 'checkout --merge --conflict=diff3 <branch>' '
 	d
 	>>>>>>> local
 	EOF
-	test_cmp two expect
+	test_cmp expect two
 '
 
 test_expect_success 'switch to another branch while carrying a deletion' '
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index 6f8337ffb5..a39e69a3eb 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -1211,7 +1211,7 @@ test_expect_success 'clone --recurse-submodules with a pathspec works' '
 
 	git clone --recurse-submodules="sub0" multisuper multisuper_clone &&
 	git -C multisuper_clone submodule status |cut -c1,43- >actual &&
-	test_cmp actual expected
+	test_cmp expected actual
 '
 
 test_expect_success 'clone with multiple --recurse-submodules options' '
diff --git a/t/t7405-submodule-merge.sh b/t/t7405-submodule-merge.sh
index 0d5b42a25b..7bfb2f498d 100755
--- a/t/t7405-submodule-merge.sh
+++ b/t/t7405-submodule-merge.sh
@@ -119,7 +119,7 @@ test_expect_success 'merge with one side as a fast-forward of the other' '
 	 git ls-tree test-forward sub | cut -f1 | cut -f3 -d" " > actual &&
 	 (cd sub &&
 	  git rev-parse sub-d > ../expect) &&
-	 test_cmp actual expect)
+	 test_cmp expect actual)
 '
 
 test_expect_success 'merging should conflict for non fast-forward' '
diff --git a/t/t7506-status-submodule.sh b/t/t7506-status-submodule.sh
index 055c90736e..9edf6572ed 100755
--- a/t/t7506-status-submodule.sh
+++ b/t/t7506-status-submodule.sh
@@ -306,7 +306,7 @@ test_expect_success 'diff with merge conflict in .gitmodules' '
 		cd super &&
 		git diff >../diff_actual 2>&1
 	) &&
-	test_cmp diff_actual diff_expect
+	test_cmp diff_expect diff_actual
 '
 
 test_expect_success 'diff --submodule with merge conflict in .gitmodules' '
@@ -314,7 +314,7 @@ test_expect_success 'diff --submodule with merge conflict in .gitmodules' '
 		cd super &&
 		git diff --submodule >../diff_submodule_actual 2>&1
 	) &&
-	test_cmp diff_submodule_actual diff_submodule_expect
+	test_cmp diff_submodule_expect diff_submodule_actual
 '
 
 # We'll setup different cases for further testing:
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 80194b79f9..dfde6a675a 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -697,7 +697,7 @@ test_expect_success 'merge --no-ff --edit' '
 	git cat-file commit HEAD >raw &&
 	grep "work done on the side branch" raw &&
 	sed "1,/^$/d" >actual raw &&
-	test_cmp actual expected
+	test_cmp expected actual
 '
 
 test_expect_success GPG 'merge --ff-only tag' '
@@ -709,7 +709,7 @@ test_expect_success GPG 'merge --ff-only tag' '
 	git merge --ff-only signed &&
 	git rev-parse signed^0 >expect &&
 	git rev-parse HEAD >actual &&
-	test_cmp actual expect
+	test_cmp expect actual
 '
 
 test_expect_success GPG 'merge --no-edit tag should skip editor' '
@@ -721,7 +721,7 @@ test_expect_success GPG 'merge --no-edit tag should skip editor' '
 	EDITOR=false git merge --no-edit signed &&
 	git rev-parse signed^0 >expect &&
 	git rev-parse HEAD^2 >actual &&
-	test_cmp actual expect
+	test_cmp expect actual
 '
 
 test_expect_success 'set up mod-256 conflict scenario' '
diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh
index 381b7df452..1a430b9c40 100755
--- a/t/t7610-mergetool.sh
+++ b/t/t7610-mergetool.sh
@@ -621,7 +621,7 @@ test_expect_success 'file with no base' '
 	test_must_fail git merge master &&
 	git mergetool --no-prompt --tool mybase -- both &&
 	>expected &&
-	test_cmp both expected
+	test_cmp expected both
 '
 
 test_expect_success 'custom commands override built-ins' '
@@ -632,7 +632,7 @@ test_expect_success 'custom commands override built-ins' '
 	test_must_fail git merge master &&
 	git mergetool --no-prompt --tool defaults -- both &&
 	echo master both added >expected &&
-	test_cmp both expected
+	test_cmp expected both
 '
 
 test_expect_success 'filenames seen by tools start with ./' '
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index f30980895c..4d261c2a9c 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -1266,7 +1266,7 @@ test_expect_success $PREREQ 'asks about and fixes 8bit encodings' '
 	grep email-using-8bit stdout &&
 	grep "Which 8bit encoding" stdout &&
 	egrep "Content|MIME" msgtxt1 >actual &&
-	test_cmp actual content-type-decl
+	test_cmp content-type-decl actual
 '
 
 test_expect_success $PREREQ 'sendemail.8bitEncoding works' '
@@ -1277,7 +1277,7 @@ test_expect_success $PREREQ 'sendemail.8bitEncoding works' '
 			--smtp-server="$(pwd)/fake.sendmail" \
 			email-using-8bit >stdout &&
 	egrep "Content|MIME" msgtxt1 >actual &&
-	test_cmp actual content-type-decl
+	test_cmp content-type-decl actual
 '
 
 test_expect_success $PREREQ '--8bit-encoding overrides sendemail.8bitEncoding' '
@@ -1289,7 +1289,7 @@ test_expect_success $PREREQ '--8bit-encoding overrides sendemail.8bitEncoding' '
 			--8bit-encoding=UTF-8 \
 			email-using-8bit >stdout &&
 	egrep "Content|MIME" msgtxt1 >actual &&
-	test_cmp actual content-type-decl
+	test_cmp content-type-decl actual
 '
 
 test_expect_success $PREREQ 'setup expect' '
-- 
2.14.0.rc0.3.g6c2e499285


^ permalink raw reply related	[relevance 6%]

* Re: [PATCH v2] add test for bug in git-mv for recursive submodules
  2017-09-18 20:03  0%           ` Stefan Beller
@ 2017-09-20 13:46  0%             ` Heiko Voigt
  0 siblings, 0 replies; 200+ results
From: Heiko Voigt @ 2017-09-20 13:46 UTC (permalink / raw)
  To: Stefan Beller; +Cc: Junio C Hamano, git@vger.kernel.org

On Mon, Sep 18, 2017 at 01:03:32PM -0700, Stefan Beller wrote:
> >> Took a little while but here is a more clean patch creating individual
> >> submodules for the nesting.
> >>
> >> Cheers Heiko
> 
> Thanks for writing this test!

No worries. :)

> > Thanks.  Stefan, does this look good to you now?
> 
> Yes, though there are nits below.
> 
> > It is not quite clear which step is expected to fail with the
> > current code by reading the test or the proposed log message.  Does
> > "mv" refuse to work and we do not get to run "status", or does
> > "status" report a failure, or do we fail well before that?
> 
> git-mv failing seems like a new possibility without incurring
> another process spawn with the new repository object.
> (Though then we could also just fix the recursed submodule)

It is mv that fails to update everything necessary when using it with
recursively nested submodules. So the git-mv command does not report a
failure here. As an interim fix it could maybe report an error when
encountering nested submodules but the real fix would be to teach it to
recursively spawn the appropriate git-mv commands.

> > The log message that only says "This does not work when ..." is not
> > helpful in figuring it out, either.  Something like "This does not
> > work and fails to update the paths for its configurations" or
> > whatever that describes "what actually happens" (in contrast to
> > "what ought to happen", which you described clearly) should be
> > there.
> >
> > Description on how you happened to have discovered the issue feels a
> > lot less relevant compared to that, and it is totally useless if it
> > is unclear what the issue is in the first place.

Sorry about being a bit brief here. How about dropping that information
how I discovered the bug then and change the commit message to something
like this:

    add test for bug in git-mv for recursive submodules

    When using git-mv with a submodule it will detect that and update
    the paths for its configurations (.gitmodules, worktree and
    gitfile). This does not work in case it encounters nested
    submodules. In that case it only updates the configurations for the
    submodule directly underneath the superproject and fails to update
    the paths for the submodules nested more deeply. This in turn leads
    to the symptom that git status reports that it can not chdir to the
    nested submodule in its old location.

    Lets add a test to document.

?

> >>  t/t7001-mv.sh | 25 +++++++++++++++++++++++++
> >>  1 file changed, 25 insertions(+)
> >>
> >> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> >> index e365d1ff77..cbc5fb37fe 100755
> >> --- a/t/t7001-mv.sh
> >> +++ b/t/t7001-mv.sh
> >> @@ -491,4 +491,29 @@ test_expect_success 'moving a submodule in nested directories' '
> >>       test_cmp actual expect
> >>  '
> >>
> >> +test_expect_failure 'moving nested submodules' '
> >> +     git commit -am "cleanup commit" &&
> >> +     mkdir sub_nested_nested &&
> >> +     (cd sub_nested_nested &&
> 
> We seem to have different styles for nested shell. I prefer
> 
>   outside command &&
>   (
>       first nested command here &&
>       ...
> 
> as that aligns indentation to the nesting level. I have seen
> the style you use a lot in the  test suite, and we do not have
> a guideline in Documentation/CodingGuidelines, so I do not
> complain too loudly. ;)

Yeah we have some different styles it seems ;) So here some reasoning
behind my style:

I actually would agree on your style if 'first nested command' was any
arbitrary command but when I use my style it is always when I use a
nested shell for changing into some directory, doing something there and
then being able to return to the previous directory by closing the nested
shell. So for me the 'cd somewhere' belongs to the brackets similarly
like a condition definition belongs to the if it is used with.

> >> +             touch nested_level2 &&
> >> +             git init &&
> >> +             git add . &&
> >> +             git commit -m "nested level 2"
> >> +     ) &&
> >> +     mkdir sub_nested &&
> >> +     (cd sub_nested &&
> >> +             touch nested_level1 &&
> >> +             git init &&
> >> +             git add . &&
> >> +             git commit -m "nested level 1"
> >> +             git submodule add ../sub_nested_nested &&
> >> +             git commit -m "add nested level 2"
> >> +     ) &&
> >> +     git submodule add ./sub_nested nested_move &&
> >> +     git commit -m "add nested_move" &&
> >> +     git submodule update --init --recursive &&
> 
> So far a nice setup!

Thanks.

> >> +     git mv nested_move sub_nested_moved &&
> 
> This is the offending command that produces the bug,
> as it will break most subsequent commands, such as

Yes.

> >> +     git status
> 
> git-status is one of the basic commands. Without
> status to function, I think it is hard to recover your repo without
> a lot of in-depth knowledge of Git (submodules).
> 
> I wonder if git-status should complain more gracefully
> and fallback to one of --ignore-submodules={dirty, all},
> that actually still works.
> 
> Maybe we could introduce a new default mode for this
> flag, that is "none-except-on-error", though this sounds
> as if we're fixing symptoms instead of the root cause.

I think we should rather fix the root cause. For me git-mv is actually
breaking the repository and as described above one possible interim
solution for me would be for 'git-mv' to error out and tell the user
that it does currently not work on recursively nested submodules.

Cheers Heiko

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2] add test for bug in git-mv for recursive submodules
  2017-09-17  0:46  0%         ` Junio C Hamano
@ 2017-09-18 20:03  0%           ` Stefan Beller
  2017-09-20 13:46  0%             ` Heiko Voigt
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2017-09-18 20:03 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Heiko Voigt, git@vger.kernel.org

>> Took a little while but here is a more clean patch creating individual
>> submodules for the nesting.
>>
>> Cheers Heiko

Thanks for writing this test!

>
> Thanks.  Stefan, does this look good to you now?

Yes, though there are nits below.

> It is not quite clear which step is expected to fail with the
> current code by reading the test or the proposed log message.  Does
> "mv" refuse to work and we do not get to run "status", or does
> "status" report a failure, or do we fail well before that?

git-mv failing seems like a new possibility without incurring
another process spawn with the new repository object.
(Though then we could also just fix the recursed submodule)

> The log message that only says "This does not work when ..." is not
> helpful in figuring it out, either.  Something like "This does not
> work and fails to update the paths for its configurations" or
> whatever that describes "what actually happens" (in contrast to
> "what ought to happen", which you described clearly) should be
> there.
>
> Description on how you happened to have discovered the issue feels a
> lot less relevant compared to that, and it is totally useless if it
> is unclear what the issue is in the first place.
>
>>  t/t7001-mv.sh | 25 +++++++++++++++++++++++++
>>  1 file changed, 25 insertions(+)
>>
>> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
>> index e365d1ff77..cbc5fb37fe 100755
>> --- a/t/t7001-mv.sh
>> +++ b/t/t7001-mv.sh
>> @@ -491,4 +491,29 @@ test_expect_success 'moving a submodule in nested directories' '
>>       test_cmp actual expect
>>  '
>>
>> +test_expect_failure 'moving nested submodules' '
>> +     git commit -am "cleanup commit" &&
>> +     mkdir sub_nested_nested &&
>> +     (cd sub_nested_nested &&

We seem to have different styles for nested shell. I prefer

  outside command &&
  (
      first nested command here &&
      ...

as that aligns indentation to the nesting level. I have seen
the style you use a lot in the  test suite, and we do not have
a guideline in Documentation/CodingGuidelines, so I do not
complain too loudly. ;)


>> +             touch nested_level2 &&
>> +             git init &&
>> +             git add . &&
>> +             git commit -m "nested level 2"
>> +     ) &&
>> +     mkdir sub_nested &&
>> +     (cd sub_nested &&
>> +             touch nested_level1 &&
>> +             git init &&
>> +             git add . &&
>> +             git commit -m "nested level 1"
>> +             git submodule add ../sub_nested_nested &&
>> +             git commit -m "add nested level 2"
>> +     ) &&
>> +     git submodule add ./sub_nested nested_move &&
>> +     git commit -m "add nested_move" &&
>> +     git submodule update --init --recursive &&

So far a nice setup!

>> +     git mv nested_move sub_nested_moved &&

This is the offending command that produces the bug,
as it will break most subsequent commands, such as

>> +     git status

git-status is one of the basic commands. Without
status to function, I think it is hard to recover your repo without
a lot of in-depth knowledge of Git (submodules).

I wonder if git-status should complain more gracefully
and fallback to one of --ignore-submodules={dirty, all},
that actually still works.

Maybe we could introduce a new default mode for this
flag, that is "none-except-on-error", though this sounds
as if we're fixing symptoms instead of the root cause.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2] add test for bug in git-mv for recursive submodules
  2017-09-15 11:50 12%       ` [PATCH v2] add test for bug in git-mv for recursive submodules Heiko Voigt
@ 2017-09-17  0:46  0%         ` Junio C Hamano
  2017-09-18 20:03  0%           ` Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2017-09-17  0:46 UTC (permalink / raw)
  To: Heiko Voigt; +Cc: Stefan Beller, git@vger.kernel.org

Heiko Voigt <hvoigt@hvoigt.net> writes:

> When using git-mv with a submodule it will detect that and update the
> paths for its configurations (.gitmodules, worktree and gitfile). This
> does not work for recursive submodules where a user renames the root
> submodule.
>
> We discovered this fact when working on on-demand fetch for renamed
> submodules. Lets add a test to document.
>
> Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
> ---
> On Fri, Aug 18, 2017 at 12:04:03PM -0700, Stefan Beller wrote:
>> > I just copied the shortcut that they were adding themselfes as submodule
>> > in 'setup submodule'. The whole setup of submodules in this test is like
>> > this. This way we already had a nested submodule structure which I could
>> > just add.
>> >
>> > I agree that this is unrealistic so I can change that in the test I am
>> > adding. But from what I have seen, this shortcut is taken in quite some
>> > places when dealing with submodules.
>> 
>> Please do not make it worse.
>> Once upon a time (late '16 IIRC) I had a series floating on the
>> list removing all occurrences, but there were issues with the
>> series and it did not land.
>
> Took a little while but here is a more clean patch creating individual
> submodules for the nesting.
>
> Cheers Heiko

Thanks.  Stefan, does this look good to you now?

It is not quite clear which step is expected to fail with the
current code by reading the test or the proposed log message.  Does
"mv" refuse to work and we do not get to run "status", or does
"status" report a failure, or do we fail well before that?

The log message that only says "This does not work when ..." is not
helpful in figuring it out, either.  Something like "This does not
work and fails to update the paths for its configurations" or
whatever that describes "what actually happens" (in contrast to
"what ought to happen", which you described clearly) should be
there.  

Description on how you happened to have discovered the issue feels a
lot less relevant compared to that, and it is totally useless if it
is unclear what the issue is in the first place.

>  t/t7001-mv.sh | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index e365d1ff77..cbc5fb37fe 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -491,4 +491,29 @@ test_expect_success 'moving a submodule in nested directories' '
>  	test_cmp actual expect
>  '
>  
> +test_expect_failure 'moving nested submodules' '
> +	git commit -am "cleanup commit" &&
> +	mkdir sub_nested_nested &&
> +	(cd sub_nested_nested &&
> +		touch nested_level2 &&
> +		git init &&
> +		git add . &&
> +		git commit -m "nested level 2"
> +	) &&
> +	mkdir sub_nested &&
> +	(cd sub_nested &&
> +		touch nested_level1 &&
> +		git init &&
> +		git add . &&
> +		git commit -m "nested level 1"
> +		git submodule add ../sub_nested_nested &&
> +		git commit -m "add nested level 2"
> +	) &&
> +	git submodule add ./sub_nested nested_move &&
> +	git commit -m "add nested_move" &&
> +	git submodule update --init --recursive &&
> +	git mv nested_move sub_nested_moved &&
> +	git status
> +'
> +
>  test_done

^ permalink raw reply	[relevance 0%]

* [PATCH v2] add test for bug in git-mv for recursive submodules
  @ 2017-09-15 11:50 12%       ` Heiko Voigt
  2017-09-17  0:46  0%         ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Heiko Voigt @ 2017-09-15 11:50 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Stefan Beller, git@vger.kernel.org

When using git-mv with a submodule it will detect that and update the
paths for its configurations (.gitmodules, worktree and gitfile). This
does not work for recursive submodules where a user renames the root
submodule.

We discovered this fact when working on on-demand fetch for renamed
submodules. Lets add a test to document.

Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
---
On Fri, Aug 18, 2017 at 12:04:03PM -0700, Stefan Beller wrote:
> > I just copied the shortcut that they were adding themselfes as submodule
> > in 'setup submodule'. The whole setup of submodules in this test is like
> > this. This way we already had a nested submodule structure which I could
> > just add.
> >
> > I agree that this is unrealistic so I can change that in the test I am
> > adding. But from what I have seen, this shortcut is taken in quite some
> > places when dealing with submodules.
> 
> Please do not make it worse.
> Once upon a time (late '16 IIRC) I had a series floating on the
> list removing all occurrences, but there were issues with the
> series and it did not land.

Took a little while but here is a more clean patch creating individual
submodules for the nesting.

Cheers Heiko

 t/t7001-mv.sh | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e365d1ff77..cbc5fb37fe 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -491,4 +491,29 @@ test_expect_success 'moving a submodule in nested directories' '
 	test_cmp actual expect
 '
 
+test_expect_failure 'moving nested submodules' '
+	git commit -am "cleanup commit" &&
+	mkdir sub_nested_nested &&
+	(cd sub_nested_nested &&
+		touch nested_level2 &&
+		git init &&
+		git add . &&
+		git commit -m "nested level 2"
+	) &&
+	mkdir sub_nested &&
+	(cd sub_nested &&
+		touch nested_level1 &&
+		git init &&
+		git add . &&
+		git commit -m "nested level 1"
+		git submodule add ../sub_nested_nested &&
+		git commit -m "add nested level 2"
+	) &&
+	git submodule add ./sub_nested nested_move &&
+	git commit -m "add nested_move" &&
+	git submodule update --init --recursive &&
+	git mv nested_move sub_nested_moved &&
+	git status
+'
+
 test_done
-- 
2.14.1.145.gb3622a4


^ permalink raw reply related	[relevance 12%]

* Re: [PATCH] add test for bug in git-mv with nested submodules
  2017-08-17 19:05  0% ` Stefan Beller
@ 2017-08-18 16:06  0%   ` Heiko Voigt
    0 siblings, 1 reply; 200+ results
From: Heiko Voigt @ 2017-08-18 16:06 UTC (permalink / raw)
  To: Stefan Beller; +Cc: Junio C Hamano, git@vger.kernel.org

On Thu, Aug 17, 2017 at 12:05:56PM -0700, Stefan Beller wrote:
> On Thu, Aug 17, 2017 at 3:34 AM, Heiko Voigt <hvoigt@hvoigt.net> wrote:
> > When using git-mv with a submodule it will detect that and update the
> > paths for its configurations (.gitmodules, worktree and gitfile). This
> > does not work for nested submodules where a user renames the root
> > submodule.
> >
> > We discovered this fact when working on on-demand fetch for renamed
> > submodules. Lets add a test to document.
> >
> > Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
> > ---
> >  t/t7001-mv.sh | 9 +++++++++
> >  1 file changed, 9 insertions(+)
> >
> > diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> > index e365d1f..39f8aed 100755
> > --- a/t/t7001-mv.sh
> > +++ b/t/t7001-mv.sh
> > @@ -491,4 +491,13 @@ test_expect_success 'moving a submodule in nested directories' '
> >         test_cmp actual expect
> >  '
> >
> > +test_expect_failure 'moving nested submodules' '
> > +       git commit -am "cleanup commit" &&
> > +       git submodule add ./. sub_nested &&
> 
> If possible, I would avoid adding the repo itself
> as a submodule as it is unrealistic in the wild.
> 
> While it may be ok for the test here, later down the road
> other tests making use of it it may become an issue with
> the URL of the submodule.

I just copied the shortcut that they were adding themselfes as submodule
in 'setup submodule'. The whole setup of submodules in this test is like
this. This way we already had a nested submodule structure which I could
just add.

I agree that this is unrealistic so I can change that in the test I am
adding. But from what I have seen, this shortcut is taken in quite some
places when dealing with submodules.

Cheers Heiko

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] add test for bug in git-mv with nested submodules
  2017-08-17 10:34 13% [PATCH] add test for bug in git-mv with nested submodules Heiko Voigt
@ 2017-08-17 19:05  0% ` Stefan Beller
  2017-08-18 16:06  0%   ` Heiko Voigt
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2017-08-17 19:05 UTC (permalink / raw)
  To: Heiko Voigt; +Cc: Junio C Hamano, git@vger.kernel.org

On Thu, Aug 17, 2017 at 3:34 AM, Heiko Voigt <hvoigt@hvoigt.net> wrote:
> When using git-mv with a submodule it will detect that and update the
> paths for its configurations (.gitmodules, worktree and gitfile). This
> does not work for nested submodules where a user renames the root
> submodule.
>
> We discovered this fact when working on on-demand fetch for renamed
> submodules. Lets add a test to document.
>
> Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
> ---
>  t/t7001-mv.sh | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index e365d1f..39f8aed 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -491,4 +491,13 @@ test_expect_success 'moving a submodule in nested directories' '
>         test_cmp actual expect
>  '
>
> +test_expect_failure 'moving nested submodules' '
> +       git commit -am "cleanup commit" &&
> +       git submodule add ./. sub_nested &&

If possible, I would avoid adding the repo itself
as a submodule as it is unrealistic in the wild.

While it may be ok for the test here, later down the road
other tests making use of it it may become an issue with
the URL of the submodule.

> +       git commit -m "add sub_nested" &&
> +       git submodule update --init --recursive &&
> +       git mv sub_nested sub_nested_moved &&
> +       git status
> +'
> +
>  test_done
> --
> 2.0.0.274.g6b2cd91
>

^ permalink raw reply	[relevance 0%]

* [PATCH] add test for bug in git-mv with nested submodules
@ 2017-08-17 10:34 13% Heiko Voigt
  2017-08-17 19:05  0% ` Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Heiko Voigt @ 2017-08-17 10:34 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

When using git-mv with a submodule it will detect that and update the
paths for its configurations (.gitmodules, worktree and gitfile). This
does not work for nested submodules where a user renames the root
submodule.

We discovered this fact when working on on-demand fetch for renamed
submodules. Lets add a test to document.

Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
---
 t/t7001-mv.sh | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e365d1f..39f8aed 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -491,4 +491,13 @@ test_expect_success 'moving a submodule in nested directories' '
 	test_cmp actual expect
 '
 
+test_expect_failure 'moving nested submodules' '
+	git commit -am "cleanup commit" &&
+	git submodule add ./. sub_nested &&
+	git commit -m "add sub_nested" &&
+	git submodule update --init --recursive &&
+	git mv sub_nested sub_nested_moved &&
+	git status
+'
+
 test_done
-- 
2.0.0.274.g6b2cd91


^ permalink raw reply related	[relevance 13%]

* Re: [PATCH 0/5] Abide by our own rules regarding line endings
  @ 2017-05-03 14:23  3%   ` Johannes Schindelin
  0 siblings, 0 replies; 200+ results
From: Johannes Schindelin @ 2017-05-03 14:23 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git, Junio C Hamano

Hi Jonathan,

On Tue, 2 May 2017, Jonathan Nieder wrote:

> Johannes Schindelin wrote:
> 
> > Over the past decade, there have been a couple of attempts to remedy the
> [...]
> 
> I'm intentionally skimming this cover letter, since anything important
> it says needs to also be in the commit messages.

Sure, makes sense. I tried to do that, too, before sending out my patch
series.

> [...]
> > Without these fixes, Git will fail to build and pass the test suite, as
> > can be verified even on Linux using this cadence:
> >
> > 	git config core.autocrlf true
> > 	rm .git/index && git stash
> > 	make DEVELOPER=1 -j15 test
> 
> This should go in a commit message (or perhaps in all of them).

Hmm, okay. I wanted to keep it out of them, as commit messages are (in my
mind) more about the why?, and a little less about the how? when not
obvious from the diff.

I added a variation to the first patch (because the tests would still
fail, I skipped the `test` from the `make` invocation) and the unmodified
cadence to the "Fix the remaining tests..." patch.

> [...]
> > Johannes Schindelin (5):
> >   Fix build with core.autocrlf=true
> >   git-new-workdir: mark script as LF-only
> >   completion: mark bash script as LF-only
> >   Fix the remaining tests that failed with core.autocrlf=true
> >   t4051: mark supporting files as requiring LF-only line endings
> 
> With or without that change,
> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>

Thanks.

I added that footer to the patches (not to the two new ones, though).

> The t/README bit in patch 4/5 is sad (I want to be able to open
> t/README using an old version of Notepad) but changing that test to
> use another file seems out of scope for what this series does.

Yes, it is sad. Maybe I should list the tests that do this (use files
outside any tNNNN/ directory):

t4003-diff-rename-1.sh (uses t/diff-lib/COPYING)
t4005-diff-rename-2.sh (uses t/diff-lib/COPYING)
t4007-rename-3.sh (uses t/diff-lib/COPYING)
t4008-diff-break-rewrite.sh (uses t/diff-lib/README and t/diff-lib/COPYING)
t4009-diff-rename-4.sh (uses t/diff-lib/COPYING)
t4022-diff-rewrite.sh (uses COPYING)
t4023-diff-rename-typechange.sh (uses COPYING)
t7001-mv.sh (uses README.md (!!!) and COPYING)
t7060-wtstatus.sh (uses t/README)
t7101-reset-empty-subdirs.sh (uses COPYING)

Note most of these tests may *use* those files, but do *not* assume that
they have Unix line endings! Only a couple test compare SHA-1s to
hardcoded values (which, if you ask me, is a bit fragile, given that files
outside the tests' control are used).

Interesting side note: t0022-crlf-rename.sh copies *itself* to the trash*
directory where it is then used to perform tests. So while this test uses
"an outside file", that file happens to be a .sh file which we already
have to mark LF-only for different reasons (Bash likes its input
CR/LF-free).

Another interesting side note: the convention appears to dictate that
supporting files should be either generated in the test script itself, or
be committed into t/tNNNN/ directories (where NNNN matches the respective
test script's number, or reuses another test script's supporting files). A
notable exception is t3901 which has the supporting files t3901-8859-1.txt
and t3901-utf8.txt. I would wageer that this is just a remnant of ancient
times before the current convention, judging by the date of the commit
that added these files: a731ec5eb82 (t3901: test "format-patch | am" pipe
with i18n, 2007-01-13). The scripts t0203-gettext-setlocale-sanity.sh,
t9350-fast-export.sh and t9500-gitweb-standalone-no-errors.sh merely reuse
those files, and when those scripts started using those files, they did
not change their location. I made this move a preparatory step in this
patch series.

Back to the question what to do about those tests that make improper
assumptions about line endings of files outside the tests' realm: I think
I can do this more cleverly, as it would appear that only four test
scripts make hard assumptions about the exact byte sequence of the COPYING
file, and I simply turned those `cp` (and even `cat`!) calls into `tr -d
"\015"` calls.

I will Cc: you on v2.

Ciao,
Dscho

^ permalink raw reply	[relevance 3%]

* [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual
  2017-04-09 19:11  2% [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Ævar Arnfjörð Bjarmason
@ 2017-04-09 19:11  1% ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2017-04-09 19:11 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Ævar Arnfjörð Bjarmason

Mark tests that fail when the TEST_DIRECTORY has a name that's
unusual, i.e. contains control characters, various punctuation etc.

This change is followed by a change that adds the code that picks up
test_fails_on_unusual_directory_names to test-lib.sh, but comes before
that change to not break most of the test suite during bisecting.

This change is the result of:

    for f in $(grep -B3 last_fail_time .prove |grep sh | perl -pe 's/^  (.*?):/$1/');
        do perl -0666 -pi -e 's/^(test_description)/test_fails_on_unusual_directory_names=1\n$1/m' $f
    done

After running the test suite with the aforementioned change to
test-lib.sh. The only exception is t0000-basic.sh, since its testing
the test suite itself its failing 'test --verbose' test needs a change
to the test suite wrapper code to be excluded.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 t/t0000-basic.sh                                 | 2 ++
 t/t0003-attributes.sh                            | 1 +
 t/t0021-conversion.sh                            | 1 +
 t/t0060-path-utils.sh                            | 1 +
 t/t0300-credentials.sh                           | 1 +
 t/t0302-credential-store.sh                      | 1 +
 t/t1006-cat-file.sh                              | 1 +
 t/t1013-read-tree-submodule.sh                   | 1 +
 t/t1020-subdirectory.sh                          | 1 +
 t/t1050-large.sh                                 | 1 +
 t/t1060-object-corruption.sh                     | 1 +
 t/t1300-repo-config.sh                           | 1 +
 t/t1305-config-include.sh                        | 1 +
 t/t1308-config-set.sh                            | 1 +
 t/t1309-early-config.sh                          | 1 +
 t/t1500-rev-parse.sh                             | 1 +
 t/t1504-ceiling-dirs.sh                          | 1 +
 t/t1507-rev-parse-upstream.sh                    | 1 +
 t/t1510-repo-setup.sh                            | 1 +
 t/t1515-rev-parse-outside-repo.sh                | 1 +
 t/t2013-checkout-submodule.sh                    | 1 +
 t/t2025-worktree-add.sh                          | 1 +
 t/t2027-worktree-list.sh                         | 1 +
 t/t2028-worktree-move.sh                         | 1 +
 t/t3040-subprojects-basic.sh                     | 1 +
 t/t3050-subprojects-fetch.sh                     | 1 +
 t/t3409-rebase-preserve-merges.sh                | 1 +
 t/t3426-rebase-submodule.sh                      | 1 +
 t/t3501-revert-cherry-pick.sh                    | 1 +
 t/t3512-cherry-pick-submodule.sh                 | 1 +
 t/t3513-revert-submodule.sh                      | 1 +
 t/t3600-rm.sh                                    | 1 +
 t/t3900-i18n-commit.sh                           | 1 +
 t/t3906-stash-submodule.sh                       | 1 +
 t/t4027-diff-submodule.sh                        | 1 +
 t/t4030-diff-textconv.sh                         | 1 +
 t/t4031-diff-rewrite-binary.sh                   | 1 +
 t/t4035-diff-quiet.sh                            | 1 +
 t/t4041-diff-submodule-option.sh                 | 1 +
 t/t4059-diff-submodule-not-initialized.sh        | 1 +
 t/t4060-diff-submodule-option-diff-format.sh     | 1 +
 t/t4137-apply-submodule.sh                       | 1 +
 t/t4203-mailmap.sh                               | 1 +
 t/t4207-log-decoration-colors.sh                 | 1 +
 t/t4255-am-submodule.sh                          | 1 +
 t/t5000-tar-tree.sh                              | 1 +
 t/t5001-archive-attr.sh                          | 1 +
 t/t5002-archive-attr-pattern.sh                  | 1 +
 t/t5003-archive-zip.sh                           | 1 +
 t/t5150-request-pull.sh                          | 1 +
 t/t5300-pack-object.sh                           | 1 +
 t/t5304-prune.sh                                 | 1 +
 t/t5305-include-tag.sh                           | 1 +
 t/t5306-pack-nobase.sh                           | 1 +
 t/t5310-pack-bitmaps.sh                          | 1 +
 t/t5311-pack-bitmaps-shallow.sh                  | 1 +
 t/t5400-send-pack.sh                             | 1 +
 t/t5401-update-hooks.sh                          | 1 +
 t/t5402-post-merge-hook.sh                       | 1 +
 t/t5403-post-checkout-hook.sh                    | 1 +
 t/t5404-tracking-branches.sh                     | 1 +
 t/t5406-remote-rejects.sh                        | 1 +
 t/t5407-post-rewrite-hook.sh                     | 1 +
 t/t5500-fetch-pack.sh                            | 1 +
 t/t5501-fetch-push-alternates.sh                 | 1 +
 t/t5502-quickfetch.sh                            | 1 +
 t/t5505-remote.sh                                | 1 +
 t/t5509-fetch-push-namespaces.sh                 | 1 +
 t/t5510-fetch.sh                                 | 1 +
 t/t5512-ls-remote.sh                             | 1 +
 t/t5514-fetch-multiple.sh                        | 1 +
 t/t5515-fetch-merge-logic.sh                     | 1 +
 t/t5516-fetch-push.sh                            | 1 +
 t/t5519-push-alternates.sh                       | 1 +
 t/t5520-pull.sh                                  | 1 +
 t/t5521-pull-options.sh                          | 1 +
 t/t5522-pull-symlink.sh                          | 1 +
 t/t5524-pull-msg.sh                              | 1 +
 t/t5525-fetch-tagopt.sh                          | 1 +
 t/t5526-fetch-submodules.sh                      | 1 +
 t/t5527-fetch-odd-refs.sh                        | 1 +
 t/t5531-deep-submodule-push.sh                   | 1 +
 t/t5533-push-cas.sh                              | 1 +
 t/t5535-fetch-push-symref.sh                     | 1 +
 t/t5536-fetch-conflicts.sh                       | 1 +
 t/t5537-fetch-shallow.sh                         | 1 +
 t/t5538-push-shallow.sh                          | 1 +
 t/t5539-fetch-http-shallow.sh                    | 1 +
 t/t5540-http-push-webdav.sh                      | 1 +
 t/t5541-http-push-smart.sh                       | 1 +
 t/t5542-push-http-shallow.sh                     | 1 +
 t/t5544-pack-objects-hook.sh                     | 1 +
 t/t5545-push-options.sh                          | 1 +
 t/t5547-push-quarantine.sh                       | 1 +
 t/t5550-http-fetch-dumb.sh                       | 1 +
 t/t5551-http-fetch-smart.sh                      | 1 +
 t/t5560-http-backend-noserver.sh                 | 1 +
 t/t5561-http-backend.sh                          | 1 +
 t/t5570-git-daemon.sh                            | 1 +
 t/t5572-pull-submodule.sh                        | 1 +
 t/t5600-clone-fail-cleanup.sh                    | 1 +
 t/t5601-clone.sh                                 | 1 +
 t/t5604-clone-reference.sh                       | 1 +
 t/t5605-clone-local.sh                           | 1 +
 t/t5606-clone-options.sh                         | 1 +
 t/t5609-clone-branch.sh                          | 1 +
 t/t5610-clone-detached.sh                        | 1 +
 t/t5611-clone-config.sh                          | 1 +
 t/t5612-clone-refspec.sh                         | 1 +
 t/t5613-info-alternate.sh                        | 1 +
 t/t5614-clone-submodules.sh                      | 1 +
 t/t5615-alternate-env.sh                         | 1 +
 t/t5801-remote-helpers.sh                        | 1 +
 t/t5802-connect-helper.sh                        | 1 +
 t/t5810-proto-disable-local.sh                   | 1 +
 t/t5812-proto-disable-http.sh                    | 1 +
 t/t5813-proto-disable-ssh.sh                     | 1 +
 t/t5814-proto-disable-ext.sh                     | 1 +
 t/t5815-submodule-protos.sh                      | 1 +
 t/t5900-repo-selection.sh                        | 1 +
 t/t6008-rev-list-submodule.sh                    | 1 +
 t/t6030-bisect-porcelain.sh                      | 1 +
 t/t6040-tracking-info.sh                         | 1 +
 t/t6041-bisect-submodule.sh                      | 1 +
 t/t6050-replace.sh                               | 1 +
 t/t6060-merge-index.sh                           | 1 +
 t/t6134-pathspec-in-submodule.sh                 | 1 +
 t/t6200-fmt-merge-msg.sh                         | 1 +
 t/t6500-gc.sh                                    | 1 +
 t/t7001-mv.sh                                    | 1 +
 t/t7003-filter-branch.sh                         | 1 +
 t/t7005-editor.sh                                | 1 +
 t/t7006-pager.sh                                 | 1 +
 t/t7008-grep-binary.sh                           | 1 +
 t/t7010-setup.sh                                 | 1 +
 t/t7064-wtstatus-pv2.sh                          | 1 +
 t/t7103-reset-bare.sh                            | 1 +
 t/t7112-reset-submodule.sh                       | 1 +
 t/t7300-clean.sh                                 | 1 +
 t/t7400-submodule-basic.sh                       | 1 +
 t/t7402-submodule-rebase.sh                      | 1 +
 t/t7403-submodule-sync.sh                        | 1 +
 t/t7405-submodule-merge.sh                       | 1 +
 t/t7406-submodule-update.sh                      | 1 +
 t/t7407-submodule-foreach.sh                     | 1 +
 t/t7408-submodule-reference.sh                   | 1 +
 t/t7409-submodule-detached-work-tree.sh          | 1 +
 t/t7410-submodule-checkout-to.sh                 | 1 +
 t/t7411-submodule-config.sh                      | 1 +
 t/t7413-submodule-is-active.sh                   | 1 +
 t/t7504-commit-msg-hook.sh                       | 1 +
 t/t7506-status-submodule.sh                      | 1 +
 t/t7507-commit-verbose.sh                        | 1 +
 t/t7517-per-repo-email.sh                        | 1 +
 t/t7613-merge-submodule.sh                       | 1 +
 t/t7700-repack.sh                                | 1 +
 t/t7800-difftool.sh                              | 1 +
 t/t7810-grep.sh                                  | 1 +
 t/t7814-grep-recurse-submodules.sh               | 1 +
 t/t9001-send-email.sh                            | 1 +
 t/t9020-remote-svn.sh                            | 1 +
 t/t9100-git-svn-basic.sh                         | 1 +
 t/t9101-git-svn-props.sh                         | 1 +
 t/t9102-git-svn-deep-rmdir.sh                    | 1 +
 t/t9103-git-svn-tracked-directory-removed.sh     | 1 +
 t/t9104-git-svn-follow-parent.sh                 | 1 +
 t/t9105-git-svn-commit-diff.sh                   | 1 +
 t/t9106-git-svn-commit-diff-clobber.sh           | 1 +
 t/t9107-git-svn-migrate.sh                       | 1 +
 t/t9108-git-svn-glob.sh                          | 1 +
 t/t9109-git-svn-multi-glob.sh                    | 1 +
 t/t9110-git-svn-use-svm-props.sh                 | 1 +
 t/t9114-git-svn-dcommit-merge.sh                 | 1 +
 t/t9115-git-svn-dcommit-funky-renames.sh         | 1 +
 t/t9116-git-svn-log.sh                           | 1 +
 t/t9117-git-svn-init-clone.sh                    | 1 +
 t/t9118-git-svn-funky-branch-names.sh            | 1 +
 t/t9120-git-svn-clone-with-percent-escapes.sh    | 1 +
 t/t9122-git-svn-author.sh                        | 1 +
 t/t9123-git-svn-rebuild-with-rewriteroot.sh      | 1 +
 t/t9124-git-svn-dcommit-auto-props.sh            | 1 +
 t/t9125-git-svn-multi-glob-branch-names.sh       | 1 +
 t/t9127-git-svn-partial-rebuild.sh               | 1 +
 t/t9128-git-svn-cmd-branch.sh                    | 1 +
 t/t9129-git-svn-i18n-commitencoding.sh           | 1 +
 t/t9131-git-svn-empty-symlink.sh                 | 1 +
 t/t9132-git-svn-broken-symlink.sh                | 1 +
 t/t9133-git-svn-nested-git-repo.sh               | 1 +
 t/t9134-git-svn-ignore-paths.sh                  | 1 +
 t/t9137-git-svn-dcommit-clobber-series.sh        | 1 +
 t/t9138-git-svn-authors-prog.sh                  | 1 +
 t/t9140-git-svn-reset.sh                         | 1 +
 t/t9141-git-svn-multiple-branches.sh             | 1 +
 t/t9142-git-svn-shallow-clone.sh                 | 1 +
 t/t9143-git-svn-gc.sh                            | 1 +
 t/t9144-git-svn-old-rev_map.sh                   | 1 +
 t/t9145-git-svn-master-branch.sh                 | 1 +
 t/t9146-git-svn-empty-dirs.sh                    | 1 +
 t/t9147-git-svn-include-paths.sh                 | 1 +
 t/t9148-git-svn-propset.sh                       | 1 +
 t/t9150-svk-mergetickets.sh                      | 1 +
 t/t9151-svn-mergeinfo.sh                         | 1 +
 t/t9153-git-svn-rewrite-uuid.sh                  | 1 +
 t/t9154-git-svn-fancy-glob.sh                    | 1 +
 t/t9155-git-svn-fetch-deleted-tag.sh             | 1 +
 t/t9156-git-svn-fetch-deleted-tag-2.sh           | 1 +
 t/t9157-git-svn-fetch-merge.sh                   | 1 +
 t/t9158-git-svn-mergeinfo.sh                     | 1 +
 t/t9159-git-svn-no-parent-mergeinfo.sh           | 1 +
 t/t9160-git-svn-preserve-empty-dirs.sh           | 1 +
 t/t9161-git-svn-mergeinfo-push.sh                | 1 +
 t/t9162-git-svn-dcommit-interactive.sh           | 1 +
 t/t9163-git-svn-reset-clears-caches.sh           | 1 +
 t/t9164-git-svn-dcommit-concurrent.sh            | 1 +
 t/t9165-git-svn-fetch-merge-branch-of-branch.sh  | 1 +
 t/t9166-git-svn-fetch-merge-branch-of-branch2.sh | 1 +
 t/t9167-git-svn-cmd-branch-subproject.sh         | 1 +
 t/t9168-git-svn-partially-globbed-names.sh       | 1 +
 t/t9200-git-cvsexportcommit.sh                   | 1 +
 t/t9300-fast-import.sh                           | 1 +
 t/t9350-fast-export.sh                           | 1 +
 t/t9400-git-cvsserver-server.sh                  | 1 +
 t/t9401-git-cvsserver-crlf.sh                    | 1 +
 t/t9402-git-cvsserver-refs.sh                    | 1 +
 t/t9500-gitweb-standalone-no-errors.sh           | 1 +
 t/t9502-gitweb-standalone-parse-output.sh        | 1 +
 t/t9600-cvsimport.sh                             | 1 +
 t/t9601-cvsimport-vendor-branch.sh               | 1 +
 t/t9602-cvsimport-branches-tags.sh               | 1 +
 t/t9604-cvsimport-timestamps.sh                  | 1 +
 t/t9700-perl-git.sh                              | 1 +
 t/t9902-completion.sh                            | 1 +
 232 files changed, 233 insertions(+)

diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
index 1aa5093f36..8afda030a5 100755
--- a/t/t0000-basic.sh
+++ b/t/t0000-basic.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the very basics part #1.
 
 The rest of the test suite does not check the basic operation of git
@@ -56,6 +57,7 @@ _run_sub_test_lib_test_common () {
 		cat >"$name.sh" <<-EOF &&
 		#!$SHELL_PATH
 
+		test_fails_on_unusual_directory_names=1
 		test_description='$descr (run in sub test-lib)
 
 		This is run in a sub test-lib so that we do not get incorrect
diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index f19ae4f8cc..812f25f8e9 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description=gitattributes
 
 . ./test-lib.sh
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index 161f560446..c1db6d6136 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='blob conversion via gitattributes'
 
 . ./test-lib.sh
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 444b5a4df8..a53195102f 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 David Reiss
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test various path utilities'
 
 . ./test-lib.sh
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index 03bd31e9f2..f4814096a5 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic credential helper tests'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
diff --git a/t/t0302-credential-store.sh b/t/t0302-credential-store.sh
index 1d8d1f210b..d066f4cb1a 100755
--- a/t/t0302-credential-store.sh
+++ b/t/t0302-credential-store.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='credential-store tests'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
index b19f332694..2e7bb356ac 100755
--- a/t/t1006-cat-file.sh
+++ b/t/t1006-cat-file.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git cat-file'
 
 . ./test-lib.sh
diff --git a/t/t1013-read-tree-submodule.sh b/t/t1013-read-tree-submodule.sh
index de1ba02dc5..8228c05775 100755
--- a/t/t1013-read-tree-submodule.sh
+++ b/t/t1013-read-tree-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='read-tree can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh
index df3183ea1a..b9c5513f8a 100755
--- a/t/t1020-subdirectory.sh
+++ b/t/t1020-subdirectory.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Try various core-level commands in subdirectory.
 '
 
diff --git a/t/t1050-large.sh b/t/t1050-large.sh
index 6fd264cff0..7b058a3941 100755
--- a/t/t1050-large.sh
+++ b/t/t1050-large.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2011, Google Inc.
 
+test_fails_on_unusual_directory_names=1
 test_description='adding and checking out large blobs'
 
 . ./test-lib.sh
diff --git a/t/t1060-object-corruption.sh b/t/t1060-object-corruption.sh
index 3f8705139d..ab53e96d5c 100755
--- a/t/t1060-object-corruption.sh
+++ b/t/t1060-object-corruption.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='see how we handle various forms of corruption'
 . ./test-lib.sh
 
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index afcca0d52c..2a4ca101a9 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Johannes Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test git config in different settings'
 
 . ./test-lib.sh
diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh
index e833939320..f03fda78f0 100755
--- a/t/t1305-config-include.sh
+++ b/t/t1305-config-include.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test config file include directives'
 . ./test-lib.sh
 
diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
index ff50960cca..449a0e3440 100755
--- a/t/t1308-config-set.sh
+++ b/t/t1308-config-set.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test git config-set API in different settings'
 
 . ./test-lib.sh
diff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh
index b97357b8ab..99267db020 100755
--- a/t/t1309-early-config.sh
+++ b/t/t1309-early-config.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test read_early_config()'
 
 . ./test-lib.sh
diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh
index 03d3c7f6d6..50c4a6edf5 100755
--- a/t/t1500-rev-parse.sh
+++ b/t/t1500-rev-parse.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git rev-parse'
 . ./test-lib.sh
 
diff --git a/t/t1504-ceiling-dirs.sh b/t/t1504-ceiling-dirs.sh
index 3d51615e42..fc20a947ed 100755
--- a/t/t1504-ceiling-dirs.sh
+++ b/t/t1504-ceiling-dirs.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test GIT_CEILING_DIRECTORIES'
 . ./test-lib.sh
 
diff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh
index b23c4e3fab..dd08e4d251 100755
--- a/t/t1507-rev-parse-upstream.sh
+++ b/t/t1507-rev-parse-upstream.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test <branch>@{upstream} syntax'
 
 . ./test-lib.sh
diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh
index 13ae12dfa7..192bd3d822 100755
--- a/t/t1510-repo-setup.sh
+++ b/t/t1510-repo-setup.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description="Tests of cwd/prefix/worktree/gitdir setup in all cases
 
 A few rules for repo setup:
diff --git a/t/t1515-rev-parse-outside-repo.sh b/t/t1515-rev-parse-outside-repo.sh
index 3ec2971ee5..0641651612 100755
--- a/t/t1515-rev-parse-outside-repo.sh
+++ b/t/t1515-rev-parse-outside-repo.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='check that certain rev-parse options work outside repo'
 . ./test-lib.sh
 
diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh
index e8f70b806f..94d7033009 100755
--- a/t/t2013-checkout-submodule.sh
+++ b/t/t2013-checkout-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='checkout can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh
index b618d6be21..bd0d4633cc 100755
--- a/t/t2025-worktree-add.sh
+++ b/t/t2025-worktree-add.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git worktree add'
 
 . ./test-lib.sh
diff --git a/t/t2027-worktree-list.sh b/t/t2027-worktree-list.sh
index 848da5f368..7b5e802f71 100755
--- a/t/t2027-worktree-list.sh
+++ b/t/t2027-worktree-list.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git worktree list'
 
 . ./test-lib.sh
diff --git a/t/t2028-worktree-move.sh b/t/t2028-worktree-move.sh
index 8298aaf97f..4577add799 100755
--- a/t/t2028-worktree-move.sh
+++ b/t/t2028-worktree-move.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git worktree move, remove, lock and unlock'
 
 . ./test-lib.sh
diff --git a/t/t3040-subprojects-basic.sh b/t/t3040-subprojects-basic.sh
index 0a4ff6d824..0acf434539 100755
--- a/t/t3040-subprojects-basic.sh
+++ b/t/t3040-subprojects-basic.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Basic subproject functionality'
 . ./test-lib.sh
 
diff --git a/t/t3050-subprojects-fetch.sh b/t/t3050-subprojects-fetch.sh
index 2f5f41a012..452c5fb615 100755
--- a/t/t3050-subprojects-fetch.sh
+++ b/t/t3050-subprojects-fetch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetching and pushing project with subproject'
 
 . ./test-lib.sh
diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh
index 8c251c57a6..9ce4749fe6 100755
--- a/t/t3409-rebase-preserve-merges.sh
+++ b/t/t3409-rebase-preserve-merges.sh
@@ -2,6 +2,7 @@
 #
 # Copyright(C) 2008 Stephen Habermann & Andreas Ericsson
 #
+test_fails_on_unusual_directory_names=1
 test_description='git rebase -p should preserve merges
 
 Run "git rebase -p" and check that merges are properly carried along
diff --git a/t/t3426-rebase-submodule.sh b/t/t3426-rebase-submodule.sh
index ebf4f5e4b2..3c39d4cdf0 100755
--- a/t/t3426-rebase-submodule.sh
+++ b/t/t3426-rebase-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='rebase can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
index 4f2a263b63..b8547afe5e 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/t/t3501-revert-cherry-pick.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test cherry-pick and revert with renames
 
   --
diff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh
index 6863b7bb6f..37929530a9 100755
--- a/t/t3512-cherry-pick-submodule.sh
+++ b/t/t3512-cherry-pick-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='cherry-pick can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh
index db9378142a..980ce5233d 100755
--- a/t/t3513-revert-submodule.sh
+++ b/t/t3513-revert-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='revert can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 3c63455729..1df9b1b5f5 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Carl D. Worth
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test of the various options to git rm.'
 
 . ./test-lib.sh
diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh
index 3b94283e35..f3af7bd2db 100755
--- a/t/t3900-i18n-commit.sh
+++ b/t/t3900-i18n-commit.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='commit and log output encodings'
 
 . ./test-lib.sh
diff --git a/t/t3906-stash-submodule.sh b/t/t3906-stash-submodule.sh
index d7219d6f8f..4d4d386342 100755
--- a/t/t3906-stash-submodule.sh
+++ b/t/t3906-stash-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='stash apply can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t4027-diff-submodule.sh b/t/t4027-diff-submodule.sh
index 518bf9524e..f7c146b125 100755
--- a/t/t4027-diff-submodule.sh
+++ b/t/t4027-diff-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='difference in submodules'
 
 . ./test-lib.sh
diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh
index aad6c7f78d..74ba69efe4 100755
--- a/t/t4030-diff-textconv.sh
+++ b/t/t4030-diff-textconv.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='diff.*.textconv tests'
 . ./test-lib.sh
 
diff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh
index eacc6694f7..01f37948ae 100755
--- a/t/t4031-diff-rewrite-binary.sh
+++ b/t/t4031-diff-rewrite-binary.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='rewrite diff on binary file'
 
 . ./test-lib.sh
diff --git a/t/t4035-diff-quiet.sh b/t/t4035-diff-quiet.sh
index 2f1737fcef..8353b05934 100755
--- a/t/t4035-diff-quiet.sh
+++ b/t/t4035-diff-quiet.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Return value of diffs'
 
 . ./test-lib.sh
diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh
index 2d9731b52d..48163e8736 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/t/t4041-diff-submodule-option.sh
@@ -4,6 +4,7 @@
 # Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests)
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Support for verbose submodule differences in git diff
 
 This test tries to verify the sanity of the --submodule option of git diff.
diff --git a/t/t4059-diff-submodule-not-initialized.sh b/t/t4059-diff-submodule-not-initialized.sh
index cd70fd5192..42d846a40f 100755
--- a/t/t4059-diff-submodule-not-initialized.sh
+++ b/t/t4059-diff-submodule-not-initialized.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2016 Jacob Keller, based on t4041 by Jens Lehmann
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test for submodule diff on non-checked out submodule
 
 This test tries to verify that add_submodule_odb works when the submodule was
diff --git a/t/t4060-diff-submodule-option-diff-format.sh b/t/t4060-diff-submodule-option-diff-format.sh
index 7e23b55ea4..dd3a932816 100755
--- a/t/t4060-diff-submodule-option-diff-format.sh
+++ b/t/t4060-diff-submodule-option-diff-format.sh
@@ -5,6 +5,7 @@
 # Copyright (c) 2016 Jacob Keller (copy + convert to --submodule=diff)
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Support for diff format verbose submodule difference in git diff
 
 This test tries to verify the sanity of --submodule=diff option of git diff.
diff --git a/t/t4137-apply-submodule.sh b/t/t4137-apply-submodule.sh
index a9bd40a6d0..f9943ff9a9 100755
--- a/t/t4137-apply-submodule.sh
+++ b/t/t4137-apply-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git apply handling submodules'
 
 . ./test-lib.sh
diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh
index 0dd8b65d7c..7a7ee7127c 100755
--- a/t/t4203-mailmap.sh
+++ b/t/t4203-mailmap.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='.mailmap configurations'
 
 . ./test-lib.sh
diff --git a/t/t4207-log-decoration-colors.sh b/t/t4207-log-decoration-colors.sh
index b972296f06..fb504b2c72 100755
--- a/t/t4207-log-decoration-colors.sh
+++ b/t/t4207-log-decoration-colors.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Nazri Ramliy
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test for "git log --decorate" colors'
 
 . ./test-lib.sh
diff --git a/t/t4255-am-submodule.sh b/t/t4255-am-submodule.sh
index 0ba8194403..da8c9a7ae5 100755
--- a/t/t4255-am-submodule.sh
+++ b/t/t4255-am-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git am handling submodules'
 
 . ./test-lib.sh
diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh
index 886b6953e4..abe58c54f8 100755
--- a/t/t5000-tar-tree.sh
+++ b/t/t5000-tar-tree.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2005 Rene Scharfe
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive and git get-tar-commit-id test
 
 This test covers the topics of file contents, commit date handling and
diff --git a/t/t5001-archive-attr.sh b/t/t5001-archive-attr.sh
index b04d955bfa..ba7de4e9b0 100755
--- a/t/t5001-archive-attr.sh
+++ b/t/t5001-archive-attr.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive attribute tests'
 
 . ./test-lib.sh
diff --git a/t/t5002-archive-attr-pattern.sh b/t/t5002-archive-attr-pattern.sh
index 6667d159ab..acf6937e0f 100755
--- a/t/t5002-archive-attr-pattern.sh
+++ b/t/t5002-archive-attr-pattern.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive attribute pattern tests'
 
 . ./test-lib.sh
diff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh
index 55c7870997..19d58df57e 100755
--- a/t/t5003-archive-zip.sh
+++ b/t/t5003-archive-zip.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git archive --format=zip test'
 
 . ./test-lib.sh
diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh
index 82c33b88e7..581c65dc95 100755
--- a/t/t5150-request-pull.sh
+++ b/t/t5150-request-pull.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test workflows involving pull request.'
 
 . ./test-lib.sh
diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 43a672c345..9e473489b7 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git pack-object
 
 '
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index 133b5842b1..5b5242977b 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Johannes E. Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='prune'
 . ./test-lib.sh
 
diff --git a/t/t5305-include-tag.sh b/t/t5305-include-tag.sh
index a5eca210b8..d4ada345ee 100755
--- a/t/t5305-include-tag.sh
+++ b/t/t5305-include-tag.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git pack-object --include-tag'
 . ./test-lib.sh
 
diff --git a/t/t5306-pack-nobase.sh b/t/t5306-pack-nobase.sh
index f4931c0c2a..6fcb7ab75d 100755
--- a/t/t5306-pack-nobase.sh
+++ b/t/t5306-pack-nobase.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Google Inc.
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-pack-object with missing base
 
 '
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
index 424bec7d77..dca58299e1 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/t/t5310-pack-bitmaps.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='exercise basic bitmap functionality'
 . ./test-lib.sh
 
diff --git a/t/t5311-pack-bitmaps-shallow.sh b/t/t5311-pack-bitmaps-shallow.sh
index 872a95df33..33d724fd52 100755
--- a/t/t5311-pack-bitmaps-shallow.sh
+++ b/t/t5311-pack-bitmaps-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='check bitmap operation with shallow repositories'
 . ./test-lib.sh
 
diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh
index 3331e0f534..12cb482300 100755
--- a/t/t5400-send-pack.sh
+++ b/t/t5400-send-pack.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='See why rewinding head breaks send-pack
 
 '
diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh
index 7f278d8ce9..eba223cbfe 100755
--- a/t/t5401-update-hooks.sh
+++ b/t/t5401-update-hooks.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Shawn O. Pearce
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the update hook infrastructure.'
 . ./test-lib.sh
 
diff --git a/t/t5402-post-merge-hook.sh b/t/t5402-post-merge-hook.sh
index 6eb2ffd6ec..993db78d1f 100755
--- a/t/t5402-post-merge-hook.sh
+++ b/t/t5402-post-merge-hook.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Josh England
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the post-merge hook.'
 . ./test-lib.sh
 
diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index fc898c9eac..e925973651 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Josh England
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the post-checkout hook.'
 . ./test-lib.sh
 
diff --git a/t/t5404-tracking-branches.sh b/t/t5404-tracking-branches.sh
index 2b8c0bac7d..4174d6d5a3 100755
--- a/t/t5404-tracking-branches.sh
+++ b/t/t5404-tracking-branches.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tracking branch update checks for git push'
 
 . ./test-lib.sh
diff --git a/t/t5406-remote-rejects.sh b/t/t5406-remote-rejects.sh
index 59e80a5ea2..1ac17e8dad 100755
--- a/t/t5406-remote-rejects.sh
+++ b/t/t5406-remote-rejects.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='remote push rejects are reported by client'
 
 . ./test-lib.sh
diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh
index 7a48236e87..9458295279 100755
--- a/t/t5407-post-rewrite-hook.sh
+++ b/t/t5407-post-rewrite-hook.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Thomas Rast
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test the post-rewrite hook.'
 . ./test-lib.sh
 
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index b5865b385d..29233cae2a 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2005 Johannes Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Testing multi_ack pack fetching'
 
 . ./test-lib.sh
diff --git a/t/t5501-fetch-push-alternates.sh b/t/t5501-fetch-push-alternates.sh
index 1bc57ac03f..01d121b8d7 100755
--- a/t/t5501-fetch-push-alternates.sh
+++ b/t/t5501-fetch-push-alternates.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/push involving alternates'
 . ./test-lib.sh
 
diff --git a/t/t5502-quickfetch.sh b/t/t5502-quickfetch.sh
index 7a46cbdbe6..44ec47cc4a 100755
--- a/t/t5502-quickfetch.sh
+++ b/t/t5502-quickfetch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test quickfetch from local'
 
 . ./test-lib.sh
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index a6c0178f3a..3019f37519 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git remote porcelain-ish'
 
 . ./test-lib.sh
diff --git a/t/t5509-fetch-push-namespaces.sh b/t/t5509-fetch-push-namespaces.sh
index 75c570adca..556d3f3dc9 100755
--- a/t/t5509-fetch-push-namespaces.sh
+++ b/t/t5509-fetch-push-namespaces.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/push involving ref namespaces'
 . ./test-lib.sh
 
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 668c54be41..c0d632361e 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2006, Junio C Hamano.
 
+test_fails_on_unusual_directory_names=1
 test_description='Per branch config variables affects "git fetch".
 
 '
diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh
index 94fc9be9ce..b69c0314c5 100755
--- a/t/t5512-ls-remote.sh
+++ b/t/t5512-ls-remote.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git ls-remote'
 
 . ./test-lib.sh
diff --git a/t/t5514-fetch-multiple.sh b/t/t5514-fetch-multiple.sh
index 4b4b6673b8..6e14245225 100755
--- a/t/t5514-fetch-multiple.sh
+++ b/t/t5514-fetch-multiple.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch --all works correctly'
 
 . ./test-lib.sh
diff --git a/t/t5515-fetch-merge-logic.sh b/t/t5515-fetch-merge-logic.sh
index 36b0dbc01c..c388a08312 100755
--- a/t/t5515-fetch-merge-logic.sh
+++ b/t/t5515-fetch-merge-logic.sh
@@ -4,6 +4,7 @@
 #
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Merge logic in fetch'
 
 . ./test-lib.sh
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 177897ea0b..0c251b8f86 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Basic fetch/push functionality.
 
 This test checks the following functionality:
diff --git a/t/t5519-push-alternates.sh b/t/t5519-push-alternates.sh
index 11fcd37700..6ff22e245b 100755
--- a/t/t5519-push-alternates.sh
+++ b/t/t5519-push-alternates.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='push to a repository that borrows from elsewhere'
 
 . ./test-lib.sh
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
index 17f4d0fe4e..04b7c5281d 100755
--- a/t/t5520-pull.sh
+++ b/t/t5520-pull.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pulling into void'
 
 . ./test-lib.sh
diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh
index ded8f98dbe..dd6b7675b8 100755
--- a/t/t5521-pull-options.sh
+++ b/t/t5521-pull-options.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pull options'
 
 . ./test-lib.sh
diff --git a/t/t5522-pull-symlink.sh b/t/t5522-pull-symlink.sh
index bcff460d0a..d84115b081 100755
--- a/t/t5522-pull-symlink.sh
+++ b/t/t5522-pull-symlink.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pulling from symlinked subdir'
 
 . ./test-lib.sh
diff --git a/t/t5524-pull-msg.sh b/t/t5524-pull-msg.sh
index c278adaa5a..b86b431205 100755
--- a/t/t5524-pull-msg.sh
+++ b/t/t5524-pull-msg.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git pull message generation'
 
 . ./test-lib.sh
diff --git a/t/t5525-fetch-tagopt.sh b/t/t5525-fetch-tagopt.sh
index 45815f7378..85d387a9e5 100755
--- a/t/t5525-fetch-tagopt.sh
+++ b/t/t5525-fetch-tagopt.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tagopt variable affects "git fetch" and is overridden by commandline.'
 
 . ./test-lib.sh
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index f3b0a8d30a..fe48eee142 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2010, Jens Lehmann
 
+test_fails_on_unusual_directory_names=1
 test_description='Recursive "git fetch" for submodules'
 
 . ./test-lib.sh
diff --git a/t/t5527-fetch-odd-refs.sh b/t/t5527-fetch-odd-refs.sh
index 207899a99f..cc61c6e66a 100755
--- a/t/t5527-fetch-odd-refs.sh
+++ b/t/t5527-fetch-odd-refs.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test fetching of oddly-named refs'
 . ./test-lib.sh
 
diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh
index f55137f76f..8a9f17ce6f 100755
--- a/t/t5531-deep-submodule-push.sh
+++ b/t/t5531-deep-submodule-push.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='unpack-objects'
 
 . ./test-lib.sh
diff --git a/t/t5533-push-cas.sh b/t/t5533-push-cas.sh
index a2c9e7439f..9490b77c7d 100755
--- a/t/t5533-push-cas.sh
+++ b/t/t5533-push-cas.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='compare & swap push force/delete safety'
 
 . ./test-lib.sh
diff --git a/t/t5535-fetch-push-symref.sh b/t/t5535-fetch-push-symref.sh
index 8ed58d27f2..2542b20cfd 100755
--- a/t/t5535-fetch-push-symref.sh
+++ b/t/t5535-fetch-push-symref.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='avoiding conflicting update thru symref aliasing'
 
 . ./test-lib.sh
diff --git a/t/t5536-fetch-conflicts.sh b/t/t5536-fetch-conflicts.sh
index 2e42cf3316..806dce27a0 100755
--- a/t/t5536-fetch-conflicts.sh
+++ b/t/t5536-fetch-conflicts.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch handles conflicting refspecs correctly'
 
 . ./test-lib.sh
diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh
index df8d2f095a..d7c7110dab 100755
--- a/t/t5537-fetch-shallow.sh
+++ b/t/t5537-fetch-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/clone from a shallow clone'
 
 . ./test-lib.sh
diff --git a/t/t5538-push-shallow.sh b/t/t5538-push-shallow.sh
index ecbf84d21c..452be015b6 100755
--- a/t/t5538-push-shallow.sh
+++ b/t/t5538-push-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='push from/to a shallow clone'
 
 . ./test-lib.sh
diff --git a/t/t5539-fetch-http-shallow.sh b/t/t5539-fetch-http-shallow.sh
index 5fbf67c446..5d325c1cd9 100755
--- a/t/t5539-fetch-http-shallow.sh
+++ b/t/t5539-fetch-http-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='fetch/clone from a shallow clone over http'
 
 . ./test-lib.sh
diff --git a/t/t5540-http-push-webdav.sh b/t/t5540-http-push-webdav.sh
index 88ff5a49e4..3815ce69d6 100755
--- a/t/t5540-http-push-webdav.sh
+++ b/t/t5540-http-push-webdav.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test WebDAV http-push
 
 This test runs various sanity checks on http-push.'
diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh
index d38bf32470..6420c7aacb 100755
--- a/t/t5541-http-push-smart.sh
+++ b/t/t5541-http-push-smart.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test smart pushing over http via http-backend'
 . ./test-lib.sh
 
diff --git a/t/t5542-push-http-shallow.sh b/t/t5542-push-http-shallow.sh
index 5165833157..9aa0935f2b 100755
--- a/t/t5542-push-http-shallow.sh
+++ b/t/t5542-push-http-shallow.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='push from/to a shallow clone over http'
 
 . ./test-lib.sh
diff --git a/t/t5544-pack-objects-hook.sh b/t/t5544-pack-objects-hook.sh
index 4357af1525..f18b35a15d 100755
--- a/t/t5544-pack-objects-hook.sh
+++ b/t/t5544-pack-objects-hook.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test custom script in place of pack-objects'
 . ./test-lib.sh
 
diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh
index 97065e62b8..cd6786b6a8 100755
--- a/t/t5545-push-options.sh
+++ b/t/t5545-push-options.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pushing to a repository using push options'
 
 . ./test-lib.sh
diff --git a/t/t5547-push-quarantine.sh b/t/t5547-push-quarantine.sh
index af9fcd833a..6acbcac2dc 100755
--- a/t/t5547-push-quarantine.sh
+++ b/t/t5547-push-quarantine.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='check quarantine of objects during push'
 . ./test-lib.sh
 
diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
index 87308cdced..94e7ca60bc 100755
--- a/t/t5550-http-fetch-dumb.sh
+++ b/t/t5550-http-fetch-dumb.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test dumb fetching over http via static file'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
index a51b7e20d3..205aa47852 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/t/t5551-http-fetch-smart.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test smart fetching over http via http-backend'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
diff --git a/t/t5560-http-backend-noserver.sh b/t/t5560-http-backend-noserver.sh
index 9fafcf1945..8b7f814aa9 100755
--- a/t/t5560-http-backend-noserver.sh
+++ b/t/t5560-http-backend-noserver.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git-http-backend-noserver'
 . ./test-lib.sh
 
diff --git a/t/t5561-http-backend.sh b/t/t5561-http-backend.sh
index 90e0d6f0fe..756ccd604b 100755
--- a/t/t5561-http-backend.sh
+++ b/t/t5561-http-backend.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test git-http-backend'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh
index 225a022e8a..1827225e93 100755
--- a/t/t5570-git-daemon.sh
+++ b/t/t5570-git-daemon.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test fetching over git protocol'
 . ./test-lib.sh
 
diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh
index accfa5cc0c..c7fdce9666 100755
--- a/t/t5572-pull-submodule.sh
+++ b/t/t5572-pull-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='pull can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t5600-clone-fail-cleanup.sh b/t/t5600-clone-fail-cleanup.sh
index 4435693bb2..e280c1e6bf 100755
--- a/t/t5600-clone-fail-cleanup.sh
+++ b/t/t5600-clone-fail-cleanup.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2006 Carl D. Worth <cworth@cworth.org>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test git clone to cleanup after failure
 
 This test covers the fact that if git clone fails, it should remove
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index b52b8acf98..964cb16a5a 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description=clone
 
 . ./test-lib.sh
diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh
index 4320082b1b..46703dea21 100755
--- a/t/t5604-clone-reference.sh
+++ b/t/t5604-clone-reference.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test clone --reference'
 . ./test-lib.sh
 
diff --git a/t/t5605-clone-local.sh b/t/t5605-clone-local.sh
index 3c087e907c..be9a3e7116 100755
--- a/t/t5605-clone-local.sh
+++ b/t/t5605-clone-local.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test local clone'
 . ./test-lib.sh
 
diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh
index 9e24ec88e6..f282998797 100755
--- a/t/t5606-clone-options.sh
+++ b/t/t5606-clone-options.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic clone options'
 . ./test-lib.sh
 
diff --git a/t/t5609-clone-branch.sh b/t/t5609-clone-branch.sh
index 6e7a7be052..34401ad97e 100755
--- a/t/t5609-clone-branch.sh
+++ b/t/t5609-clone-branch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='clone --branch option'
 . ./test-lib.sh
 
diff --git a/t/t5610-clone-detached.sh b/t/t5610-clone-detached.sh
index 8b0d607df1..b5a5013375 100755
--- a/t/t5610-clone-detached.sh
+++ b/t/t5610-clone-detached.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test cloning a repository with detached HEAD'
 . ./test-lib.sh
 
diff --git a/t/t5611-clone-config.sh b/t/t5611-clone-config.sh
index e4850b778c..d6a1e34a9a 100755
--- a/t/t5611-clone-config.sh
+++ b/t/t5611-clone-config.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tests for git clone -c key=value'
 . ./test-lib.sh
 
diff --git a/t/t5612-clone-refspec.sh b/t/t5612-clone-refspec.sh
index 7ace2535c8..ab65f48f72 100755
--- a/t/t5612-clone-refspec.sh
+++ b/t/t5612-clone-refspec.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test refspec written by clone-command'
 . ./test-lib.sh
 
diff --git a/t/t5613-info-alternate.sh b/t/t5613-info-alternate.sh
index 895f46bb91..a2beae244c 100755
--- a/t/t5613-info-alternate.sh
+++ b/t/t5613-info-alternate.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test transitive info/alternate entries'
 . ./test-lib.sh
 
diff --git a/t/t5614-clone-submodules.sh b/t/t5614-clone-submodules.sh
index a87d329656..2255124518 100755
--- a/t/t5614-clone-submodules.sh
+++ b/t/t5614-clone-submodules.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test shallow cloning of repos with submodules'
 
 . ./test-lib.sh
diff --git a/t/t5615-alternate-env.sh b/t/t5615-alternate-env.sh
index d2d883f3a1..16d5ae8058 100755
--- a/t/t5615-alternate-env.sh
+++ b/t/t5615-alternate-env.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='handling of alternates in environment variables'
 . ./test-lib.sh
 
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index 362b1581e0..a13e116325 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Sverre Rabbelier
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test remote-helper import and export commands'
 
 . ./test-lib.sh
diff --git a/t/t5802-connect-helper.sh b/t/t5802-connect-helper.sh
index c6c2661878..9987253240 100755
--- a/t/t5802-connect-helper.sh
+++ b/t/t5802-connect-helper.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='ext::cmd remote "connect" helper'
 . ./test-lib.sh
 
diff --git a/t/t5810-proto-disable-local.sh b/t/t5810-proto-disable-local.sh
index 563592d8a8..7bd038bf1e 100755
--- a/t/t5810-proto-disable-local.sh
+++ b/t/t5810-proto-disable-local.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of local paths in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5812-proto-disable-http.sh b/t/t5812-proto-disable-http.sh
index d911afd24c..83e854627c 100755
--- a/t/t5812-proto-disable-http.sh
+++ b/t/t5812-proto-disable-http.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of git-over-http in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5813-proto-disable-ssh.sh b/t/t5813-proto-disable-ssh.sh
index a954ead8af..f54d817a64 100755
--- a/t/t5813-proto-disable-ssh.sh
+++ b/t/t5813-proto-disable-ssh.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of git-over-ssh in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5814-proto-disable-ext.sh b/t/t5814-proto-disable-ext.sh
index 9d6f7dfa2c..bf3c61a9b4 100755
--- a/t/t5814-proto-disable-ext.sh
+++ b/t/t5814-proto-disable-ext.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test disabling of remote-helper paths in clone/fetch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-proto-disable.sh"
diff --git a/t/t5815-submodule-protos.sh b/t/t5815-submodule-protos.sh
index 06f55a1b8a..b0429d0141 100755
--- a/t/t5815-submodule-protos.sh
+++ b/t/t5815-submodule-protos.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test protocol whitelisting with submodules'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-proto-disable.sh
diff --git a/t/t5900-repo-selection.sh b/t/t5900-repo-selection.sh
index 14e59c5b3e..84bdbdf469 100755
--- a/t/t5900-repo-selection.sh
+++ b/t/t5900-repo-selection.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='selecting remote repo in ambiguous cases'
 . ./test-lib.sh
 
diff --git a/t/t6008-rev-list-submodule.sh b/t/t6008-rev-list-submodule.sh
index c4af9ca0a7..ebf5c70f14 100755
--- a/t/t6008-rev-list-submodule.sh
+++ b/t/t6008-rev-list-submodule.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Johannes E. Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git rev-list involving submodules that this repo has'
 
 . ./test-lib.sh
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 8c2c6eaef8..8d43131265 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2007 Christian Couder
 #
+test_fails_on_unusual_directory_names=1
 test_description='Tests git bisect functionality'
 
 exec </dev/null
diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh
index 97a07655a0..54919d1920 100755
--- a/t/t6040-tracking-info.sh
+++ b/t/t6040-tracking-info.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='remote tracking stats'
 
 . ./test-lib.sh
diff --git a/t/t6041-bisect-submodule.sh b/t/t6041-bisect-submodule.sh
index 62b8a2e7bb..bb3c04bd25 100755
--- a/t/t6041-bisect-submodule.sh
+++ b/t/t6041-bisect-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='bisect can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh
index c630aba657..561d021080 100755
--- a/t/t6050-replace.sh
+++ b/t/t6050-replace.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2008 Christian Couder
 #
+test_fails_on_unusual_directory_names=1
 test_description='Tests replace refs functionality'
 
 exec </dev/null
diff --git a/t/t6060-merge-index.sh b/t/t6060-merge-index.sh
index debadbd299..12a646e848 100755
--- a/t/t6060-merge-index.sh
+++ b/t/t6060-merge-index.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic git merge-index / git-merge-one-file tests'
 . ./test-lib.sh
 
diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh
index fd401ca605..4ee5520a31 100755
--- a/t/t6134-pathspec-in-submodule.sh
+++ b/t/t6134-pathspec-in-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test case exclude pathspec'
 
 . ./test-lib.sh
diff --git a/t/t6200-fmt-merge-msg.sh b/t/t6200-fmt-merge-msg.sh
index 2e2fb0e957..5735cdbf3d 100755
--- a/t/t6200-fmt-merge-msg.sh
+++ b/t/t6200-fmt-merge-msg.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006, Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='fmt-merge-msg test'
 
 . ./test-lib.sh
diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh
index 08de2e8ab0..56d3c42bac 100755
--- a/t/t6500-gc.sh
+++ b/t/t6500-gc.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='basic git gc tests
 '
 
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e365d1ff77..64a08d9966 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git mv in subdirs'
 . ./test-lib.sh
 
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 7cb60799be..a1722c3239 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git filter-branch'
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-gpg.sh"
diff --git a/t/t7005-editor.sh b/t/t7005-editor.sh
index 1b530b5022..75e2f4d0ce 100755
--- a/t/t7005-editor.sh
+++ b/t/t7005-editor.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='GIT_EDITOR, core.editor, and stuff'
 
 . ./test-lib.sh
diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh
index 4f3794d415..69ff4884ef 100755
--- a/t/t7006-pager.sh
+++ b/t/t7006-pager.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test automatic use of a pager.'
 
 . ./test-lib.sh
diff --git a/t/t7008-grep-binary.sh b/t/t7008-grep-binary.sh
index 9c9c378119..c49966f1f1 100755
--- a/t/t7008-grep-binary.sh
+++ b/t/t7008-grep-binary.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git grep in binary files'
 
 . ./test-lib.sh
diff --git a/t/t7010-setup.sh b/t/t7010-setup.sh
index 0335a9a158..2e7bae4667 100755
--- a/t/t7010-setup.sh
+++ b/t/t7010-setup.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='setup taking and sanitizing funny paths'
 
 . ./test-lib.sh
diff --git a/t/t7064-wtstatus-pv2.sh b/t/t7064-wtstatus-pv2.sh
index e319fa2e84..195bfbb519 100755
--- a/t/t7064-wtstatus-pv2.sh
+++ b/t/t7064-wtstatus-pv2.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git status --porcelain=v2
 
 This test exercises porcelain V2 output for git status.'
diff --git a/t/t7103-reset-bare.sh b/t/t7103-reset-bare.sh
index afe36a533c..091c88a572 100755
--- a/t/t7103-reset-bare.sh
+++ b/t/t7103-reset-bare.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git reset in a bare repository'
 . ./test-lib.sh
 
diff --git a/t/t7112-reset-submodule.sh b/t/t7112-reset-submodule.sh
index 2eda6adeb1..478ff8550b 100755
--- a/t/t7112-reset-submodule.sh
+++ b/t/t7112-reset-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='reset can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index b89fd2a6ad..9d662c857d 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Michael Spang
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git clean basic tests'
 
 . ./test-lib.sh
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index cf77a3a357..1164142b11 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Lars Hjemli
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Basic porcelain support for submodules
 
 This test tries to verify basic sanity of the init, update and status
diff --git a/t/t7402-submodule-rebase.sh b/t/t7402-submodule-rebase.sh
index 8e32f19007..ca289daf05 100755
--- a/t/t7402-submodule-rebase.sh
+++ b/t/t7402-submodule-rebase.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Johannes Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test rebasing, stashing, etc. with submodules'
 
 . ./test-lib.sh
diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh
index 0726799e74..be64ff14c3 100755
--- a/t/t7403-submodule-sync.sh
+++ b/t/t7403-submodule-sync.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 David Aguilar
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git submodule sync
 
 These tests exercise the "git submodule sync" subcommand.
diff --git a/t/t7405-submodule-merge.sh b/t/t7405-submodule-merge.sh
index 0d5b42a25b..4b136950f4 100755
--- a/t/t7405-submodule-merge.sh
+++ b/t/t7405-submodule-merge.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='merging with submodules'
 
 . ./test-lib.sh
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index 4ac386d98b..511d2d9c8b 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Red Hat, Inc.
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test updating submodules
 
 This test verifies that "git submodule update" detaches the HEAD of the
diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh
index 6ba5daf42e..d60f4d6078 100755
--- a/t/t7407-submodule-foreach.sh
+++ b/t/t7407-submodule-foreach.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Johan Herland
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test "git submodule foreach"
 
 This test verifies that "git submodule foreach" correctly visits all submodules
diff --git a/t/t7408-submodule-reference.sh b/t/t7408-submodule-reference.sh
index e159fc5035..f8105ebda1 100755
--- a/t/t7408-submodule-reference.sh
+++ b/t/t7408-submodule-reference.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009, Red Hat Inc, Author: Michael S. Tsirkin (mst@redhat.com)
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test clone --reference'
 . ./test-lib.sh
 
diff --git a/t/t7409-submodule-detached-work-tree.sh b/t/t7409-submodule-detached-work-tree.sh
index c20717181e..df6fc441ce 100755
--- a/t/t7409-submodule-detached-work-tree.sh
+++ b/t/t7409-submodule-detached-work-tree.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Daniel Graña
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test submodules on detached working tree
 
 This test verifies that "git submodule" initialization, update and addition works
diff --git a/t/t7410-submodule-checkout-to.sh b/t/t7410-submodule-checkout-to.sh
index 1acef32647..d0f8362477 100755
--- a/t/t7410-submodule-checkout-to.sh
+++ b/t/t7410-submodule-checkout-to.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Combination of submodules and multiple workdirs'
 
 . ./test-lib.sh
diff --git a/t/t7411-submodule-config.sh b/t/t7411-submodule-config.sh
index eea36f1dbe..7befe7748b 100755
--- a/t/t7411-submodule-config.sh
+++ b/t/t7411-submodule-config.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2014 Heiko Voigt
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='Test submodules config cache infrastructure
 
 This test verifies that parsing .gitmodules configurations directly
diff --git a/t/t7413-submodule-is-active.sh b/t/t7413-submodule-is-active.sh
index 9c785b07ec..e441f5de3c 100755
--- a/t/t7413-submodule-is-active.sh
+++ b/t/t7413-submodule-is-active.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test submodule--helper is-active
 
 This test verifies that `git submodue--helper is-active` correclty identifies
diff --git a/t/t7504-commit-msg-hook.sh b/t/t7504-commit-msg-hook.sh
index 88d4cda299..2f820804e1 100755
--- a/t/t7504-commit-msg-hook.sh
+++ b/t/t7504-commit-msg-hook.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='commit-msg hook'
 
 . ./test-lib.sh
diff --git a/t/t7506-status-submodule.sh b/t/t7506-status-submodule.sh
index d31b34da83..e8ef49f1ec 100755
--- a/t/t7506-status-submodule.sh
+++ b/t/t7506-status-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git status for submodule'
 
 . ./test-lib.sh
diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh
index ed2653d46f..35a31a71fe 100755
--- a/t/t7507-commit-verbose.sh
+++ b/t/t7507-commit-verbose.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='verbose commit template'
 . ./test-lib.sh
 
diff --git a/t/t7517-per-repo-email.sh b/t/t7517-per-repo-email.sh
index 2a22fa7588..5306df95d6 100755
--- a/t/t7517-per-repo-email.sh
+++ b/t/t7517-per-repo-email.sh
@@ -4,6 +4,7 @@
 # Copyright (c) 2016 Jeff King
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='per-repo forced setting of email address'
 
 . ./test-lib.sh
diff --git a/t/t7613-merge-submodule.sh b/t/t7613-merge-submodule.sh
index d1e9fcc781..35ca51108c 100755
--- a/t/t7613-merge-submodule.sh
+++ b/t/t7613-merge-submodule.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='merge can handle submodules'
 
 . ./test-lib.sh
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 6061a04147..b4b55d9f3b 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git repack works correctly'
 
 . ./test-lib.sh
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 0e7f30db2d..4c07fb8692 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009, 2010, 2012, 2013 David Aguilar
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-difftool
 
 Testing basic diff tool invocation
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index cee42097b0..7e6c16ea8c 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Junio C Hamano
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git grep various.
 '
 
diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh
index 5b6eb3a65e..af092b345e 100755
--- a/t/t7814-grep-recurse-submodules.sh
+++ b/t/t7814-grep-recurse-submodules.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='Test grep recurse-submodules feature
 
 This test verifies the recurse-submodules feature correctly greps across
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 60a80f60b2..c1d262bd2f 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git send-email'
 . ./test-lib.sh
 
diff --git a/t/t9020-remote-svn.sh b/t/t9020-remote-svn.sh
index 4d81ba1c2c..b853b99ff5 100755
--- a/t/t9020-remote-svn.sh
+++ b/t/t9020-remote-svn.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='tests remote-svn'
 
 . ./test-lib.sh
diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh
index 8a8ba65a2a..7682c0dc65 100755
--- a/t/t9100-git-svn-basic.sh
+++ b/t/t9100-git-svn-basic.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn basic tests'
 GIT_SVN_LC_ALL=${LC_ALL:-$LANG}
 
diff --git a/t/t9101-git-svn-props.sh b/t/t9101-git-svn-props.sh
index 07bfb63777..9f469b67fd 100755
--- a/t/t9101-git-svn-props.sh
+++ b/t/t9101-git-svn-props.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9102-git-svn-deep-rmdir.sh b/t/t9102-git-svn-deep-rmdir.sh
index 66cd51102c..c665b32005 100755
--- a/t/t9102-git-svn-deep-rmdir.sh
+++ b/t/t9102-git-svn-deep-rmdir.sh
@@ -1,4 +1,5 @@
 #!/bin/sh
+test_fails_on_unusual_directory_names=1
 test_description='git svn rmdir'
 . ./lib-git-svn.sh
 
diff --git a/t/t9103-git-svn-tracked-directory-removed.sh b/t/t9103-git-svn-tracked-directory-removed.sh
index b28271345c..15d7174226 100755
--- a/t/t9103-git-svn-tracked-directory-removed.sh
+++ b/t/t9103-git-svn-tracked-directory-removed.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn tracking removed top-level path'
 . ./lib-git-svn.sh
 
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index cd480edf16..d7eb9c4c5c 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2006 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fetching'
 . ./lib-git-svn.sh
 
diff --git a/t/t9105-git-svn-commit-diff.sh b/t/t9105-git-svn-commit-diff.sh
index 6ed5f74e25..6e1e4e463c 100755
--- a/t/t9105-git-svn-commit-diff.sh
+++ b/t/t9105-git-svn-commit-diff.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # Copyright (c) 2006 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn commit-diff'
 . ./lib-git-svn.sh
 
diff --git a/t/t9106-git-svn-commit-diff-clobber.sh b/t/t9106-git-svn-commit-diff-clobber.sh
index dbe8deac0d..c72f70119f 100755
--- a/t/t9106-git-svn-commit-diff-clobber.sh
+++ b/t/t9106-git-svn-commit-diff-clobber.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # Copyright (c) 2006 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn commit-diff clobber'
 . ./lib-git-svn.sh
 
diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh
index 9f3ef8f2ef..c911dea1a7 100755
--- a/t/t9107-git-svn-migrate.sh
+++ b/t/t9107-git-svn-migrate.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 # Copyright (c) 2006 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn metadata migrations from previous versions'
 . ./lib-git-svn.sh
 
diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh
index a94286c8ec..190f5c4767 100755
--- a/t/t9108-git-svn-glob.sh
+++ b/t/t9108-git-svn-glob.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 # Copyright (c) 2007 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn globbing refspecs'
 . ./lib-git-svn.sh
 
diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh
index 8d99e848d4..2a3106739b 100755
--- a/t/t9109-git-svn-multi-glob.sh
+++ b/t/t9109-git-svn-multi-glob.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 # Copyright (c) 2007 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn globbing refspecs'
 . ./lib-git-svn.sh
 
diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh
index dde0a3c222..86e570289f 100755
--- a/t/t9110-git-svn-use-svm-props.sh
+++ b/t/t9110-git-svn-use-svm-props.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn useSvmProps test'
 
 . ./lib-git-svn.sh
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index a3d388228a..68f70b70f3 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 # Based on a script by Joakim Tjernlund <joakim.tjernlund@transmode.se>
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit handles merges'
 
 . ./lib-git-svn.sh
diff --git a/t/t9115-git-svn-dcommit-funky-renames.sh b/t/t9115-git-svn-dcommit-funky-renames.sh
index 64bb495834..bd6c519e3e 100755
--- a/t/t9115-git-svn-dcommit-funky-renames.sh
+++ b/t/t9115-git-svn-dcommit-funky-renames.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit can commit renames of files with ugly names'
 
 . ./lib-git-svn.sh
diff --git a/t/t9116-git-svn-log.sh b/t/t9116-git-svn-log.sh
index 45773ee560..d04c9b05d0 100755
--- a/t/t9116-git-svn-log.sh
+++ b/t/t9116-git-svn-log.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn log tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9117-git-svn-init-clone.sh b/t/t9117-git-svn-init-clone.sh
index 044f65e916..f476f04e0e 100755
--- a/t/t9117-git-svn-init-clone.sh
+++ b/t/t9117-git-svn-init-clone.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn init/clone tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9118-git-svn-funky-branch-names.sh b/t/t9118-git-svn-funky-branch-names.sh
index 41a026637f..1c43a15c67 100755
--- a/t/t9118-git-svn-funky-branch-names.sh
+++ b/t/t9118-git-svn-funky-branch-names.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn funky branch names'
 . ./lib-git-svn.sh
 
diff --git a/t/t9120-git-svn-clone-with-percent-escapes.sh b/t/t9120-git-svn-clone-with-percent-escapes.sh
index b28a1741e3..307c4d8811 100755
--- a/t/t9120-git-svn-clone-with-percent-escapes.sh
+++ b/t/t9120-git-svn-clone-with-percent-escapes.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Kevin Ballard
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn clone with percent escapes'
 . ./lib-git-svn.sh
 
diff --git a/t/t9122-git-svn-author.sh b/t/t9122-git-svn-author.sh
index 30013b7bb9..260b245cc2 100755
--- a/t/t9122-git-svn-author.sh
+++ b/t/t9122-git-svn-author.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn authorship'
 . ./lib-git-svn.sh
 
diff --git a/t/t9123-git-svn-rebuild-with-rewriteroot.sh b/t/t9123-git-svn-rebuild-with-rewriteroot.sh
index ead404589e..d2c21a8d78 100755
--- a/t/t9123-git-svn-rebuild-with-rewriteroot.sh
+++ b/t/t9123-git-svn-rebuild-with-rewriteroot.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Jan Krüger
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn respects rewriteRoot during rebuild'
 
 . ./lib-git-svn.sh
diff --git a/t/t9124-git-svn-dcommit-auto-props.sh b/t/t9124-git-svn-dcommit-auto-props.sh
index 9f7231d5b7..3109c579b7 100755
--- a/t/t9124-git-svn-dcommit-auto-props.sh
+++ b/t/t9124-git-svn-dcommit-auto-props.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2008 Brad King
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit honors auto-props'
 
 . ./lib-git-svn.sh
diff --git a/t/t9125-git-svn-multi-glob-branch-names.sh b/t/t9125-git-svn-multi-glob-branch-names.sh
index 0d53fc9014..51bc8f0e6b 100755
--- a/t/t9125-git-svn-multi-glob-branch-names.sh
+++ b/t/t9125-git-svn-multi-glob-branch-names.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Copyright (c) 2008 Marcus Griep
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn multi-glob branch names'
 . ./lib-git-svn.sh
 
diff --git a/t/t9127-git-svn-partial-rebuild.sh b/t/t9127-git-svn-partial-rebuild.sh
index 2e4789d061..00edd18c06 100755
--- a/t/t9127-git-svn-partial-rebuild.sh
+++ b/t/t9127-git-svn-partial-rebuild.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Deskin Miller
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn partial-rebuild tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9128-git-svn-cmd-branch.sh b/t/t9128-git-svn-cmd-branch.sh
index 4e95f791db..c887dae35d 100755
--- a/t/t9128-git-svn-cmd-branch.sh
+++ b/t/t9128-git-svn-cmd-branch.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Deskin Miller
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn partial-rebuild tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh
index 8dbd6476fa..8a093590cb 100755
--- a/t/t9129-git-svn-i18n-commitencoding.sh
+++ b/t/t9129-git-svn-i18n-commitencoding.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2008 Eric Wong
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn honors i18n.commitEncoding in config'
 
 . ./lib-git-svn.sh
diff --git a/t/t9131-git-svn-empty-symlink.sh b/t/t9131-git-svn-empty-symlink.sh
index f762038f0e..adce5d2adf 100755
--- a/t/t9131-git-svn-empty-symlink.sh
+++ b/t/t9131-git-svn-empty-symlink.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test that git handles an svn repository with empty symlinks'
 
 . ./lib-git-svn.sh
diff --git a/t/t9132-git-svn-broken-symlink.sh b/t/t9132-git-svn-broken-symlink.sh
index aeceffaf7b..9d74572cd3 100755
--- a/t/t9132-git-svn-broken-symlink.sh
+++ b/t/t9132-git-svn-broken-symlink.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='test that git handles an svn repository with empty symlinks'
 
 . ./lib-git-svn.sh
diff --git a/t/t9133-git-svn-nested-git-repo.sh b/t/t9133-git-svn-nested-git-repo.sh
index f3c30e63b7..bbdf011514 100755
--- a/t/t9133-git-svn-nested-git-repo.sh
+++ b/t/t9133-git-svn-nested-git-repo.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9134-git-svn-ignore-paths.sh b/t/t9134-git-svn-ignore-paths.sh
index 09ff10cd9b..cf4240f366 100755
--- a/t/t9134-git-svn-ignore-paths.sh
+++ b/t/t9134-git-svn-ignore-paths.sh
@@ -4,6 +4,7 @@
 # Copyright (c) 2009 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9137-git-svn-dcommit-clobber-series.sh b/t/t9137-git-svn-dcommit-clobber-series.sh
index 5fa07a369f..cc5814b85f 100755
--- a/t/t9137-git-svn-dcommit-clobber-series.sh
+++ b/t/t9137-git-svn-dcommit-clobber-series.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # Copyright (c) 2007 Eric Wong
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit clobber series'
 . ./lib-git-svn.sh
 
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46bc..72377845e2 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Eric Wong, Mark Lodato
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn authors prog tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9140-git-svn-reset.sh b/t/t9140-git-svn-reset.sh
index e855904629..11dad1fa84 100755
--- a/t/t9140-git-svn-reset.sh
+++ b/t/t9140-git-svn-reset.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Ben Jackson
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn reset'
 . ./lib-git-svn.sh
 
diff --git a/t/t9141-git-svn-multiple-branches.sh b/t/t9141-git-svn-multiple-branches.sh
index 8e7f7d68b7..76ed3475aa 100755
--- a/t/t9141-git-svn-multiple-branches.sh
+++ b/t/t9141-git-svn-multiple-branches.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Marc Branchaud
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn multiple branch and tag paths in the svn repo'
 . ./lib-git-svn.sh
 
diff --git a/t/t9142-git-svn-shallow-clone.sh b/t/t9142-git-svn-shallow-clone.sh
index 9ee23be640..d116d0a9e8 100755
--- a/t/t9142-git-svn-shallow-clone.sh
+++ b/t/t9142-git-svn-shallow-clone.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Eric Wong
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn shallow clone'
 . ./lib-git-svn.sh
 
diff --git a/t/t9143-git-svn-gc.sh b/t/t9143-git-svn-gc.sh
index 4594e1ae2f..452c73ba5f 100755
--- a/t/t9143-git-svn-gc.sh
+++ b/t/t9143-git-svn-gc.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Robert Allan Zeh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn gc basic tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9144-git-svn-old-rev_map.sh b/t/t9144-git-svn-old-rev_map.sh
index 7600a35cd4..12351951d6 100755
--- a/t/t9144-git-svn-old-rev_map.sh
+++ b/t/t9144-git-svn-old-rev_map.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Eric Wong
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn old rev_map preservd'
 . ./lib-git-svn.sh
 
diff --git a/t/t9145-git-svn-master-branch.sh b/t/t9145-git-svn-master-branch.sh
index 3bbf341f6a..44f40db9bd 100755
--- a/t/t9145-git-svn-master-branch.sh
+++ b/t/t9145-git-svn-master-branch.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Eric Wong
 #
+test_fails_on_unusual_directory_names=1
 test_description='git svn initial master branch is "trunk" if possible'
 . ./lib-git-svn.sh
 
diff --git a/t/t9146-git-svn-empty-dirs.sh b/t/t9146-git-svn-empty-dirs.sh
index 6d3130e618..25aadc3986 100755
--- a/t/t9146-git-svn-empty-dirs.sh
+++ b/t/t9146-git-svn-empty-dirs.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2009 Eric Wong
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn creates empty directories'
 . ./lib-git-svn.sh
 
diff --git a/t/t9147-git-svn-include-paths.sh b/t/t9147-git-svn-include-paths.sh
index a90ff58629..8233aca9cd 100755
--- a/t/t9147-git-svn-include-paths.sh
+++ b/t/t9147-git-svn-include-paths.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2013 Paul Walmsley - based on t9134 by Vitaly Shukela
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn property tests'
 . ./lib-git-svn.sh
 
diff --git a/t/t9148-git-svn-propset.sh b/t/t9148-git-svn-propset.sh
index 102639090c..92aa6e2427 100755
--- a/t/t9148-git-svn-propset.sh
+++ b/t/t9148-git-svn-propset.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2014 Alfred Perlstein
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn propset tests'
 
 . ./lib-git-svn.sh
diff --git a/t/t9150-svk-mergetickets.sh b/t/t9150-svk-mergetickets.sh
index 1bb676bede..ac6678e92c 100755
--- a/t/t9150-svk-mergetickets.sh
+++ b/t/t9150-svk-mergetickets.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Sam Vilain
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-svn svk merge tickets'
 
 . ./lib-git-svn.sh
diff --git a/t/t9151-svn-mergeinfo.sh b/t/t9151-svn-mergeinfo.sh
index 4f6c06ecb2..4028619246 100755
--- a/t/t9151-svn-mergeinfo.sh
+++ b/t/t9151-svn-mergeinfo.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007, 2009 Sam Vilain
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-svn svn mergeinfo properties'
 
 . ./lib-git-svn.sh
diff --git a/t/t9153-git-svn-rewrite-uuid.sh b/t/t9153-git-svn-rewrite-uuid.sh
index 372ef15685..5895175ce6 100755
--- a/t/t9153-git-svn-rewrite-uuid.sh
+++ b/t/t9153-git-svn-rewrite-uuid.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Jay Soffian
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn --rewrite-uuid test'
 
 . ./lib-git-svn.sh
diff --git a/t/t9154-git-svn-fancy-glob.sh b/t/t9154-git-svn-fancy-glob.sh
index a0150f057d..1318b9a865 100755
--- a/t/t9154-git-svn-fancy-glob.sh
+++ b/t/t9154-git-svn-fancy-glob.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Jay Soffian
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fancy glob test'
 
 . ./lib-git-svn.sh
diff --git a/t/t9155-git-svn-fetch-deleted-tag.sh b/t/t9155-git-svn-fetch-deleted-tag.sh
index 184336f346..b36f10f818 100755
--- a/t/t9155-git-svn-fetch-deleted-tag.sh
+++ b/t/t9155-git-svn-fetch-deleted-tag.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fetch deleted tag'
 
 . ./lib-git-svn.sh
diff --git a/t/t9156-git-svn-fetch-deleted-tag-2.sh b/t/t9156-git-svn-fetch-deleted-tag-2.sh
index 7a6e33ba3c..9a7b721809 100755
--- a/t/t9156-git-svn-fetch-deleted-tag-2.sh
+++ b/t/t9156-git-svn-fetch-deleted-tag-2.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn fetch deleted tag 2'
 
 . ./lib-git-svn.sh
diff --git a/t/t9157-git-svn-fetch-merge.sh b/t/t9157-git-svn-fetch-merge.sh
index 991d2aa1be..cd0d534deb 100755
--- a/t/t9157-git-svn-fetch-merge.sh
+++ b/t/t9157-git-svn-fetch-merge.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn merge detection'
 . ./lib-git-svn.sh
 
diff --git a/t/t9158-git-svn-mergeinfo.sh b/t/t9158-git-svn-mergeinfo.sh
index a875b45102..5feb615447 100755
--- a/t/t9158-git-svn-mergeinfo.sh
+++ b/t/t9158-git-svn-mergeinfo.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2010 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn mergeinfo propagation'
 
 . ./lib-git-svn.sh
diff --git a/t/t9159-git-svn-no-parent-mergeinfo.sh b/t/t9159-git-svn-no-parent-mergeinfo.sh
index 69e4815781..ac8a201ff4 100755
--- a/t/t9159-git-svn-no-parent-mergeinfo.sh
+++ b/t/t9159-git-svn-no-parent-mergeinfo.sh
@@ -1,4 +1,5 @@
 #!/bin/sh
+test_fails_on_unusual_directory_names=1
 test_description='git svn handling of root commits in merge ranges'
 . ./lib-git-svn.sh
 
diff --git a/t/t9160-git-svn-preserve-empty-dirs.sh b/t/t9160-git-svn-preserve-empty-dirs.sh
index 0ede3cfedb..7db7ac485d 100755
--- a/t/t9160-git-svn-preserve-empty-dirs.sh
+++ b/t/t9160-git-svn-preserve-empty-dirs.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2011 Ray Chen
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn test (option --preserve-empty-dirs)
 
 This test uses git to clone a Subversion repository that contains empty
diff --git a/t/t9161-git-svn-mergeinfo-push.sh b/t/t9161-git-svn-mergeinfo-push.sh
index f113acaa6c..c216273eb3 100755
--- a/t/t9161-git-svn-mergeinfo-push.sh
+++ b/t/t9161-git-svn-mergeinfo-push.sh
@@ -4,6 +4,7 @@
 # Portions copyright (c) 2011 Bryan Jacobs
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-svn svn mergeinfo propagation'
 
 . ./lib-git-svn.sh
diff --git a/t/t9162-git-svn-dcommit-interactive.sh b/t/t9162-git-svn-dcommit-interactive.sh
index e38d9fa37b..5ab85c210a 100755
--- a/t/t9162-git-svn-dcommit-interactive.sh
+++ b/t/t9162-git-svn-dcommit-interactive.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2011 Frédéric Heitzmann
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn dcommit --interactive series'
 . ./lib-git-svn.sh
 
diff --git a/t/t9163-git-svn-reset-clears-caches.sh b/t/t9163-git-svn-reset-clears-caches.sh
index d6245cee08..54111aa873 100755
--- a/t/t9163-git-svn-reset-clears-caches.sh
+++ b/t/t9163-git-svn-reset-clears-caches.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Peter Baumann
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn reset clears memoized caches'
 . ./lib-git-svn.sh
 
diff --git a/t/t9164-git-svn-dcommit-concurrent.sh b/t/t9164-git-svn-dcommit-concurrent.sh
index d8464d4218..af33c9ab92 100755
--- a/t/t9164-git-svn-dcommit-concurrent.sh
+++ b/t/t9164-git-svn-dcommit-concurrent.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Robert Luberda
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='concurrent git svn dcommit'
 . ./lib-git-svn.sh
 
diff --git a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
index fa3ef3b1f7..eae3144c37 100755
--- a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
+++ b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn merge detection'
 . ./lib-git-svn.sh
 
diff --git a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
index 52f2e46a5b..a48d18ce94 100755
--- a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
+++ b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Steven Walter
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn merge detection'
 . ./lib-git-svn.sh
 
diff --git a/t/t9167-git-svn-cmd-branch-subproject.sh b/t/t9167-git-svn-cmd-branch-subproject.sh
index ba35fc06fc..112a8bf51f 100755
--- a/t/t9167-git-svn-cmd-branch-subproject.sh
+++ b/t/t9167-git-svn-cmd-branch-subproject.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2013 Tobias Schulte
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git svn branch for subproject clones'
 . ./lib-git-svn.sh
 
diff --git a/t/t9168-git-svn-partially-globbed-names.sh b/t/t9168-git-svn-partially-globbed-names.sh
index 8b22f2272c..7283cb282a 100755
--- a/t/t9168-git-svn-partially-globbed-names.sh
+++ b/t/t9168-git-svn-partially-globbed-names.sh
@@ -1,4 +1,5 @@
 #!/bin/sh
+test_fails_on_unusual_directory_names=1
 test_description='git svn globbing refspecs with prefixed globs'
 . ./lib-git-svn.sh
 
diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 1319415ba8..7efd2c48c9 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -2,6 +2,7 @@
 #
 # Copyright (c) Robin Rosenberg
 #
+test_fails_on_unusual_directory_names=1
 test_description='Test export of commits to CVS'
 
 . ./test-lib.sh
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 2e0ba3ebd8..c596269e0e 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Shawn Pearce
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test git fast-import utility'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index b5149fde6e..805fecf89d 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Johannes E. Schindelin
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git fast-export'
 . ./test-lib.sh
 
diff --git a/t/t9400-git-cvsserver-server.sh b/t/t9400-git-cvsserver-server.sh
index 432c61d246..3a8109d42d 100755
--- a/t/t9400-git-cvsserver-server.sh
+++ b/t/t9400-git-cvsserver-server.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Frank Lichtenheld
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-cvsserver access
 
 tests read access to a git repository with the
diff --git a/t/t9401-git-cvsserver-crlf.sh b/t/t9401-git-cvsserver-crlf.sh
index 84787eee9a..2771407f74 100755
--- a/t/t9401-git-cvsserver-crlf.sh
+++ b/t/t9401-git-cvsserver-crlf.sh
@@ -4,6 +4,7 @@
 # Parts adapted from other tests.
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='git-cvsserver -kb modes
 
 tests -kb mode for binary files when accessing a git
diff --git a/t/t9402-git-cvsserver-refs.sh b/t/t9402-git-cvsserver-refs.sh
index 6d2d3c8739..643fcfbad0 100755
--- a/t/t9402-git-cvsserver-refs.sh
+++ b/t/t9402-git-cvsserver-refs.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git-cvsserver and git refspecs
 
 tests ability for git-cvsserver to switch between and compare
diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh
index 6d06ed96cb..0845149409 100755
--- a/t/t9500-gitweb-standalone-no-errors.sh
+++ b/t/t9500-gitweb-standalone-no-errors.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2007 Jakub Narebski
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='gitweb as standalone script (basic tests).
 
 This test runs gitweb (git web interface) as CGI script from
diff --git a/t/t9502-gitweb-standalone-parse-output.sh b/t/t9502-gitweb-standalone-parse-output.sh
index 0796a438bc..bf6352b084 100755
--- a/t/t9502-gitweb-standalone-parse-output.sh
+++ b/t/t9502-gitweb-standalone-parse-output.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2009 Mark Rada
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='gitweb as standalone script (parsing script output).
 
 This test runs gitweb (git web interface) as a CGI script from the
diff --git a/t/t9600-cvsimport.sh b/t/t9600-cvsimport.sh
index 804ce3850f..678dd8236a 100755
--- a/t/t9600-cvsimport.sh
+++ b/t/t9600-cvsimport.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport basic tests'
 . ./lib-cvs.sh
 
diff --git a/t/t9601-cvsimport-vendor-branch.sh b/t/t9601-cvsimport-vendor-branch.sh
index 827d39f5bf..25f971c7b2 100755
--- a/t/t9601-cvsimport-vendor-branch.sh
+++ b/t/t9601-cvsimport-vendor-branch.sh
@@ -31,6 +31,7 @@
 #       Like imported-twice.txt, but with a vendor branch whose branch
 #       tag has been removed.
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport handling of vendor branches'
 . ./lib-cvs.sh
 
diff --git a/t/t9602-cvsimport-branches-tags.sh b/t/t9602-cvsimport-branches-tags.sh
index e1db323f54..6ffcb139e4 100755
--- a/t/t9602-cvsimport-branches-tags.sh
+++ b/t/t9602-cvsimport-branches-tags.sh
@@ -3,6 +3,7 @@
 # A description of the repository used for this test can be found in
 # t9602/README.
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport handling of branches and tags'
 . ./lib-cvs.sh
 
diff --git a/t/t9604-cvsimport-timestamps.sh b/t/t9604-cvsimport-timestamps.sh
index a4b3db24bd..32119a5294 100755
--- a/t/t9604-cvsimport-timestamps.sh
+++ b/t/t9604-cvsimport-timestamps.sh
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+test_fails_on_unusual_directory_names=1
 test_description='git cvsimport timestamps'
 . ./lib-cvs.sh
 
diff --git a/t/t9700-perl-git.sh b/t/t9700-perl-git.sh
index 102c133112..54ea4990c2 100755
--- a/t/t9700-perl-git.sh
+++ b/t/t9700-perl-git.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2008 Lea Wiemann
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='perl interface (Git.pm)'
 . ./test-lib.sh
 
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 5ed28135be..0231e9692a 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -3,6 +3,7 @@
 # Copyright (c) 2012 Felipe Contreras
 #
 
+test_fails_on_unusual_directory_names=1
 test_description='test bash completion'
 
 . ./lib-bash.sh
-- 
2.11.0


^ permalink raw reply related	[relevance 1%]

* [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names
@ 2017-04-09 19:11  2% Ævar Arnfjörð Bjarmason
  2017-04-09 19:11  1% ` [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2017-04-09 19:11 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Brandon Williams, Jeff King, Joachim Durchholz,
	Stefan Beller, Ævar Arnfjörð Bjarmason

There's a patch now on the ML for an issue with read v.s. read -r in
submodule revealed when the submodule name contains a \.

That fix is fine, but we should do better and structurally arrange our
tests to detect these sorts of issues before they're reported.

This series changes the test library so that we interpolate the result
of:

    perl -e 'print join q[], grep { /[^[:alnum:]]/ and !m<[./]> } map chr, 0x01..0x7f'

Into the trash directory name we generate. Doing this makes 30% of the
test suite fail. Most of the diffstat below is just adding:

    test_fails_on_unusual_directory_names=1

To those tests that failed, which makes them not use these garbage
trash directory names.

Some of those failures are legitimate bugs, some are an artifact of us
using shellscripting as our test language (namely interpolating ' and
" somewhere).

It might make sense to mark these tests more granularly, e.g.:

    test_fails_on_unusual_directory_name_types=quotes

etc., if the test fails just because of " or ', but I think as it is
this makes sense for inclusion, it makes sure we don't regress on the
remaining 70% of our test suite.

Ævar Arnfjörð Bjarmason (2):
  tests: mark tests that fail when the TEST_DIRECTORY is unusual
  test-lib: exhaustively insert non-alnum ASCII into the TRASH_DIRECTORY
    name

 t/README                                         | 12 ++++++++++++
 t/t0000-basic.sh                                 |  2 ++
 t/t0003-attributes.sh                            |  1 +
 t/t0021-conversion.sh                            |  1 +
 t/t0060-path-utils.sh                            |  1 +
 t/t0300-credentials.sh                           |  1 +
 t/t0302-credential-store.sh                      |  1 +
 t/t1006-cat-file.sh                              |  1 +
 t/t1013-read-tree-submodule.sh                   |  1 +
 t/t1020-subdirectory.sh                          |  1 +
 t/t1050-large.sh                                 |  1 +
 t/t1060-object-corruption.sh                     |  1 +
 t/t1300-repo-config.sh                           |  1 +
 t/t1305-config-include.sh                        |  1 +
 t/t1308-config-set.sh                            |  1 +
 t/t1309-early-config.sh                          |  1 +
 t/t1500-rev-parse.sh                             |  1 +
 t/t1504-ceiling-dirs.sh                          |  1 +
 t/t1507-rev-parse-upstream.sh                    |  1 +
 t/t1510-repo-setup.sh                            |  1 +
 t/t1515-rev-parse-outside-repo.sh                |  1 +
 t/t2013-checkout-submodule.sh                    |  1 +
 t/t2025-worktree-add.sh                          |  1 +
 t/t2027-worktree-list.sh                         |  1 +
 t/t2028-worktree-move.sh                         |  1 +
 t/t3040-subprojects-basic.sh                     |  1 +
 t/t3050-subprojects-fetch.sh                     |  1 +
 t/t3409-rebase-preserve-merges.sh                |  1 +
 t/t3426-rebase-submodule.sh                      |  1 +
 t/t3501-revert-cherry-pick.sh                    |  1 +
 t/t3512-cherry-pick-submodule.sh                 |  1 +
 t/t3513-revert-submodule.sh                      |  1 +
 t/t3600-rm.sh                                    |  1 +
 t/t3900-i18n-commit.sh                           |  1 +
 t/t3906-stash-submodule.sh                       |  1 +
 t/t4027-diff-submodule.sh                        |  1 +
 t/t4030-diff-textconv.sh                         |  1 +
 t/t4031-diff-rewrite-binary.sh                   |  1 +
 t/t4035-diff-quiet.sh                            |  1 +
 t/t4041-diff-submodule-option.sh                 |  1 +
 t/t4059-diff-submodule-not-initialized.sh        |  1 +
 t/t4060-diff-submodule-option-diff-format.sh     |  1 +
 t/t4137-apply-submodule.sh                       |  1 +
 t/t4203-mailmap.sh                               |  1 +
 t/t4207-log-decoration-colors.sh                 |  1 +
 t/t4255-am-submodule.sh                          |  1 +
 t/t5000-tar-tree.sh                              |  1 +
 t/t5001-archive-attr.sh                          |  1 +
 t/t5002-archive-attr-pattern.sh                  |  1 +
 t/t5003-archive-zip.sh                           |  1 +
 t/t5150-request-pull.sh                          |  1 +
 t/t5300-pack-object.sh                           |  1 +
 t/t5304-prune.sh                                 |  1 +
 t/t5305-include-tag.sh                           |  1 +
 t/t5306-pack-nobase.sh                           |  1 +
 t/t5310-pack-bitmaps.sh                          |  1 +
 t/t5311-pack-bitmaps-shallow.sh                  |  1 +
 t/t5400-send-pack.sh                             |  1 +
 t/t5401-update-hooks.sh                          |  1 +
 t/t5402-post-merge-hook.sh                       |  1 +
 t/t5403-post-checkout-hook.sh                    |  1 +
 t/t5404-tracking-branches.sh                     |  1 +
 t/t5406-remote-rejects.sh                        |  1 +
 t/t5407-post-rewrite-hook.sh                     |  1 +
 t/t5500-fetch-pack.sh                            |  1 +
 t/t5501-fetch-push-alternates.sh                 |  1 +
 t/t5502-quickfetch.sh                            |  1 +
 t/t5505-remote.sh                                |  1 +
 t/t5509-fetch-push-namespaces.sh                 |  1 +
 t/t5510-fetch.sh                                 |  1 +
 t/t5512-ls-remote.sh                             |  1 +
 t/t5514-fetch-multiple.sh                        |  1 +
 t/t5515-fetch-merge-logic.sh                     |  1 +
 t/t5516-fetch-push.sh                            |  1 +
 t/t5519-push-alternates.sh                       |  1 +
 t/t5520-pull.sh                                  |  1 +
 t/t5521-pull-options.sh                          |  1 +
 t/t5522-pull-symlink.sh                          |  1 +
 t/t5524-pull-msg.sh                              |  1 +
 t/t5525-fetch-tagopt.sh                          |  1 +
 t/t5526-fetch-submodules.sh                      |  1 +
 t/t5527-fetch-odd-refs.sh                        |  1 +
 t/t5531-deep-submodule-push.sh                   |  1 +
 t/t5533-push-cas.sh                              |  1 +
 t/t5535-fetch-push-symref.sh                     |  1 +
 t/t5536-fetch-conflicts.sh                       |  1 +
 t/t5537-fetch-shallow.sh                         |  1 +
 t/t5538-push-shallow.sh                          |  1 +
 t/t5539-fetch-http-shallow.sh                    |  1 +
 t/t5540-http-push-webdav.sh                      |  1 +
 t/t5541-http-push-smart.sh                       |  1 +
 t/t5542-push-http-shallow.sh                     |  1 +
 t/t5544-pack-objects-hook.sh                     |  1 +
 t/t5545-push-options.sh                          |  1 +
 t/t5547-push-quarantine.sh                       |  1 +
 t/t5550-http-fetch-dumb.sh                       |  1 +
 t/t5551-http-fetch-smart.sh                      |  1 +
 t/t5560-http-backend-noserver.sh                 |  1 +
 t/t5561-http-backend.sh                          |  1 +
 t/t5570-git-daemon.sh                            |  1 +
 t/t5572-pull-submodule.sh                        |  1 +
 t/t5600-clone-fail-cleanup.sh                    |  1 +
 t/t5601-clone.sh                                 |  1 +
 t/t5604-clone-reference.sh                       |  1 +
 t/t5605-clone-local.sh                           |  1 +
 t/t5606-clone-options.sh                         |  1 +
 t/t5609-clone-branch.sh                          |  1 +
 t/t5610-clone-detached.sh                        |  1 +
 t/t5611-clone-config.sh                          |  1 +
 t/t5612-clone-refspec.sh                         |  1 +
 t/t5613-info-alternate.sh                        |  1 +
 t/t5614-clone-submodules.sh                      |  1 +
 t/t5615-alternate-env.sh                         |  1 +
 t/t5801-remote-helpers.sh                        |  1 +
 t/t5802-connect-helper.sh                        |  1 +
 t/t5810-proto-disable-local.sh                   |  1 +
 t/t5812-proto-disable-http.sh                    |  1 +
 t/t5813-proto-disable-ssh.sh                     |  1 +
 t/t5814-proto-disable-ext.sh                     |  1 +
 t/t5815-submodule-protos.sh                      |  1 +
 t/t5900-repo-selection.sh                        |  1 +
 t/t6008-rev-list-submodule.sh                    |  1 +
 t/t6030-bisect-porcelain.sh                      |  1 +
 t/t6040-tracking-info.sh                         |  1 +
 t/t6041-bisect-submodule.sh                      |  1 +
 t/t6050-replace.sh                               |  1 +
 t/t6060-merge-index.sh                           |  1 +
 t/t6134-pathspec-in-submodule.sh                 |  1 +
 t/t6200-fmt-merge-msg.sh                         |  1 +
 t/t6500-gc.sh                                    |  1 +
 t/t7001-mv.sh                                    |  1 +
 t/t7003-filter-branch.sh                         |  1 +
 t/t7005-editor.sh                                |  1 +
 t/t7006-pager.sh                                 |  1 +
 t/t7008-grep-binary.sh                           |  1 +
 t/t7010-setup.sh                                 |  1 +
 t/t7064-wtstatus-pv2.sh                          |  1 +
 t/t7103-reset-bare.sh                            |  1 +
 t/t7112-reset-submodule.sh                       |  1 +
 t/t7300-clean.sh                                 |  1 +
 t/t7400-submodule-basic.sh                       |  1 +
 t/t7402-submodule-rebase.sh                      |  1 +
 t/t7403-submodule-sync.sh                        |  1 +
 t/t7405-submodule-merge.sh                       |  1 +
 t/t7406-submodule-update.sh                      |  1 +
 t/t7407-submodule-foreach.sh                     |  1 +
 t/t7408-submodule-reference.sh                   |  1 +
 t/t7409-submodule-detached-work-tree.sh          |  1 +
 t/t7410-submodule-checkout-to.sh                 |  1 +
 t/t7411-submodule-config.sh                      |  1 +
 t/t7413-submodule-is-active.sh                   |  1 +
 t/t7504-commit-msg-hook.sh                       |  1 +
 t/t7506-status-submodule.sh                      |  1 +
 t/t7507-commit-verbose.sh                        |  1 +
 t/t7517-per-repo-email.sh                        |  1 +
 t/t7613-merge-submodule.sh                       |  1 +
 t/t7700-repack.sh                                |  1 +
 t/t7800-difftool.sh                              |  1 +
 t/t7810-grep.sh                                  |  1 +
 t/t7814-grep-recurse-submodules.sh               |  1 +
 t/t9001-send-email.sh                            |  1 +
 t/t9020-remote-svn.sh                            |  1 +
 t/t9100-git-svn-basic.sh                         |  1 +
 t/t9101-git-svn-props.sh                         |  1 +
 t/t9102-git-svn-deep-rmdir.sh                    |  1 +
 t/t9103-git-svn-tracked-directory-removed.sh     |  1 +
 t/t9104-git-svn-follow-parent.sh                 |  1 +
 t/t9105-git-svn-commit-diff.sh                   |  1 +
 t/t9106-git-svn-commit-diff-clobber.sh           |  1 +
 t/t9107-git-svn-migrate.sh                       |  1 +
 t/t9108-git-svn-glob.sh                          |  1 +
 t/t9109-git-svn-multi-glob.sh                    |  1 +
 t/t9110-git-svn-use-svm-props.sh                 |  1 +
 t/t9114-git-svn-dcommit-merge.sh                 |  1 +
 t/t9115-git-svn-dcommit-funky-renames.sh         |  1 +
 t/t9116-git-svn-log.sh                           |  1 +
 t/t9117-git-svn-init-clone.sh                    |  1 +
 t/t9118-git-svn-funky-branch-names.sh            |  1 +
 t/t9120-git-svn-clone-with-percent-escapes.sh    |  1 +
 t/t9122-git-svn-author.sh                        |  1 +
 t/t9123-git-svn-rebuild-with-rewriteroot.sh      |  1 +
 t/t9124-git-svn-dcommit-auto-props.sh            |  1 +
 t/t9125-git-svn-multi-glob-branch-names.sh       |  1 +
 t/t9127-git-svn-partial-rebuild.sh               |  1 +
 t/t9128-git-svn-cmd-branch.sh                    |  1 +
 t/t9129-git-svn-i18n-commitencoding.sh           |  1 +
 t/t9131-git-svn-empty-symlink.sh                 |  1 +
 t/t9132-git-svn-broken-symlink.sh                |  1 +
 t/t9133-git-svn-nested-git-repo.sh               |  1 +
 t/t9134-git-svn-ignore-paths.sh                  |  1 +
 t/t9137-git-svn-dcommit-clobber-series.sh        |  1 +
 t/t9138-git-svn-authors-prog.sh                  |  1 +
 t/t9140-git-svn-reset.sh                         |  1 +
 t/t9141-git-svn-multiple-branches.sh             |  1 +
 t/t9142-git-svn-shallow-clone.sh                 |  1 +
 t/t9143-git-svn-gc.sh                            |  1 +
 t/t9144-git-svn-old-rev_map.sh                   |  1 +
 t/t9145-git-svn-master-branch.sh                 |  1 +
 t/t9146-git-svn-empty-dirs.sh                    |  1 +
 t/t9147-git-svn-include-paths.sh                 |  1 +
 t/t9148-git-svn-propset.sh                       |  1 +
 t/t9150-svk-mergetickets.sh                      |  1 +
 t/t9151-svn-mergeinfo.sh                         |  1 +
 t/t9153-git-svn-rewrite-uuid.sh                  |  1 +
 t/t9154-git-svn-fancy-glob.sh                    |  1 +
 t/t9155-git-svn-fetch-deleted-tag.sh             |  1 +
 t/t9156-git-svn-fetch-deleted-tag-2.sh           |  1 +
 t/t9157-git-svn-fetch-merge.sh                   |  1 +
 t/t9158-git-svn-mergeinfo.sh                     |  1 +
 t/t9159-git-svn-no-parent-mergeinfo.sh           |  1 +
 t/t9160-git-svn-preserve-empty-dirs.sh           |  1 +
 t/t9161-git-svn-mergeinfo-push.sh                |  1 +
 t/t9162-git-svn-dcommit-interactive.sh           |  1 +
 t/t9163-git-svn-reset-clears-caches.sh           |  1 +
 t/t9164-git-svn-dcommit-concurrent.sh            |  1 +
 t/t9165-git-svn-fetch-merge-branch-of-branch.sh  |  1 +
 t/t9166-git-svn-fetch-merge-branch-of-branch2.sh |  1 +
 t/t9167-git-svn-cmd-branch-subproject.sh         |  1 +
 t/t9168-git-svn-partially-globbed-names.sh       |  1 +
 t/t9200-git-cvsexportcommit.sh                   |  1 +
 t/t9300-fast-import.sh                           |  1 +
 t/t9350-fast-export.sh                           |  1 +
 t/t9400-git-cvsserver-server.sh                  |  1 +
 t/t9401-git-cvsserver-crlf.sh                    |  1 +
 t/t9402-git-cvsserver-refs.sh                    |  1 +
 t/t9500-gitweb-standalone-no-errors.sh           |  1 +
 t/t9502-gitweb-standalone-parse-output.sh        |  1 +
 t/t9600-cvsimport.sh                             |  1 +
 t/t9601-cvsimport-vendor-branch.sh               |  1 +
 t/t9602-cvsimport-branches-tags.sh               |  1 +
 t/t9604-cvsimport-timestamps.sh                  |  1 +
 t/t9700-perl-git.sh                              |  1 +
 t/t9902-completion.sh                            |  1 +
 t/test-lib.sh                                    |  4 ++++
 234 files changed, 249 insertions(+)

-- 
2.11.0


^ permalink raw reply	[relevance 2%]

* Re: [PATCH] submodule--helper.c: remove duplicate code
  @ 2017-03-08 18:53  4% ` Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2017-03-08 18:53 UTC (permalink / raw)
  To: Valery Tolstov; +Cc: git@vger.kernel.org

On Wed, Mar 8, 2017 at 9:44 AM,  <me@vtolstov.org> wrote:
> From: Valery Tolstov <me@vtolstov.org>
>
> Remove code fragment from module_clone that duplicates functionality
> of connect_work_tree_and_git_dir in dir.c
>
> Signed-off-by: Valery Tolstov <me@vtolstov.org>
> ---
>>> I think we can reuse code from module_clone that writes .git link.
>>> Possibly this code fragment needs to be factored out from module_clone
>>
>> That fragment already exists, see dir.h:
>> connect_work_tree_and_git_dir(work_tree, git_dir);
>> Maybe another good microproject is to use that in module_clone.
>
> By suggestion of Stefan Beller I would like to make this micro
> improvement as my microproject for GSoc.

Thanks for looking into this code deduplication!

Well these two parts of the code are subtly different, though.
When applying this patch to origin/master (3bc53220cb2 is the
last time I fetched from Junio), then

    $ make
    $ cd t
    $ prove --timer --jobs 25 ./t[0-8][0-9]*.sh
... lots of output...
 Test Summary Report
-------------------
./t3600-rm.sh                               (Wstat: 256 Tests: 79 Failed: 24)
  Failed tests:  39-40, 43-59, 61-65
  Non-zero exit status: 1
./t4059-diff-submodule-not-initialized.sh   (Wstat: 256 Tests: 8 Failed: 5)
  Failed tests:  4-8
  Non-zero exit status: 1
./t7001-mv.sh                               (Wstat: 256 Tests: 47 Failed: 7)
  Failed tests:  39-45
  Non-zero exit status: 1
./t7412-submodule-absorbgitdirs.sh          (Wstat: 256 Tests: 11 Failed: 6)
  Failed tests:  3-7, 9
  Non-zero exit status: 1
./t7400-submodule-basic.sh                  (Wstat: 256 Tests: 90 Failed: 13)
  Failed tests:  46-47, 49, 75, 79-87
  Non-zero exit status: 1
./t7406-submodule-update.sh                 (Wstat: 256 Tests: 52 Failed: 14)
  Failed tests:  5, 28-31, 33-34, 36-39, 43, 45-46
  Non-zero exit status: 1

When then running one of them with debug output
(See t/README for the debug flags, I remember divx,
the video format as a sufficient set of flags to get enough debug output)

    $ ./t7406-submodule-update.sh -d -i -v -x
...
++ cd foo
++ git submodule deinit -f sub
Cleared directory 'sub'
Submodule 'foo/sub' (/usr/local/google/home/sbeller/OSS/git/t/trash
directory.t7406-submodule-update/withsubs/../rebasing) unregistered
for path 'sub'
++ git submodule update --init sub
+ test_eval_ret_=1
+ want_trace
+ test t = t
+ test t = t
+ set +x
error: last command exited with $?=1
not ok 5 - submodule update --init from and of subdirectory
#
# git init withsubs &&
# (cd withsubs &&
# mkdir foo &&
# git submodule add "$(pwd)/../rebasing" foo/sub &&
# (cd foo &&
#  git submodule deinit -f sub &&
#  git submodule update --init sub 2>../../actual2
# )
# ) &&
# test_i18ncmp expect2 actual2
#

$ cd trash\ directory.t7406-submodule-update/withsubs/foo/
$  git submodule deinit -f sub
Cleared directory 'sub'
Submodule 'foo/sub' (/usr/local/google/home/sbeller/OSS/git/t/trash
directory.t7406-submodule-update/withsubs/../rebasing) unregistered
for path 'sub'

$ git submodule update --init sub
Submodule 'foo/sub' (/usr/local/google/home/sbeller/OSS/git/t/trash
directory.t7406-submodule-update/withsubs/../rebasing) registered for
path 'sub'
fatal: could not get submodule directory for
'/usr/local/google/home/sbeller/OSS/git/t/trash
directory.t7406-submodule-update/withsubs/foo/sub'
Failed to clone 'foo/sub'. Retry scheduled
fatal: could not get submodule directory for
'/usr/local/google/home/sbeller/OSS/git/t/trash
directory.t7406-submodule-update/withsubs/foo/sub'
Failed to clone 'foo/sub' a second time, aborting


So I think we're missing to create the directory? (Just guessing)

Maybe we need to have 2293f77a081
(connect_work_tree_and_git_dir: safely create leading directories,
part of origin/sb/checkout-recurse-submodules, also found at
https://public-inbox.org/git/20170306205919.9713-8-sbeller@google.com/ )
first before we can apply this patch.

Thanks,
Stefan

>
>  builtin/submodule--helper.c | 22 +++-------------------
>  1 file changed, 3 insertions(+), 19 deletions(-)
>
> diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
> index 899dc334e..cda8a3bc1 100644
> --- a/builtin/submodule--helper.c
> +++ b/builtin/submodule--helper.c
> @@ -579,7 +579,6 @@ static int module_clone(int argc, const char **argv, const char *prefix)
>         const char *name = NULL, *url = NULL, *depth = NULL;
>         int quiet = 0;
>         int progress = 0;
> -       FILE *submodule_dot_git;
>         char *p, *path = NULL, *sm_gitdir;
>         struct strbuf rel_path = STRBUF_INIT;
>         struct strbuf sb = STRBUF_INIT;
> @@ -653,27 +652,12 @@ static int module_clone(int argc, const char **argv, const char *prefix)
>                 strbuf_reset(&sb);
>         }
>
> -       /* Write a .git file in the submodule to redirect to the superproject. */
> -       strbuf_addf(&sb, "%s/.git", path);
> -       if (safe_create_leading_directories_const(sb.buf) < 0)
> -               die(_("could not create leading directories of '%s'"), sb.buf);
> -       submodule_dot_git = fopen(sb.buf, "w");
> -       if (!submodule_dot_git)
> -               die_errno(_("cannot open file '%s'"), sb.buf);
> -
> -       fprintf_or_die(submodule_dot_git, "gitdir: %s\n",
> -                      relative_path(sm_gitdir, path, &rel_path));
> -       if (fclose(submodule_dot_git))
> -               die(_("could not close file %s"), sb.buf);
> -       strbuf_reset(&sb);
> -       strbuf_reset(&rel_path);
> -
> -       /* Redirect the worktree of the submodule in the superproject's config */
>         p = git_pathdup_submodule(path, "config");
>         if (!p)
>                 die(_("could not get submodule directory for '%s'"), path);
> -       git_config_set_in_file(p, "core.worktree",
> -                              relative_path(path, sm_gitdir, &rel_path));
> +
> +       /* Connect module worktree and git dir */
> +       connect_work_tree_and_git_dir(path, sm_gitdir);
>
>         /* setup alternateLocation and alternateErrorStrategy in the cloned submodule if needed */
>         git_config_get_string("submodule.alternateLocation", &sm_alternate);
> --
> 2.12.0.190.g250ed7eaf
>

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 02/14] lib-submodule-update.sh: define tests for recursing into submodules
  @ 2017-02-15 18:52  6%     ` Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2017-02-15 18:52 UTC (permalink / raw)
  To: Brandon Williams
  Cc: git@vger.kernel.org, Jonathan Nieder, brian m. carlson,
	Junio C Hamano

On Wed, Feb 15, 2017 at 8:51 AM, Brandon Williams <bmwill@google.com> wrote:
> On 02/14, Stefan Beller wrote:
>> diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh
>> index 61c54f2098..7c8c557572 100755
>> --- a/t/lib-submodule-update.sh
>> +++ b/t/lib-submodule-update.sh
>> @@ -4,6 +4,7 @@
>>  # - New submodule (no_submodule => add_sub1)
>>  # - Removed submodule (add_sub1 => remove_sub1)
>>  # - Updated submodule (add_sub1 => modify_sub1)
>> +# - Updated submodule recursively (modify_sub1 => modify_sub1_recursively)
>>  # - Submodule updated to invalid commit (add_sub1 => invalid_sub1)
>>  # - Submodule updated from invalid commit (invalid_sub1 => valid_sub1)
>>  # - Submodule replaced by tracked files in directory (add_sub1 =>
>> @@ -19,8 +20,8 @@
>>  #                    /    ^
>>  #                   /     remove_sub1
>>  #                  /
>> -#       add_sub1  /-------O
>> -#             |  /        ^
>> +#       add_sub1  /-------O---------O
>> +#             |  /        ^         modify_sub1_recursive
>>  #             | /         modify_sub1
>>  #             v/
>>  #      O------O-----------O---------O
>> @@ -73,6 +74,14 @@ create_lib_submodule_repo () {
>>               git add sub1 &&
>>               git commit -m "Modify sub1" &&
>>
>> +             git checkout -b modify_sub1_recursively modify_sub1 &&
>> +             git -C sub1 checkout -b "add_nested_sub" &&
>> +             git -C sub1 submodule add --branch no_submodule ./. sub2 &&
>
> I thought we were trying to avoid './.' when adding submodules?
>

Yes we should; I'll fix that in a reroll.
It's also still on my long term fix list to remove the ./.
$ git grep 'add \./\.'
lib-submodule-update.sh:                git submodule add ./. sub1 &&
t7001-mv.sh:    git submodule add ./. sub &&
t7001-mv.sh:    git submodule add ./. deep/directory/hierarchy/sub &&
t7507-commit-verbose.sh:        git submodule add ./. sub &&
t7800-difftool.sh:      git submodule add ./. submod/ule &&

^ permalink raw reply	[relevance 6%]

* [PATCHv6 0/2] pathspec: give better message for submodule related pathspec error
@ 2017-01-05 19:29  5% Stefan Beller
  2017-01-05 19:29 10% ` [PATCHv6 1/2] submodule tests: don't use itself as a submodule Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2017-01-05 19:29 UTC (permalink / raw)
  To: bmwill, peff, gitster; +Cc: git, Stefan Beller

v6:
* rebased on top of origin/bw/pathspec-cleanup, resolving conflicts.
  (Additionally needs merging with origin/sb/submodule-embed-gitdir to have 
  6f94351b0, test-lib-functions.sh: teach test_commit -C <dir>)
* reworded comments and commit message
* do not reuse the strip_submodule_slash_expensive function, but have
  a dedicated die_inside_submodule_path function.

v5:
* was just resending the latest patch, which turns out to be in conflict with
  origin/bw/pathspec-cleanup

v4:
> It MIGHT be a handy hack when writing a test, but let's stop doing
> that insanity.  No sane project does that in real life, doesn't it?

> Create a subdirectory, make it a repository, have a commit there and
> bind that as our own submodule.  That would be a more normal way to
> start your own superproject and its submodule pair if they originate
> together at the same place.

This comes as an extra patch before the actual fix.
The actual fixing patch was reworded borrowing some words from Jeff.
As this makes use of "test_commit -C", it goes on top of sb/submodule-embed-gitdir

v3:
more defensive and with tests.


Stefan Beller (2):
  submodule tests: don't use itself as a submodule
  pathspec: give better message for submodule related pathspec error

 pathspec.c                       | 31 ++++++++++++++++++++++---------
 t/lib-submodule-update.sh        |  2 ++
 t/t6134-pathspec-in-submodule.sh | 33 +++++++++++++++++++++++++++++++++
 t/t7001-mv.sh                    |  5 +++--
 t/t7507-commit-verbose.sh        |  4 +++-
 t/t7800-difftool.sh              |  4 +++-
 t/test-lib-functions.sh          | 16 ++++++++++++++++
 7 files changed, 82 insertions(+), 13 deletions(-)
 create mode 100755 t/t6134-pathspec-in-submodule.sh

-- 
2.11.0.31.g919a8d0.dirty


^ permalink raw reply	[relevance 5%]

* [PATCHv6 1/2] submodule tests: don't use itself as a submodule
  2017-01-05 19:29  5% [PATCHv6 0/2] pathspec: give better message for submodule related pathspec error Stefan Beller
@ 2017-01-05 19:29 10% ` Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2017-01-05 19:29 UTC (permalink / raw)
  To: bmwill, peff, gitster; +Cc: git, Stefan Beller

In reality nobody would run "git submodule add ./. <submodule-path>"
to add the repository to itself as a submodule as this comes with some
nasty surprises, such as infinite recursion when cloning that repository.
However we do this all the time in the test suite, because most of the
time this was the most convenient way to test a very specific thing
for submodule behavior.

This provides an easier way to have submodules in tests, by just setting
TEST_CREATE_SUBMODULE to a non empty string, similar to
TEST_NO_CREATE_REPO.

Make use of it in those tests that add a submodule from ./. except for
the occurrence in create_lib_submodule_repo as there it seems we craft
a repository deliberately for both inside as well as outside use.

The name "pretzel.[non]bare" was chosen deliberate to not introduce
more strings to the test suite containing "sub[module]" as searching for
"sub" already yields a lot of hits from different contexts. "pretzel"
doesn't occur in the test suite yet, so it is a good candidate for
a potential remote for a submodule.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 t/lib-submodule-update.sh |  2 ++
 t/t7001-mv.sh             |  5 +++--
 t/t7507-commit-verbose.sh |  4 +++-
 t/t7800-difftool.sh       |  4 +++-
 t/test-lib-functions.sh   | 16 ++++++++++++++++
 5 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh
index 79cdd34a54..58d76d9df8 100755
--- a/t/lib-submodule-update.sh
+++ b/t/lib-submodule-update.sh
@@ -44,6 +44,8 @@ create_lib_submodule_repo () {
 		git branch "no_submodule" &&
 
 		git checkout -b "add_sub1" &&
+		# Adding the repo itself as a submodule is a hack.
+		# Do not imitate this.
 		git submodule add ./. sub1 &&
 		git config -f .gitmodules submodule.sub1.ignore all &&
 		git config submodule.sub1.ignore all &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e365d1ff77..6cb32f3a3a 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 test_description='git mv in subdirs'
+TEST_CREATE_SUBMODULE=yes
 . ./test-lib.sh
 
 test_expect_success \
@@ -288,12 +289,12 @@ rm -f moved symlink
 test_expect_success 'setup submodule' '
 	git commit -m initial &&
 	git reset --hard &&
-	git submodule add ./. sub &&
+	git submodule add ./pretzel.bare sub &&
 	echo content >file &&
 	git add file &&
 	git commit -m "added sub and file" &&
 	mkdir -p deep/directory/hierarchy &&
-	git submodule add ./. deep/directory/hierarchy/sub &&
+	git submodule add ./pretzel.bare deep/directory/hierarchy/sub &&
 	git commit -m "added another submodule" &&
 	git branch submodule
 '
diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh
index ed2653d46f..d269900afa 100755
--- a/t/t7507-commit-verbose.sh
+++ b/t/t7507-commit-verbose.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 test_description='verbose commit template'
+TEST_CREATE_SUBMODULE=yes
 . ./test-lib.sh
 
 write_script "check-for-diff" <<\EOF &&
@@ -74,11 +75,12 @@ test_expect_success 'diff in message is retained with -v' '
 
 test_expect_success 'submodule log is stripped out too with -v' '
 	git config diff.submodule log &&
-	git submodule add ./. sub &&
+	git submodule add ./pretzel.bare sub &&
 	git commit -m "sub added" &&
 	(
 		cd sub &&
 		echo "more" >>file &&
+		git add file &&
 		git commit -a -m "submodule commit"
 	) &&
 	(
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 70a2de461a..d13a5d0453 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -7,6 +7,7 @@ test_description='git-difftool
 
 Testing basic diff tool invocation
 '
+TEST_CREATE_SUBMODULE=Yes
 
 . ./test-lib.sh
 
@@ -534,7 +535,8 @@ test_expect_success PERL 'difftool --no-symlinks detects conflict ' '
 '
 
 test_expect_success PERL 'difftool properly honors gitlink and core.worktree' '
-	git submodule add ./. submod/ule &&
+	git submodule add ./pretzel.bare submod/ule &&
+	test_commit -C submod/ule second_commit &&
 	test_config -C submod/ule diff.tool checktrees &&
 	test_config -C submod/ule difftool.checktrees.cmd '\''
 		test -d "$LOCAL" && test -d "$REMOTE" && echo good
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 579e812506..aa327a7dff 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -800,6 +800,22 @@ test_create_repo () {
 		error "cannot run git init -- have you built things yet?"
 		mv .git/hooks .git/hooks-disabled
 	) || exit
+	if test -n "$TEST_CREATE_SUBMODULE"
+	then
+		(
+			cd "$repo"
+			TEST_CREATE_SUBMODULE=
+			export TEST_CREATE_SUBMODULE
+			test_create_repo "pretzel.nonbare"
+			test_commit -C "pretzel.nonbare" \
+				"create submodule" "submodule-file" \
+				"submodule-content" "submodule-tag" >&3 2>&4 ||
+				error "cannot run test_commit"
+			git clone --bare "pretzel.nonbare" \
+				  "pretzel.bare" >&3 2>&4 ||
+				  error "cannot clone into bare"
+		)
+	fi
 }
 
 # This function helps on symlink challenged file systems when it is not
-- 
2.11.0.31.g919a8d0.dirty


^ permalink raw reply related	[relevance 10%]

* [PATCH 1/2] submodule tests: don't use itself as a submodule
  2017-01-04  1:48  5% [PATCHv4 0/2] pathspec: give better message for submodule related pathspec error Stefan Beller
@ 2017-01-04  1:48 10% ` Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2017-01-04  1:48 UTC (permalink / raw)
  To: gitster; +Cc: git, peff, bmwill, Stefan Beller

In reality nobody would run "git submodule add ./. <submodule-path>"
to add the repository to itself as a submodule as this comes with some
nasty surprises, such as infinite recursion when cloning that repository.
However we do this all the time in the test suite, because most of the
time this was the most convenient way to test a very specific thing
for submodule behavior.

This provides an easier way to have submodules in tests, by just setting
TEST_CREATE_SUBMODULE to a non empty string, similar to
TEST_NO_CREATE_REPO.

Make use of it in those tests that add a submodule from ./. except for
the occurrence in create_lib_submodule_repo as there it seems we craft
a repository deliberately for both inside as well as outside use.

The name "pretzel.[non]bare" was chosen deliberate to not introduce
more strings to the test suite containing "sub[module]" as searching for
"sub" already yields a lot of hits from different contexts. "pretzel"
doesn't occur in the test suite yet, so it is a good candidate for
a potential remote for a submodule.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 t/lib-submodule-update.sh |  2 ++
 t/t7001-mv.sh             |  5 +++--
 t/t7507-commit-verbose.sh |  4 +++-
 t/t7800-difftool.sh       |  4 +++-
 t/test-lib-functions.sh   | 16 ++++++++++++++++
 5 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh
index 79cdd34a54..58d76d9df8 100755
--- a/t/lib-submodule-update.sh
+++ b/t/lib-submodule-update.sh
@@ -44,6 +44,8 @@ create_lib_submodule_repo () {
 		git branch "no_submodule" &&
 
 		git checkout -b "add_sub1" &&
+		# Adding the repo itself as a submodule is a hack.
+		# Do not imitate this.
 		git submodule add ./. sub1 &&
 		git config -f .gitmodules submodule.sub1.ignore all &&
 		git config submodule.sub1.ignore all &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e365d1ff77..6cb32f3a3a 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 test_description='git mv in subdirs'
+TEST_CREATE_SUBMODULE=yes
 . ./test-lib.sh
 
 test_expect_success \
@@ -288,12 +289,12 @@ rm -f moved symlink
 test_expect_success 'setup submodule' '
 	git commit -m initial &&
 	git reset --hard &&
-	git submodule add ./. sub &&
+	git submodule add ./pretzel.bare sub &&
 	echo content >file &&
 	git add file &&
 	git commit -m "added sub and file" &&
 	mkdir -p deep/directory/hierarchy &&
-	git submodule add ./. deep/directory/hierarchy/sub &&
+	git submodule add ./pretzel.bare deep/directory/hierarchy/sub &&
 	git commit -m "added another submodule" &&
 	git branch submodule
 '
diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh
index ed2653d46f..d269900afa 100755
--- a/t/t7507-commit-verbose.sh
+++ b/t/t7507-commit-verbose.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 test_description='verbose commit template'
+TEST_CREATE_SUBMODULE=yes
 . ./test-lib.sh
 
 write_script "check-for-diff" <<\EOF &&
@@ -74,11 +75,12 @@ test_expect_success 'diff in message is retained with -v' '
 
 test_expect_success 'submodule log is stripped out too with -v' '
 	git config diff.submodule log &&
-	git submodule add ./. sub &&
+	git submodule add ./pretzel.bare sub &&
 	git commit -m "sub added" &&
 	(
 		cd sub &&
 		echo "more" >>file &&
+		git add file &&
 		git commit -a -m "submodule commit"
 	) &&
 	(
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 70a2de461a..d13a5d0453 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -7,6 +7,7 @@ test_description='git-difftool
 
 Testing basic diff tool invocation
 '
+TEST_CREATE_SUBMODULE=Yes
 
 . ./test-lib.sh
 
@@ -534,7 +535,8 @@ test_expect_success PERL 'difftool --no-symlinks detects conflict ' '
 '
 
 test_expect_success PERL 'difftool properly honors gitlink and core.worktree' '
-	git submodule add ./. submod/ule &&
+	git submodule add ./pretzel.bare submod/ule &&
+	test_commit -C submod/ule second_commit &&
 	test_config -C submod/ule diff.tool checktrees &&
 	test_config -C submod/ule difftool.checktrees.cmd '\''
 		test -d "$LOCAL" && test -d "$REMOTE" && echo good
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 579e812506..aa327a7dff 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -800,6 +800,22 @@ test_create_repo () {
 		error "cannot run git init -- have you built things yet?"
 		mv .git/hooks .git/hooks-disabled
 	) || exit
+	if test -n "$TEST_CREATE_SUBMODULE"
+	then
+		(
+			cd "$repo"
+			TEST_CREATE_SUBMODULE=
+			export TEST_CREATE_SUBMODULE
+			test_create_repo "pretzel.nonbare"
+			test_commit -C "pretzel.nonbare" \
+				"create submodule" "submodule-file" \
+				"submodule-content" "submodule-tag" >&3 2>&4 ||
+				error "cannot run test_commit"
+			git clone --bare "pretzel.nonbare" \
+				  "pretzel.bare" >&3 2>&4 ||
+				  error "cannot clone into bare"
+		)
+	fi
 }
 
 # This function helps on symlink challenged file systems when it is not
-- 
2.11.0.rc2.31.g2cc886f


^ permalink raw reply related	[relevance 10%]

* [PATCHv4 0/2] pathspec: give better message for submodule related pathspec error
@ 2017-01-04  1:48  5% Stefan Beller
  2017-01-04  1:48 10% ` [PATCH 1/2] submodule tests: don't use itself as a submodule Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2017-01-04  1:48 UTC (permalink / raw)
  To: gitster; +Cc: git, peff, bmwill, Stefan Beller

> It MIGHT be a handy hack when writing a test, but let's stop doing
> that insanity.  No sane project does that in real life, doesn't it?

> Create a subdirectory, make it a repository, have a commit there and
> bind that as our own submodule.  That would be a more normal way to
> start your own superproject and its submodule pair if they originate
> together at the same place.

This comes as an extra patch before the actual fix.

The actual fixing patch was reworded borrowing some words from Jeff.

As this makes use of "test_commit -C", it goes on top of sb/submodule-embed-gitdir

Thanks,
Stefan


Stefan Beller (2):
  submodule tests: don't use itself as a submodule
  pathspec: give better message for submodule related pathspec error

 pathspec.c                       | 24 ++++++++++++++++++++++--
 t/lib-submodule-update.sh        |  2 ++
 t/t6134-pathspec-in-submodule.sh | 33 +++++++++++++++++++++++++++++++++
 t/t7001-mv.sh                    |  5 +++--
 t/t7507-commit-verbose.sh        |  4 +++-
 t/t7800-difftool.sh              |  4 +++-
 t/test-lib-functions.sh          | 16 ++++++++++++++++
 7 files changed, 82 insertions(+), 6 deletions(-)
 create mode 100755 t/t6134-pathspec-in-submodule.sh

-- 
2.11.0.rc2.31.g2cc886f


^ permalink raw reply	[relevance 5%]

* Re: [PATCH] Spelling fixes
  2016-08-09  8:53  6% [PATCH] Spelling fixes Ville Skyttä
@ 2016-08-09 18:19  0% ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-08-09 18:19 UTC (permalink / raw)
  To: Ville Skyttä; +Cc: git

Ville Skyttä <ville.skytta@iki.fi> writes:

> Signed-off-by: Ville Skyttä <ville.skytta@iki.fi>
> ---
>  Documentation/RelNotes/2.3.10.txt           | 2 +-
>  Documentation/RelNotes/2.4.10.txt           | 2 +-
>  Documentation/RelNotes/2.5.4.txt            | 2 +-
>  Documentation/RelNotes/2.6.1.txt            | 2 +-
>  Documentation/git-remote-fd.txt             | 2 +-
>  Documentation/gitattributes.txt             | 2 +-
>  Documentation/gitmodules.txt                | 2 +-
>  contrib/hooks/multimail/README              | 4 ++--
>  contrib/mw-to-git/.perlcriticrc             | 2 +-
>  contrib/mw-to-git/git-remote-mediawiki.perl | 2 +-
>  contrib/subtree/t/t7900-subtree.sh          | 2 +-
>  git-p4.py                                   | 2 +-
>  sha1_file.c                                 | 2 +-
>  t/README                                    | 2 +-
>  t/t1006-cat-file.sh                         | 2 +-
>  t/t3101-ls-tree-dirname.sh                  | 2 +-
>  t/t6018-rev-list-glob.sh                    | 2 +-
>  t/t6030-bisect-porcelain.sh                 | 2 +-
>  t/t7001-mv.sh                               | 8 ++++----
>  t/t7810-grep.sh                             | 2 +-
>  t/t9401-git-cvsserver-crlf.sh               | 2 +-
>  upload-pack.c                               | 2 +-
>  22 files changed, 26 insertions(+), 26 deletions(-)

Wow, that's a lot of typos.  I asked "git show --word-diff" what got
changed, which told me this:

    <BAD>                     <CORRECTED>

    accidently                accidentally
    commited                  committed
    dependancy                dependency
    emtpy                     empty
    existance                 existence
    explicitely               explicitly
    git-upload-achive         git-upload-archive
    hierachy                  hierarchy
    intial                    initial
    mulitple                  multiple
    non-existant              non-existent
    precendence.              precedence.
    priviledged               privileged
    programatically           programmatically
    psuedo-binary             pseudo-binary
    soemwhere                 somewhere
    successfull               successful
    unkown                    unknown
    usefull                   useful
    writting                  writing

and then looked at all lines in the patch.  They all looked
reasonable.

There are two "commited" you seem to have missed, though,

t/t3420-rebase-autostash.sh:    echo uncommited-content >file0 &&
t/t3420-rebase-autostash.sh:    echo uncommited-content >expected &&

which I'll queue on top of this patch to be later squashed (i.e. no
need to resend the whole thing only to add these two).

Thanks.

^ permalink raw reply	[relevance 0%]

* [PATCH] Spelling fixes
@ 2016-08-09  8:53  6% Ville Skyttä
  2016-08-09 18:19  0% ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Ville Skyttä @ 2016-08-09  8:53 UTC (permalink / raw)
  To: git

Signed-off-by: Ville Skyttä <ville.skytta@iki.fi>
---
 Documentation/RelNotes/2.3.10.txt           | 2 +-
 Documentation/RelNotes/2.4.10.txt           | 2 +-
 Documentation/RelNotes/2.5.4.txt            | 2 +-
 Documentation/RelNotes/2.6.1.txt            | 2 +-
 Documentation/git-remote-fd.txt             | 2 +-
 Documentation/gitattributes.txt             | 2 +-
 Documentation/gitmodules.txt                | 2 +-
 contrib/hooks/multimail/README              | 4 ++--
 contrib/mw-to-git/.perlcriticrc             | 2 +-
 contrib/mw-to-git/git-remote-mediawiki.perl | 2 +-
 contrib/subtree/t/t7900-subtree.sh          | 2 +-
 git-p4.py                                   | 2 +-
 sha1_file.c                                 | 2 +-
 t/README                                    | 2 +-
 t/t1006-cat-file.sh                         | 2 +-
 t/t3101-ls-tree-dirname.sh                  | 2 +-
 t/t6018-rev-list-glob.sh                    | 2 +-
 t/t6030-bisect-porcelain.sh                 | 2 +-
 t/t7001-mv.sh                               | 8 ++++----
 t/t7810-grep.sh                             | 2 +-
 t/t9401-git-cvsserver-crlf.sh               | 2 +-
 upload-pack.c                               | 2 +-
 22 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/Documentation/RelNotes/2.3.10.txt b/Documentation/RelNotes/2.3.10.txt
index 9d425d8..20c2d2c 100644
--- a/Documentation/RelNotes/2.3.10.txt
+++ b/Documentation/RelNotes/2.3.10.txt
@@ -7,7 +7,7 @@ Fixes since v2.3.9
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
diff --git a/Documentation/RelNotes/2.4.10.txt b/Documentation/RelNotes/2.4.10.txt
index 8621199..702d8d4 100644
--- a/Documentation/RelNotes/2.4.10.txt
+++ b/Documentation/RelNotes/2.4.10.txt
@@ -7,7 +7,7 @@ Fixes since v2.4.9
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
diff --git a/Documentation/RelNotes/2.5.4.txt b/Documentation/RelNotes/2.5.4.txt
index a5e8477..b8a2f93 100644
--- a/Documentation/RelNotes/2.5.4.txt
+++ b/Documentation/RelNotes/2.5.4.txt
@@ -7,7 +7,7 @@ Fixes since v2.5.4
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
diff --git a/Documentation/RelNotes/2.6.1.txt b/Documentation/RelNotes/2.6.1.txt
index 1e51363..f37ea89 100644
--- a/Documentation/RelNotes/2.6.1.txt
+++ b/Documentation/RelNotes/2.6.1.txt
@@ -7,7 +7,7 @@ Fixes since v2.6
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
diff --git a/Documentation/git-remote-fd.txt b/Documentation/git-remote-fd.txt
index e700baf..80afca8 100644
--- a/Documentation/git-remote-fd.txt
+++ b/Documentation/git-remote-fd.txt
@@ -17,7 +17,7 @@ fetch, push or archive.
 
 If only <infd> is given, it is assumed to be a bidirectional socket connected
 to remote Git server (git-upload-pack, git-receive-pack or
-git-upload-achive). If both <infd> and <outfd> are given, they are assumed
+git-upload-archive). If both <infd> and <outfd> are given, they are assumed
 to be pipes connected to a remote Git server (<infd> being the inbound pipe
 and <outfd> being the outbound pipe.
 
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 34db3e2..807577a 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -133,7 +133,7 @@ Set to string value "auto"::
 	When `text` is set to "auto", the path is marked for automatic
 	end-of-line conversion.  If Git decides that the content is
 	text, its line endings are converted to LF on checkin.
-	When the file has been commited with CRLF, no conversion is done.
+	When the file has been committed with CRLF, no conversion is done.
 
 Unspecified::
 
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
index 0849d28..10dcc08 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.txt
@@ -81,7 +81,7 @@ submodule.<name>.ignore::
 
 submodule.<name>.shallow::
 	When set to true, a clone of this submodule will be performed as a
-	shallow clone unless the user explicitely asks for a non-shallow
+	shallow clone unless the user explicitly asks for a non-shallow
 	clone.
 
 
diff --git a/contrib/hooks/multimail/README b/contrib/hooks/multimail/README
index 0c91d19..22a23cd 100644
--- a/contrib/hooks/multimail/README
+++ b/contrib/hooks/multimail/README
@@ -294,7 +294,7 @@ multimailhook.htmlInIntro, multimailhook.htmlInFooter
     like ``<a href="foo">link</a>``, the reader will see the HTML
     source code and not a proper link.
 
-    Set ``multimailhook.htmlInIntro`` to true to allow writting HTML
+    Set ``multimailhook.htmlInIntro`` to true to allow writing HTML
     formatting in introduction templates. Similarly, set
     ``multimailhook.htmlInFooter`` for HTML in the footer.
 
@@ -516,7 +516,7 @@ multimailhook.commitLogOpts
 
 multimailhook.dateSubstitute
     String to use as a substitute for ``Date:`` in the output of ``git
-    log`` while formatting commit messages. This is usefull to avoid
+    log`` while formatting commit messages. This is useful to avoid
     emitting a line that can be interpreted by mailers as the start of
     a cited message (Zimbra webmail in particular). Defaults to
     ``CommitDate:``. Set to an empty string or ``none`` to deactivate
diff --git a/contrib/mw-to-git/.perlcriticrc b/contrib/mw-to-git/.perlcriticrc
index 5a9955d..158958d 100644
--- a/contrib/mw-to-git/.perlcriticrc
+++ b/contrib/mw-to-git/.perlcriticrc
@@ -19,7 +19,7 @@
 [InputOutput::RequireCheckedSyscalls]
 functions = open say close
 
-# This rules demands to add a dependancy for the Readonly module. This is not
+# This rule demands to add a dependency for the Readonly module. This is not
 # wished.
 [-ValuesAndExpressions::ProhibitConstantPragma]
 
diff --git a/contrib/mw-to-git/git-remote-mediawiki.perl b/contrib/mw-to-git/git-remote-mediawiki.perl
index 8dd74a9..41e74fb 100755
--- a/contrib/mw-to-git/git-remote-mediawiki.perl
+++ b/contrib/mw-to-git/git-remote-mediawiki.perl
@@ -963,7 +963,7 @@ sub mw_upload_file {
 		print {*STDERR} "Check the configuration of file uploads in your mediawiki.\n";
 		return $newrevid;
 	}
-	# Deleting and uploading a file requires a priviledged user
+	# Deleting and uploading a file requires a privileged user
 	if ($file_deleted) {
 		$mediawiki = connect_maybe($mediawiki, $remotename, $url);
 		my $query = {
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 9751cfe..3c87eba 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -948,7 +948,7 @@ test_expect_success 'split a new subtree without --onto option' '
 
 		# 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
+		# then the new subtree has accidentally been attached to something
 		git subtree split --prefix="sub dir2" --branch subproj2-br &&
 		check_equal "$(git log --pretty=format:%P -1 subproj2-br)" ""
 	)
diff --git a/git-p4.py b/git-p4.py
index ac6f4c1..fd5ca52 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1934,7 +1934,7 @@ class P4Submit(Command, P4UserMap):
         if self.useClientSpec:
             self.clientSpecDirs = getClientSpec()
 
-        # Check for the existance of P4 branches
+        # Check for the existence of P4 branches
         branchesDetected = (len(p4BranchesInGit().keys()) > 1)
 
         if self.useClientSpec and not branchesDetected:
diff --git a/sha1_file.c b/sha1_file.c
index 3066b5f..7026e4b 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1692,7 +1692,7 @@ static int parse_sha1_header_extended(const char *hdr, struct object_info *oi,
 		strbuf_add(oi->typename, type_buf, type_len);
 	/*
 	 * Set type to 0 if its an unknown object and
-	 * we're obtaining the type using '--allow-unkown-type'
+	 * we're obtaining the type using '--allow-unknown-type'
 	 * option.
 	 */
 	if ((flags & LOOKUP_UNKNOWN_OBJECT) && (type < 0))
diff --git a/t/README b/t/README
index 76a0daa..0f764c0 100644
--- a/t/README
+++ b/t/README
@@ -265,7 +265,7 @@ right, so this:
     $ sh ./t9200-git-cvsexport-commit.sh --run='1-4 !3'
 
 will run tests 1, 2, and 4.  Items that comes later have higher
-precendence.  It means that this:
+precedence.  It means that this:
 
     $ sh ./t9200-git-cvsexport-commit.sh --run='!3 1-4'
 
diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
index 4f38078..b19f332 100755
--- a/t/t1006-cat-file.sh
+++ b/t/t1006-cat-file.sh
@@ -231,7 +231,7 @@ $tag_content
        | git cat-file --batch)"
 '
 
-test_expect_success "--batch-check for an emtpy line" '
+test_expect_success "--batch-check for an empty line" '
     test " missing" = "$(echo | git cat-file --batch-check)"
 '
 
diff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh
index 425d858..327ded4 100755
--- a/t/t3101-ls-tree-dirname.sh
+++ b/t/t3101-ls-tree-dirname.sh
@@ -16,7 +16,7 @@ This test runs git ls-tree with the following in a tree.
     path3/1.txt        - a file in a directory
     path3/2.txt        - a file in a directory
 
-Test the handling of mulitple directories which have matching file
+Test the handling of multiple directories which have matching file
 entries.  Also test odd filename and missing entries handling.
 '
 . ./test-lib.sh
diff --git a/t/t6018-rev-list-glob.sh b/t/t6018-rev-list-glob.sh
index d00f7db..381f35e 100755
--- a/t/t6018-rev-list-glob.sh
+++ b/t/t6018-rev-list-glob.sh
@@ -257,7 +257,7 @@ test_expect_success 'rev-list accumulates multiple --exclude' '
 
 
 # "git rev-list<ENTER>" is likely to be a bug in the calling script and may
-# deserve an error message, but do cases where set of refs programatically
+# deserve an error message, but do cases where set of refs programmatically
 # given using globbing and/or --stdin need to fail with the same error, or
 # are we better off reporting a success with no output?  The following few
 # tests document the current behaviour to remind us that we might want to
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 86d1380..5e5370f 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -721,7 +721,7 @@ git bisect good 3de952f2416b6084f557ec417709eac740c6818c
 # first bad commit: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.
 EOF
 
-test_expect_success 'bisect log: successfull result' '
+test_expect_success 'bisect log: successful result' '
 	git bisect reset &&
 	git bisect start $HASH4 $HASH2 &&
 	git bisect good &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4a2570e..e365d1f 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -292,8 +292,8 @@ test_expect_success 'setup submodule' '
 	echo content >file &&
 	git add file &&
 	git commit -m "added sub and file" &&
-	mkdir -p deep/directory/hierachy &&
-	git submodule add ./. deep/directory/hierachy/sub &&
+	mkdir -p deep/directory/hierarchy &&
+	git submodule add ./. deep/directory/hierarchy/sub &&
 	git commit -m "added another submodule" &&
 	git branch submodule
 '
@@ -485,8 +485,8 @@ test_expect_success 'moving a submodule in nested directories' '
 		# git status would fail if the update of linking git dir to
 		# work dir of the submodule failed.
 		git status &&
-		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
-		echo "directory/hierachy/sub" >../expect
+		git config -f ../.gitmodules submodule.deep/directory/hierarchy/sub.path >../actual &&
+		echo "directory/hierarchy/sub" >../expect
 	) &&
 	test_cmp actual expect
 '
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index cf3f9ec..de2405c 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -581,7 +581,7 @@ test_expect_success 'log grep (9)' '
 '
 
 test_expect_success 'log grep (9)' '
-	git log -g --grep-reflog="commit: third" --author="non-existant" --pretty=tformat:%s >actual &&
+	git log -g --grep-reflog="commit: third" --author="non-existent" --pretty=tformat:%s >actual &&
 	: >expect &&
 	test_cmp expect actual
 '
diff --git a/t/t9401-git-cvsserver-crlf.sh b/t/t9401-git-cvsserver-crlf.sh
index f324b9f..84787ee 100755
--- a/t/t9401-git-cvsserver-crlf.sh
+++ b/t/t9401-git-cvsserver-crlf.sh
@@ -154,7 +154,7 @@ test_expect_success 'adding files' '
     echo "more text" > src.c &&
     GIT_CONFIG="$git_config" cvs -Q add src.c >cvs.log 2>&1 &&
     marked_as . src.c "" &&
-    echo "psuedo-binary" > temp.bin
+    echo "pseudo-binary" > temp.bin
     ) &&
     GIT_CONFIG="$git_config" cvs -Q add subdir/temp.bin >cvs.log 2>&1 &&
     marked_as subdir temp.bin "-kb" &&
diff --git a/upload-pack.c b/upload-pack.c
index d4cc414..ca7f941 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -836,7 +836,7 @@ int cmd_main(int argc, const char **argv)
 		OPT_BOOL(0, "stateless-rpc", &stateless_rpc,
 			 N_("quit after a single request/response exchange")),
 		OPT_BOOL(0, "advertise-refs", &advertise_refs,
-			 N_("exit immediately after intial ref advertisement")),
+			 N_("exit immediately after initial ref advertisement")),
 		OPT_BOOL(0, "strict", &strict,
 			 N_("do not try <directory>/.git/ if <directory> is no Git directory")),
 		OPT_INTEGER(0, "timeout", &timeout,
-- 
2.5.5


^ permalink raw reply related	[relevance 6%]

* Re: [PATCH] git mv: do not keep slash in `git mv dir non-existing-dir/`
  2016-08-05 15:58  6%   ` Johannes Schindelin
@ 2016-08-05 16:18  0%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-08-05 16:18 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git

Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:

> Please note that t7001 *specifically* tests for the opposite of what you
> want, then ;-)

Yes, I know.  I am torn.

It seems "mv A B/" (not "git mv") when B does not exist does the
same "wrong" thing, so the existing behaviour is at least consistent
with the command line tools on Linux, and more importantly, existing
users of "git mv A B/" have expected it to ignore the trailing
slash for a long time, so let's not change the expected behaviour.

Thanks.








^ permalink raw reply	[relevance 0%]

* Re: [PATCH] git mv: do not keep slash in `git mv dir non-existing-dir/`
  @ 2016-08-05 15:58  6%   ` Johannes Schindelin
  2016-08-05 16:18  0%     ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Johannes Schindelin @ 2016-08-05 15:58 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Hi Junio,

On Fri, 5 Aug 2016, Junio C Hamano wrote:

> Johannes Schindelin <johannes.schindelin@gmx.de> writes:
> 
> > When calling `rename("dir", "non-existing-dir/")` on Linux, it silently
> > succeeds, stripping the trailing slash of the second argument.
> >
> > This is all good and dandy but this behavior disagrees with the specs at
> >
> > http://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html
> >
> > that state clearly regarding the 2nd parameter (called `new`):
> >
> > 	If the `new` argument does not resolve to an existing directory
> > 	entry for a file of type directory and the `new` argument
> > 	contains at least one non- <slash> character and ends with one
> > 	or more trailing <slash> characters after all symbolic links
> > 	have been processed, `rename()` shall fail.
> 
> I agree with all of the above.  But
> 
> > Of course, we would like `git mv dir non-existing-dir/` to succeed (and
> > rename the directory "dir" to "non-existing-dir").
> 
> I do not think I want that.  When I say "mv A B/", I want it to fail
> if I made a typo for B; the trailing slash after B is an explicit
> statement "I expect B to exist and I want A to appear at B/A".

Please note that t7001 *specifically* tests for the opposite of what you
want, then ;-)

	https://github.com/git/git/blob/v2.9.2/t/t7001-mv.sh#L79-L80

> Current Git behaviour on Linux seems to allow "git mv dir no-such-dir/"
> but "dir" is renamed to "no-such-dir", which fails two expectations,
> and I think this is broken.  If Windows port does not share this
> breakage, that is a good thing.  We should fix Git behaviour on Linux
> instead, I would think.

To be precise, Git for Windows displays the same behavior as Git on Linux,
because rename("dir", "no-such-dir/") succeeds.

The breakage fixed by this here patch happens when running plain Linux Git
in "Bash on Windows" (i.e. Bash on Ubuntu on Windows, the new Linux
subsystem of Windows, allowing to run unmodified Linux binaries on Windows
without the need for a Virtual Machine).

Ciao,
Dscho

^ permalink raw reply	[relevance 6%]

* [PATCH] git mv: do not keep slash in `git mv dir non-existing-dir/`
@ 2016-08-05 14:41  4% Johannes Schindelin
    0 siblings, 1 reply; 200+ results
From: Johannes Schindelin @ 2016-08-05 14:41 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano

When calling `rename("dir", "non-existing-dir/")` on Linux, it silently
succeeds, stripping the trailing slash of the second argument.

This is all good and dandy but this behavior disagrees with the specs at

http://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html

that state clearly regarding the 2nd parameter (called `new`):

	If the `new` argument does not resolve to an existing directory
	entry for a file of type directory and the `new` argument
	contains at least one non- <slash> character and ends with one
	or more trailing <slash> characters after all symbolic links
	have been processed, `rename()` shall fail.

Of course, we would like `git mv dir non-existing-dir/` to succeed (and
rename the directory "dir" to "non-existing-dir"). Let's be extra
careful to remove the trailing slash in that case.

This lets t7001-mv.sh pass in Bash on Windows.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---

	There is unfortunately another problem with Git running in Bash on
	Windows: the credential cache daemon somehow gets stuck. I guess
	this is some timing issue, in more than one way: right now, I do
	not really have time to pursue this further.

Published-As: https://github.com/dscho/git/releases/tag/bash-on-windows-v1
Fetch-It-Via: git fetch https://github.com/dscho/git bash-on-windows-v1

 builtin/mv.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index a201426..446a316 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -104,7 +104,7 @@ static int index_range_of_same_dir(const char *src, int length,
 
 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
-	int i, gitmodules_modified = 0;
+	int i, flags, gitmodules_modified = 0;
 	int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
 	struct option builtin_mv_options[] = {
 		OPT__VERBOSE(&verbose, N_("be verbose")),
@@ -134,10 +134,13 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	modes = xcalloc(argc, sizeof(enum update_mode));
 	/*
 	 * Keep trailing slash, needed to let
-	 * "git mv file no-such-dir/" error out.
+	 * "git mv file no-such-dir/" error out, except in the case
+	 * "git mv directory no-such-dir/".
 	 */
-	dest_path = internal_copy_pathspec(prefix, argv + argc, 1,
-					   KEEP_TRAILING_SLASH);
+	flags = KEEP_TRAILING_SLASH;
+	if (argc == 1 && is_directory(argv[0]) && !is_directory(argv[1]))
+		flags = 0;
+	dest_path = internal_copy_pathspec(prefix, argv + argc, 1, flags);
 	submodule_gitfile = xcalloc(argc, sizeof(char *));
 
 	if (dest_path[0][0] == '\0')
-- 
2.9.0.281.g286a8d9

base-commit: c6b0597e9ac7277e148e2fd4d7615ac6e0bfb661

^ permalink raw reply related	[relevance 4%]

* [PATCHv2] submodule: test moving recursive submodule
@ 2016-06-28 18:24 12% Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2016-06-28 18:24 UTC (permalink / raw)
  To: bartbogaerts; +Cc: git, Stefan Beller

This reproduces the error as pointed out in [1], but the fix is not easy,
so punt on it for now and just document what needs to be done.

[1] http://stackoverflow.com/questions/32782382/git-moving-submodules-recursively-nested-submodules

Signed-off-by: Stefan Beller <sbeller@google.com>
---

  Bart,
  
  I don't have the time fixing this properly,
  so this is the best I can come up with for now. 
  
  Thanks,
  Stefan

 builtin/mv.c  |  4 ++++
 t/t7001-mv.sh | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/builtin/mv.c b/builtin/mv.c
index a201426..36dd2fd 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -264,6 +264,10 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
 			if (!update_path_in_gitmodules(src, dst))
 				gitmodules_modified = 1;
+			/**
+			 * NEEDSWORK: We need to recurse into the submodule
+			 * and fix the nested submodules as well.
+			 */
 		}
 
 		if (mode == WORKING_DIRECTORY)
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4a2570e..fe933f1 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -295,6 +295,28 @@ test_expect_success 'setup submodule' '
 	mkdir -p deep/directory/hierachy &&
 	git submodule add ./. deep/directory/hierachy/sub &&
 	git commit -m "added another submodule" &&
+	mkdir inner_sub &&
+	(
+		cd inner_sub &&
+		git init &&
+		test_commit initial
+	) &&
+	mkdir outer_sub &&
+	(
+		cd outer_sub &&
+		git init &&
+		test_commit initial &&
+		git submodule add ../inner_sub &&
+		git commit -a -m "add an inner submodule"
+	) &&
+	git submodule add ./outer_sub ./deep/outer_sub &&
+	git commit -a -m "add outer sub" &&
+	git -C deep ls-tree HEAD |cut -f 2 >actual &&
+	cat >expect <<-EOF &&
+	directory
+	outer_sub
+	EOF
+	test_cmp expect actual &&
 	git branch submodule
 '
 
@@ -488,6 +510,18 @@ test_expect_success 'moving a submodule in nested directories' '
 		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
 		echo "directory/hierachy/sub" >../expect
 	) &&
+	test_cmp actual expect &&
+	git commit -a -m "mv a submodule in nested dir"
+'
+
+test_expect_failure 'moving a submodule with a nested submodule' '
+	git submodule update --init --recursive &&
+	git mv deep/outer_sub outer_sub_moved &&
+	# git status would fail if the update of linking git dir to
+	# work dir of the submodule failed.
+	git status &&
+	git config -f .gitmodules submodule.deep/outer_sub.path >actual &&
+	echo "outer_sub_moved" >expect &&
 	test_cmp actual expect
 '
 
-- 
2.9.0.138.g8a4fcb8.dirty


^ permalink raw reply related	[relevance 12%]

* Re: [PATCH] submodule: test moving recursive submodule
  2016-06-28  6:13  0% ` Bart Bogaerts
@ 2016-06-28  6:28  0%   ` Bart Bogaerts
  0 siblings, 0 replies; 200+ results
From: Bart Bogaerts @ 2016-06-28  6:28 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git

I dit some more testing.

It is important for the bug to occur that all submodules are initialised.
So my suggestion is not yet complete, you need to add the line

git submodule update --recursive --init




Below is a complete script that show the bug occurring:



mkdir repo1 &&
mkdir repo2 &&

(
  cd repo1 &&
  git init &&
  echo "test" >> test.test &&
  git add . &&
  git commit -m "initial commit"
) &&

(
  cd repo2 &&
  git init &&
  git submodule add ../repo1 &&
  git commit -a -m "added submod"
) &&

#create the directory to test in
(
  mkdir testdir &&
  cd testdir &&
  git init &&
  git submodule add ../repo2 &&
  git commit -m "added full structure" &&
  #important to initialise .git files!
  git submodule update --recursive --init
) &&

(
  cd testdir &&
  mkdir 2015 &&
  git mv repo2 2015 &&
  git status
)

2016-06-28 9:13 GMT+03:00 Bart Bogaerts <bartbogaerts@gmail.com>:
> The only thing I still see that might cause the bug is that there is no
>
> git submodule update --recursive
>
> present in your test cases .
> This command creates the .git file in the nested subsubmodule
> It is that .git file that is not correctly updated in the move.
>
> So after the line
> +       git submodule add ./outer_sub ./deep/outer_sub &&
> I would add
> +       git submodule update -- recursive &&
>
> 2016-06-28 3:15 GMT+03:00 Stefan Beller <sbeller@google.com>:
>> Signed-off-by: Stefan Beller <sbeller@google.com>
>> ---
>> This tries to reproduce the error as pointed out in
>> http://stackoverflow.com/questions/32782382/git-moving-submodules-recursively-nested-submodules
>> but the tests pass. This still seems to be missing a detail.
>>
>> Bart any idea how this setup may be different than what you have?
>> Instead of applying the patch, you can also checkout
>> https://github.com/stefanbeller/git/tree/submodule_recursive_mv_test
>> which is the patch below applied on top of Junios (the maintainer) master branch.
>> To look around on the filesystem, you can drop "test_pause &&" in a test and
>> then run the test with `(cd t && ./t7001-mv.sh -v)` (more info how to run tests
>> in the Git test suite in t/README, maybe -i -v -x are interested)
>>
>> Thanks,
>> Stefan
>>
>>  t/t7001-mv.sh | 43 +++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 43 insertions(+)
>>
>> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
>> index 4a2570e..404e5bd 100755
>> --- a/t/t7001-mv.sh
>> +++ b/t/t7001-mv.sh
>> @@ -295,6 +295,28 @@ test_expect_success 'setup submodule' '
>>         mkdir -p deep/directory/hierachy &&
>>         git submodule add ./. deep/directory/hierachy/sub &&
>>         git commit -m "added another submodule" &&
>> +       mkdir inner_sub &&
>> +       (
>> +               cd inner_sub &&
>> +               git init &&
>> +               test_commit initial
>> +       ) &&
>> +       mkdir outer_sub &&
>> +       (
>> +               cd outer_sub &&
>> +               git init &&
>> +               test_commit initial &&
>> +               git submodule add ../inner_sub &&
>> +               git commit -a -m "add an inner submodule"
>> +       ) &&
>> +       git submodule add ./outer_sub ./deep/outer_sub &&
>> +       git commit -a -m "add outer sub" &&
>> +       git -C deep ls-tree HEAD |cut -f 2 >actual &&
>> +       cat >expect <<-EOF &&
>> +       directory
>> +       outer_sub
>> +       EOF
>> +       test_cmp expect actual &&
>>         git branch submodule
>>  '
>>
>> @@ -488,6 +510,27 @@ test_expect_success 'moving a submodule in nested directories' '
>>                 git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
>>                 echo "directory/hierachy/sub" >../expect
>>         ) &&
>> +       test_cmp actual expect &&
>> +       git commit -a -m "mv a submodule in nested dir"
>> +'
>> +
>> +test_expect_success 'moving a submodule with a nested submodule' '
>> +       git mv deep/outer_sub outer_sub_moved &&
>> +       # git status would fail if the update of linking git dir to
>> +       # work dir of the submodule failed.
>> +       git status &&
>> +       git config -f .gitmodules submodule.deep/outer_sub.path >actual &&
>> +       echo "outer_sub_moved" >expect &&
>> +       test_cmp actual expect
>> +'
>> +
>> +test_expect_success 'moving back the submodule with a nested submodule' '
>> +       git mv outer_sub_moved deep/outer_sub &&
>> +       # git status would fail if the update of linking git dir to
>> +       # work dir of the submodule failed.
>> +       git status &&
>> +       git config -f .gitmodules submodule.deep/outer_sub.path >actual &&
>> +       echo "deep/outer_sub" >expect &&
>>         test_cmp actual expect
>>  '
>>
>> --
>> 2.9.0.4.g35eb263.dirty
>>
>
>
>
> --
> Bart Bogaerts



-- 
Bart Bogaerts

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] submodule: test moving recursive submodule
  2016-06-28  0:15 12% [PATCH] submodule: test moving recursive submodule Stefan Beller
@ 2016-06-28  6:13  0% ` Bart Bogaerts
  2016-06-28  6:28  0%   ` Bart Bogaerts
  0 siblings, 1 reply; 200+ results
From: Bart Bogaerts @ 2016-06-28  6:13 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git

The only thing I still see that might cause the bug is that there is no

git submodule update --recursive

present in your test cases .
This command creates the .git file in the nested subsubmodule
It is that .git file that is not correctly updated in the move.

So after the line
+       git submodule add ./outer_sub ./deep/outer_sub &&
I would add
+       git submodule update -- recursive &&

2016-06-28 3:15 GMT+03:00 Stefan Beller <sbeller@google.com>:
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
> This tries to reproduce the error as pointed out in
> http://stackoverflow.com/questions/32782382/git-moving-submodules-recursively-nested-submodules
> but the tests pass. This still seems to be missing a detail.
>
> Bart any idea how this setup may be different than what you have?
> Instead of applying the patch, you can also checkout
> https://github.com/stefanbeller/git/tree/submodule_recursive_mv_test
> which is the patch below applied on top of Junios (the maintainer) master branch.
> To look around on the filesystem, you can drop "test_pause &&" in a test and
> then run the test with `(cd t && ./t7001-mv.sh -v)` (more info how to run tests
> in the Git test suite in t/README, maybe -i -v -x are interested)
>
> Thanks,
> Stefan
>
>  t/t7001-mv.sh | 43 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 43 insertions(+)
>
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index 4a2570e..404e5bd 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -295,6 +295,28 @@ test_expect_success 'setup submodule' '
>         mkdir -p deep/directory/hierachy &&
>         git submodule add ./. deep/directory/hierachy/sub &&
>         git commit -m "added another submodule" &&
> +       mkdir inner_sub &&
> +       (
> +               cd inner_sub &&
> +               git init &&
> +               test_commit initial
> +       ) &&
> +       mkdir outer_sub &&
> +       (
> +               cd outer_sub &&
> +               git init &&
> +               test_commit initial &&
> +               git submodule add ../inner_sub &&
> +               git commit -a -m "add an inner submodule"
> +       ) &&
> +       git submodule add ./outer_sub ./deep/outer_sub &&
> +       git commit -a -m "add outer sub" &&
> +       git -C deep ls-tree HEAD |cut -f 2 >actual &&
> +       cat >expect <<-EOF &&
> +       directory
> +       outer_sub
> +       EOF
> +       test_cmp expect actual &&
>         git branch submodule
>  '
>
> @@ -488,6 +510,27 @@ test_expect_success 'moving a submodule in nested directories' '
>                 git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
>                 echo "directory/hierachy/sub" >../expect
>         ) &&
> +       test_cmp actual expect &&
> +       git commit -a -m "mv a submodule in nested dir"
> +'
> +
> +test_expect_success 'moving a submodule with a nested submodule' '
> +       git mv deep/outer_sub outer_sub_moved &&
> +       # git status would fail if the update of linking git dir to
> +       # work dir of the submodule failed.
> +       git status &&
> +       git config -f .gitmodules submodule.deep/outer_sub.path >actual &&
> +       echo "outer_sub_moved" >expect &&
> +       test_cmp actual expect
> +'
> +
> +test_expect_success 'moving back the submodule with a nested submodule' '
> +       git mv outer_sub_moved deep/outer_sub &&
> +       # git status would fail if the update of linking git dir to
> +       # work dir of the submodule failed.
> +       git status &&
> +       git config -f .gitmodules submodule.deep/outer_sub.path >actual &&
> +       echo "deep/outer_sub" >expect &&
>         test_cmp actual expect
>  '
>
> --
> 2.9.0.4.g35eb263.dirty
>



-- 
Bart Bogaerts

^ permalink raw reply	[relevance 0%]

* [PATCH] submodule: test moving recursive submodule
@ 2016-06-28  0:15 12% Stefan Beller
  2016-06-28  6:13  0% ` Bart Bogaerts
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2016-06-28  0:15 UTC (permalink / raw)
  To: bartbogaerts; +Cc: git, Stefan Beller

Signed-off-by: Stefan Beller <sbeller@google.com>
---
This tries to reproduce the error as pointed out in
http://stackoverflow.com/questions/32782382/git-moving-submodules-recursively-nested-submodules
but the tests pass. This still seems to be missing a detail.

Bart any idea how this setup may be different than what you have?
Instead of applying the patch, you can also checkout 
https://github.com/stefanbeller/git/tree/submodule_recursive_mv_test
which is the patch below applied on top of Junios (the maintainer) master branch.
To look around on the filesystem, you can drop "test_pause &&" in a test and
then run the test with `(cd t && ./t7001-mv.sh -v)` (more info how to run tests
in the Git test suite in t/README, maybe -i -v -x are interested)

Thanks,
Stefan

 t/t7001-mv.sh | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4a2570e..404e5bd 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -295,6 +295,28 @@ test_expect_success 'setup submodule' '
 	mkdir -p deep/directory/hierachy &&
 	git submodule add ./. deep/directory/hierachy/sub &&
 	git commit -m "added another submodule" &&
+	mkdir inner_sub &&
+	(
+		cd inner_sub &&
+		git init &&
+		test_commit initial
+	) &&
+	mkdir outer_sub &&
+	(
+		cd outer_sub &&
+		git init &&
+		test_commit initial &&
+		git submodule add ../inner_sub &&
+		git commit -a -m "add an inner submodule"
+	) &&
+	git submodule add ./outer_sub ./deep/outer_sub &&
+	git commit -a -m "add outer sub" &&
+	git -C deep ls-tree HEAD |cut -f 2 >actual &&
+	cat >expect <<-EOF &&
+	directory
+	outer_sub
+	EOF
+	test_cmp expect actual &&
 	git branch submodule
 '
 
@@ -488,6 +510,27 @@ test_expect_success 'moving a submodule in nested directories' '
 		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
 		echo "directory/hierachy/sub" >../expect
 	) &&
+	test_cmp actual expect &&
+	git commit -a -m "mv a submodule in nested dir"
+'
+
+test_expect_success 'moving a submodule with a nested submodule' '
+	git mv deep/outer_sub outer_sub_moved &&
+	# git status would fail if the update of linking git dir to
+	# work dir of the submodule failed.
+	git status &&
+	git config -f .gitmodules submodule.deep/outer_sub.path >actual &&
+	echo "outer_sub_moved" >expect &&
+	test_cmp actual expect
+'
+
+test_expect_success 'moving back the submodule with a nested submodule' '
+	git mv outer_sub_moved deep/outer_sub &&
+	# git status would fail if the update of linking git dir to
+	# work dir of the submodule failed.
+	git status &&
+	git config -f .gitmodules submodule.deep/outer_sub.path >actual &&
+	echo "deep/outer_sub" >expect &&
 	test_cmp actual expect
 '
 
-- 
2.9.0.4.g35eb263.dirty


^ permalink raw reply related	[relevance 12%]

* [PATCH] mv: allow moving nested submodules
@ 2016-04-19 18:32 11% Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2016-04-19 18:32 UTC (permalink / raw)
  To: gitster; +Cc: git, Jens.Lehmann, gmane, Stefan Beller

When directories are moved using `git mv` all files in the directory
have been just moved, but no further action was taken on them. This
was done by assigning the mode = WORKING_DIRECTORY to the files
inside a moved directory.

submodules however need to update their link to the git directory as
well as updates to the .gitmodules file. By removing the condition of
`mode != INDEX` (the remaining modes are BOTH and WORKING_DIRECTORY) for
the required submodule actions, we perform these for submodules in a
moved directory.

Signed-off-by: Stefan Beller <sbeller@google.com>
---

> Can you do only the 2/2 on top of maint (or maint-2.6) for now then?

This is developed on maint-2.6.

 builtin/mv.c  | 22 +++++++++++++---------
 t/t7001-mv.sh | 16 ++++++++++++++++
 2 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index d1d4316..77f3ec5 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -251,15 +251,19 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		int pos;
 		if (show_only || verbose)
 			printf(_("Renaming %s to %s\n"), src, dst);
-		if (!show_only && mode != INDEX) {
-			if (rename(src, dst) < 0 && !ignore_errors)
-				die_errno(_("renaming '%s' failed"), src);
-			if (submodule_gitfile[i]) {
-				if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
-					connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
-				if (!update_path_in_gitmodules(src, dst))
-					gitmodules_modified = 1;
-			}
+		if (show_only)
+			continue;
+		if (mode != INDEX &&
+		    rename(src, dst) < 0) {
+			if (ignore_errors)
+				continue;
+			die_errno(_("renaming '%s' failed"), src);
+		}
+		if (submodule_gitfile[i]) {
+			if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
+				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+			if (!update_path_in_gitmodules(src, dst))
+				gitmodules_modified = 1;
 		}
 
 		if (mode == WORKING_DIRECTORY)
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 7b56081..fcfc953 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
 	echo content >file &&
 	git add file &&
 	git commit -m "added sub and file" &&
+	mkdir -p deep/directory/hierachy &&
+	git submodule add ./. deep/directory/hierachy/sub &&
+	git commit -m "added another submodule" &&
 	git branch submodule
 '
 
@@ -475,4 +478,17 @@ test_expect_success 'mv -k does not accidentally destroy submodules' '
 	git checkout .
 '
 
+test_expect_success 'moving a submodule in nested directories' '
+	(
+		cd deep &&
+		git mv directory ../ &&
+		# git status would fail if the update of linking git dir to
+		# work dir of the submodule failed.
+		git status &&
+		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
+		echo "directory/hierachy/sub" >../expect
+	) &&
+	test_cmp actual expect
+'
+
 test_done
-- 
2.6.6.dirty

^ permalink raw reply related	[relevance 11%]

* Re: [PATCH 2/2] mv: allow moving nested submodules
  2016-04-18 23:41 11% ` [PATCH 2/2] " Stefan Beller
@ 2016-04-19  7:13  0%   ` Jacob Keller
  0 siblings, 0 replies; 200+ results
From: Jacob Keller @ 2016-04-19  7:13 UTC (permalink / raw)
  To: Stefan Beller; +Cc: Git mailing list, Junio C Hamano, Jens Lehmann, gmane

On Mon, Apr 18, 2016 at 4:41 PM, Stefan Beller <sbeller@google.com> wrote:
> When directories are moved using `git mv` all files in the directory
> have been just moved, but no further action was taken on them. This
> was done by assigning the mode = WORKING_DIRECTORY to the files
> inside a moved directory.
>
> submodules however need to update their link to the git directory as
> well as updates to the .gitmodules file. By removing the condition of
> `mode != INDEX` (the remaining modes are BOTH and WORKING_DIRECTORY) for
> the required submodule actions, we perform these for submodules in a
> moved directory.
>
> Signed-off-by: Stefan Beller <sbeller@google.com>


The patch looks good to me. I've marked some comments that I thought
through while reviewing but it looks correct.

> ---
>  builtin/mv.c  | 39 ++++++++++++++++++++++-----------------
>  t/t7001-mv.sh | 16 ++++++++++++++++
>  2 files changed, 38 insertions(+), 17 deletions(-)
>
> diff --git a/builtin/mv.c b/builtin/mv.c
> index 74516f4..2deb95b 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -253,23 +253,28 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>                 int pos;
>                 if (show_only || verbose)
>                         printf(_("Renaming %s to %s\n"), src, dst);
> -               if (!show_only && mode != INDEX) {
> -                       if (rename(src, dst) < 0 && !ignore_errors)
> -                               die_errno(_("renaming '%s' failed"), src);
> -                       if (submodule_gitfile[i]) {
> -                               if ((submodule_gitfile[i] != SUBMODULE_WITH_GITDIR &&
> -                                   connect_work_tree_and_git_dir(dst, submodule_gitfile[i], &err)) ||
> -                                   update_path_in_gitmodules(src, dst, &err)) {
> -                                       if (err.len) {
> -                                               if (ignore_errors) {
> -                                                       warning("%s", err.buf);
> -                                                       continue;
> -                                               } else
> -                                                       die("%s", err.buf);
> -                                       }
> -                               } else
> -                                       gitmodules_modified = 1;
> -                       }
> +               if (show_only)
> +                       continue;

So here, we skip the item after displaying when we're in show only
mode. That seems correct.

> +               if (mode != INDEX &&
> +                   rename(src, dst) < 0) {
> +                       if (ignore_errors)
> +                               continue;
> +                       die_errno(_("renaming '%s' failed"), src);
> +               }

Then when the mode isn't INDEX, we attempt the rename.

> +
> +               if (submodule_gitfile[i]) {
> +                       if ((submodule_gitfile[i] != SUBMODULE_WITH_GITDIR &&
> +                           connect_work_tree_and_git_dir(dst, submodule_gitfile[i], &err)) ||
> +                           update_path_in_gitmodules(src, dst, &err)) {
> +                               if (err.len) {
> +                                       if (ignore_errors) {
> +                                               warning("%s", err.buf);
> +                                               continue;
> +                                       } else
> +                                               die("%s", err.buf);
> +                               }
> +                       } else
> +                               gitmodules_modified = 1;
>                 }

Finally for all modes, we perform the steps for submodules. That makes
sense to me.
>

This version results in a much larger diff, but I think the resulting
code is much easier to follow. The use of the continue allows us to
drop a layer of indentation making the remaining code a bit easier on
the eyes. The patch description doesn't at first glance match the code
change, since now it's a much larger chunk of moved code. However on
inspection, I don't think anything needs to change, as it's just the
conversion to if (show_only) { continue; }

Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>

Thanks,
Jake

^ permalink raw reply	[relevance 0%]

* [PATCH 2/2] mv: allow moving nested submodules
  2016-04-18 23:41  5% [PATCH 0/2] WAS: " Stefan Beller
@ 2016-04-18 23:41 11% ` Stefan Beller
  2016-04-19  7:13  0%   ` Jacob Keller
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2016-04-18 23:41 UTC (permalink / raw)
  To: git; +Cc: gitster, Jens.Lehmann, gmane, Stefan Beller

When directories are moved using `git mv` all files in the directory
have been just moved, but no further action was taken on them. This
was done by assigning the mode = WORKING_DIRECTORY to the files
inside a moved directory.

submodules however need to update their link to the git directory as
well as updates to the .gitmodules file. By removing the condition of
`mode != INDEX` (the remaining modes are BOTH and WORKING_DIRECTORY) for
the required submodule actions, we perform these for submodules in a
moved directory.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 builtin/mv.c  | 39 ++++++++++++++++++++++-----------------
 t/t7001-mv.sh | 16 ++++++++++++++++
 2 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 74516f4..2deb95b 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -253,23 +253,28 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		int pos;
 		if (show_only || verbose)
 			printf(_("Renaming %s to %s\n"), src, dst);
-		if (!show_only && mode != INDEX) {
-			if (rename(src, dst) < 0 && !ignore_errors)
-				die_errno(_("renaming '%s' failed"), src);
-			if (submodule_gitfile[i]) {
-				if ((submodule_gitfile[i] != SUBMODULE_WITH_GITDIR &&
-				    connect_work_tree_and_git_dir(dst, submodule_gitfile[i], &err)) ||
-				    update_path_in_gitmodules(src, dst, &err)) {
-					if (err.len) {
-						if (ignore_errors) {
-							warning("%s", err.buf);
-							continue;
-						} else
-							die("%s", err.buf);
-					}
-				} else
-					gitmodules_modified = 1;
-			}
+		if (show_only)
+			continue;
+		if (mode != INDEX &&
+		    rename(src, dst) < 0) {
+			if (ignore_errors)
+				continue;
+			die_errno(_("renaming '%s' failed"), src);
+		}
+
+		if (submodule_gitfile[i]) {
+			if ((submodule_gitfile[i] != SUBMODULE_WITH_GITDIR &&
+			    connect_work_tree_and_git_dir(dst, submodule_gitfile[i], &err)) ||
+			    update_path_in_gitmodules(src, dst, &err)) {
+				if (err.len) {
+					if (ignore_errors) {
+						warning("%s", err.buf);
+						continue;
+					} else
+						die("%s", err.buf);
+				}
+			} else
+				gitmodules_modified = 1;
 		}
 
 		if (mode == WORKING_DIRECTORY)
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4008fae..4a2570e 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
 	echo content >file &&
 	git add file &&
 	git commit -m "added sub and file" &&
+	mkdir -p deep/directory/hierachy &&
+	git submodule add ./. deep/directory/hierachy/sub &&
+	git commit -m "added another submodule" &&
 	git branch submodule
 '
 
@@ -475,4 +478,17 @@ test_expect_success 'mv -k does not accidentally destroy submodules' '
 	git checkout .
 '
 
+test_expect_success 'moving a submodule in nested directories' '
+	(
+		cd deep &&
+		git mv directory ../ &&
+		# git status would fail if the update of linking git dir to
+		# work dir of the submodule failed.
+		git status &&
+		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
+		echo "directory/hierachy/sub" >../expect
+	) &&
+	test_cmp actual expect
+'
+
 test_done
-- 
2.8.1.211.g24879d1

^ permalink raw reply related	[relevance 11%]

* [PATCH 0/2] WAS: [PATCH] mv: allow moving nested submodules
@ 2016-04-18 23:41  5% Stefan Beller
  2016-04-18 23:41 11% ` [PATCH 2/2] " Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2016-04-18 23:41 UTC (permalink / raw)
  To: git; +Cc: gitster, Jens.Lehmann, gmane, Stefan Beller

A single patch evolves into a series.
The second patch is essentially a resend with Junios suggestion squashed[1].

That patch alone doesn't quite fix it yet, as we need to make sure the
submodule code respects the ignore_errors flag as instructed by the user.
Patch 1 libifies the used functions from submodule.c and handles the errors
appropriately.

[1] http://thread.gmane.org/gmane.comp.version-control.git/291810/focus=291829

Thanks,
Stefan

Stefan Beller (2):
  mv submodule: respect ignore_errors for errors in submodule code
  mv: allow moving nested submodules

 builtin/mv.c  | 32 +++++++++++++++++++++++---------
 submodule.c   | 33 ++++++++++++++++++++++++---------
 submodule.h   |  6 ++++--
 t/t7001-mv.sh | 16 ++++++++++++++++
 4 files changed, 67 insertions(+), 20 deletions(-)

-- 
2.8.1.211.g24879d1

^ permalink raw reply	[relevance 5%]

* Re: [PATCH] mv: allow moving nested submodules
  2016-04-18 16:54 12% Stefan Beller
@ 2016-04-18 20:54  0% ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-04-18 20:54 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git, Jens.Lehmann, gmane

Stefan Beller <sbeller@google.com> writes:

>  		if (show_only || verbose)
>  			printf(_("Renaming %s to %s\n"), src, dst);
> -		if (!show_only && mode != INDEX) {
> -			if (rename(src, dst) < 0 && !ignore_errors)
> +		if (!show_only) {
> +			if (mode != INDEX &&
> +			    rename(src, dst) < 0 &&
> +			    !ignore_errors)
>  				die_errno(_("renaming '%s' failed"), src);
> +

If ignore-errors is set and rename fails, this would fall through
and try to touch this codepath...

>  			if (submodule_gitfile[i]) {
>  				if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
>  					connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);

... but I am not sure if this thing is prepared to cope with such a
case?  src should have been moved to dst but if rename() failed we
wouldn't see what we expect at dst, or would we?

> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index 4008fae..4a2570e 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
>  	echo content >file &&
>  	git add file &&
>  	git commit -m "added sub and file" &&
> +	mkdir -p deep/directory/hierachy &&
> +	git submodule add ./. deep/directory/hierachy/sub &&
> +	git commit -m "added another submodule" &&
>  	git branch submodule
>  '
>  
> @@ -475,4 +478,17 @@ test_expect_success 'mv -k does not accidentally destroy submodules' '
>  	git checkout .
>  '
>  
> +test_expect_success 'moving a submodule in nested directories' '
> +	(
> +		cd deep &&
> +		git mv directory ../ &&
> +		# git status would fail if the update of linking git dir to
> +		# work dir of the submodule failed.
> +		git status &&
> +		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
> +		echo "directory/hierachy/sub" >../expect
> +	) &&
> +	test_cmp actual expect
> +'
> +
>  test_done

^ permalink raw reply	[relevance 0%]

* [PATCH] mv: allow moving nested submodules
@ 2016-04-18 16:54 12% Stefan Beller
  2016-04-18 20:54  0% ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2016-04-18 16:54 UTC (permalink / raw)
  To: git, gitster; +Cc: Jens.Lehmann, gmane, Stefan Beller

When directories are moved using `git mv` all files in the directory
have been just moved, but no further action was taken on them. This
was done by assigning the mode = WORKING_DIRECTORY to the files
inside a moved directory.

submodules however need to update their link to the git directory as
well as updates to the .gitmodules file. By removing the condition of
`mode != INDEX` (the remaining modes are BOTH and WORKING_DIRECTORY) for
the required submodule actions, we perform these for submodules in a
moved directory.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 builtin/mv.c  |  7 +++++--
 t/t7001-mv.sh | 16 ++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index aeae855..65fff11 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -252,9 +252,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		int pos;
 		if (show_only || verbose)
 			printf(_("Renaming %s to %s\n"), src, dst);
-		if (!show_only && mode != INDEX) {
-			if (rename(src, dst) < 0 && !ignore_errors)
+		if (!show_only) {
+			if (mode != INDEX &&
+			    rename(src, dst) < 0 &&
+			    !ignore_errors)
 				die_errno(_("renaming '%s' failed"), src);
+
 			if (submodule_gitfile[i]) {
 				if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
 					connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4008fae..4a2570e 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
 	echo content >file &&
 	git add file &&
 	git commit -m "added sub and file" &&
+	mkdir -p deep/directory/hierachy &&
+	git submodule add ./. deep/directory/hierachy/sub &&
+	git commit -m "added another submodule" &&
 	git branch submodule
 '
 
@@ -475,4 +478,17 @@ test_expect_success 'mv -k does not accidentally destroy submodules' '
 	git checkout .
 '
 
+test_expect_success 'moving a submodule in nested directories' '
+	(
+		cd deep &&
+		git mv directory ../ &&
+		# git status would fail if the update of linking git dir to
+		# work dir of the submodule failed.
+		git status &&
+		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
+		echo "directory/hierachy/sub" >../expect
+	) &&
+	test_cmp actual expect
+'
+
 test_done
-- 
2.8.0.26.gba39a1b.dirty

^ permalink raw reply related	[relevance 12%]

* [PATCH] mv: allow moving nested submodules
  2016-04-15 18:24  0%       ` Stefan Beller
@ 2016-04-15 19:11 11%         ` Stefan Beller
  0 siblings, 0 replies; 200+ results
From: Stefan Beller @ 2016-04-15 19:11 UTC (permalink / raw)
  To: gitster; +Cc: git, Jens.Lehmann, gmane, Stefan Beller

When directories are moved using `git mv` all files in the directory
have been just moved, but no further action was taken on them. This
was done by assigning the mode = WORKING_DIRECTORY to the files
inside a moved directory.

submodules however need to update their link to the git directory as
well as updates to the .gitmodules file. By removing the condition of
`mode != INDEX` (the remaining modes are BOTH and WORKING_DIRECTORY) for
the required submodule actions, we perform these for submodules in a
moved directory.

Signed-off-by: Stefan Beller <sbeller@google.com>
---

Albin,
I think this would fix your problem.

Developed on origin/master (it may apply on older versions, though I did not test)

Thanks,
Stefan

 builtin/mv.c  |  7 +++++--
 t/t7001-mv.sh | 16 ++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index aeae855..65fff11 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -252,9 +252,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		int pos;
 		if (show_only || verbose)
 			printf(_("Renaming %s to %s\n"), src, dst);
-		if (!show_only && mode != INDEX) {
-			if (rename(src, dst) < 0 && !ignore_errors)
+		if (!show_only) {
+			if (mode != INDEX &&
+			    rename(src, dst) < 0 &&
+			    !ignore_errors)
 				die_errno(_("renaming '%s' failed"), src);
+
 			if (submodule_gitfile[i]) {
 				if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
 					connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4008fae..4a2570e 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
 	echo content >file &&
 	git add file &&
 	git commit -m "added sub and file" &&
+	mkdir -p deep/directory/hierachy &&
+	git submodule add ./. deep/directory/hierachy/sub &&
+	git commit -m "added another submodule" &&
 	git branch submodule
 '
 
@@ -475,4 +478,17 @@ test_expect_success 'mv -k does not accidentally destroy submodules' '
 	git checkout .
 '
 
+test_expect_success 'moving a submodule in nested directories' '
+	(
+		cd deep &&
+		git mv directory ../ &&
+		# git status would fail if the update of linking git dir to
+		# work dir of the submodule failed.
+		git status &&
+		git config -f ../.gitmodules submodule.deep/directory/hierachy/sub.path >../actual &&
+		echo "directory/hierachy/sub" >../expect
+	) &&
+	test_cmp actual expect
+'
+
 test_done
-- 
2.8.1.211.g630c034

^ permalink raw reply related	[relevance 11%]

* Re: 'git mv' doesn't move submodule if it's in a subdirectory
  2016-04-15 18:21  0%     ` Junio C Hamano
@ 2016-04-15 18:24  0%       ` Stefan Beller
  2016-04-15 19:11 11%         ` [PATCH] mv: allow moving nested submodules Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2016-04-15 18:24 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Jens Lehmann, Albin Otterhäll, git@vger.kernel.org

On Fri, Apr 15, 2016 at 11:21 AM, Junio C Hamano <gitster@pobox.com> wrote:
> Stefan Beller <sbeller@google.com> writes:
>
>> I think I can reproduce the problem. A regression test (which currently fails)
>> could look like
>
> Thanks.  I however do not think this is a regression.
>
> Changes around 0656781f (mv: update the path entry in .gitmodules
> for moved submodules, 2013-08-06) did introduce "git mv dir1 dir2"
> when 'dir1' is a submodule, but I do not think it went beyond that.
> I do not see any effort to treat a submodule that is discovered by
> scanning a directory that was given from the command line,
> i.e. prepare_move_submodule() is not called for them, and the
> entries in the submodule_gitfile[] array that correspond to them are
> explicitly set to NULL in the loop.

Also I just realize this is not exactly the same bug as reported.
Albin complains about the .gitmodules file not being adjusted, whereas
the test case I wrote breaks commands in your superproject, i.e. `git status`
or `git diff` just dies.

(Manually inspecting the .gitmodules file turns out it is not adjusted as well.)

>
>
>> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
>> index 4008fae..3b96a9a 100755
>> --- a/t/t7001-mv.sh
>> +++ b/t/t7001-mv.sh
>> @@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
>>         echo content >file &&
>>         git add file &&
>>         git commit -m "added sub and file" &&
>> +       mkdir -p deep/directory/hierachy &&
>> +       git submodule add ./. deep/directory/hierachy/sub &&
>> +       git commit -m "added another submodule" &&
>>         git branch submodule
>>  '
>>
>> @@ -475,4 +478,14 @@ test_expect_success 'mv -k does not accidentally
>> destroy submodules' '
>>         git checkout .
>>  '
>>
>> +test_expect_failure 'moving a submodule in nested directories' '
>> +       (
>> +               cd deep &&
>> +               git mv directory ../ &&
>> +               git status
>> +               # currently git status exits with 128
>> +               # fatal: Not a git repository:
>> directory/hierachy/sub/../../../../.git/modules/deep/directory/hierachy/sub
>> +       )
>> +'
>> +
>>  test_done

^ permalink raw reply	[relevance 0%]

* Re: 'git mv' doesn't move submodule if it's in a subdirectory
  2016-04-15 17:59 14%   ` Stefan Beller
@ 2016-04-15 18:21  0%     ` Junio C Hamano
  2016-04-15 18:24  0%       ` Stefan Beller
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2016-04-15 18:21 UTC (permalink / raw)
  To: Stefan Beller, Jens Lehmann; +Cc: Albin Otterhäll, git@vger.kernel.org

Stefan Beller <sbeller@google.com> writes:

> I think I can reproduce the problem. A regression test (which currently fails)
> could look like

Thanks.  I however do not think this is a regression.

Changes around 0656781f (mv: update the path entry in .gitmodules
for moved submodules, 2013-08-06) did introduce "git mv dir1 dir2"
when 'dir1' is a submodule, but I do not think it went beyond that.
I do not see any effort to treat a submodule that is discovered by
scanning a directory that was given from the command line,
i.e. prepare_move_submodule() is not called for them, and the
entries in the submodule_gitfile[] array that correspond to them are
explicitly set to NULL in the loop.


> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index 4008fae..3b96a9a 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
>         echo content >file &&
>         git add file &&
>         git commit -m "added sub and file" &&
> +       mkdir -p deep/directory/hierachy &&
> +       git submodule add ./. deep/directory/hierachy/sub &&
> +       git commit -m "added another submodule" &&
>         git branch submodule
>  '
>
> @@ -475,4 +478,14 @@ test_expect_success 'mv -k does not accidentally
> destroy submodules' '
>         git checkout .
>  '
>
> +test_expect_failure 'moving a submodule in nested directories' '
> +       (
> +               cd deep &&
> +               git mv directory ../ &&
> +               git status
> +               # currently git status exits with 128
> +               # fatal: Not a git repository:
> directory/hierachy/sub/../../../../.git/modules/deep/directory/hierachy/sub
> +       )
> +'
> +
>  test_done

^ permalink raw reply	[relevance 0%]

* Re: 'git mv' doesn't move submodule if it's in a subdirectory
  @ 2016-04-15 17:59 14%   ` Stefan Beller
  2016-04-15 18:21  0%     ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Stefan Beller @ 2016-04-15 17:59 UTC (permalink / raw)
  To: Albin Otterhäll; +Cc: git@vger.kernel.org

On Fri, Apr 15, 2016 at 10:18 AM, Stefan Beller <sbeller@google.com> wrote:
> On Fri, Apr 15, 2016 at 1:14 AM, Albin Otterhäll <gmane@otterhall.com> wrote:
>> I've a submodule located in a subdirectory
>> ({git_rep}/home/{directory}/{submodule}), and I wanted to move the whole
>> directory up a level ({git_rep}/{directory}/{submodule}). But when I
>> used 'git mv {directory} ../' the '.gitmodule' file didn't get modified.
>>
>> Best regards,
>> Albin Otterhäll
>
> Thanks for the bug report!
> Which version of Git do you use? (Did you try different versions?)

I think I can reproduce the problem. A regression test (which currently fails)
could look like
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4008fae..3b96a9a 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
        echo content >file &&
        git add file &&
        git commit -m "added sub and file" &&
+       mkdir -p deep/directory/hierachy &&
+       git submodule add ./. deep/directory/hierachy/sub &&
+       git commit -m "added another submodule" &&
        git branch submodule
 '

@@ -475,4 +478,14 @@ test_expect_success 'mv -k does not accidentally
destroy submodules' '
        git checkout .
 '

+test_expect_failure 'moving a submodule in nested directories' '
+       (
+               cd deep &&
+               git mv directory ../ &&
+               git status
+               # currently git status exits with 128
+               # fatal: Not a git repository:
directory/hierachy/sub/../../../../.git/modules/deep/directory/hierachy/sub
+       )
+'
+
 test_done

^ permalink raw reply related	[relevance 14%]

* [ANNOUNCE] Git v2.8.0
@ 2016-03-28 22:42  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-03-28 22:42 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

The latest feature release Git v2.8.0 is now available at the
usual places.  It is comprised of 532 non-merge commits since
v2.7.0, contributed by 74 people, 22 of which are new faces.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/

The following public repositories all have a copy of the 'v2.8.0'
tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.7.0 are as follows.
Welcome to the Git development community!

  마누엘, Adam Dinwoodie, Andrew Wheeler, Changwoo Ryu,
  Christoph Egger, Christoph Hoopmann, Dan Aloni, Dave Ware, David
  A. Wheeler, Dickson Wong, Felipe Gonçalves Assis, GyuYong Jung,
  Jon Griffiths, Kazutoshi Satoda, Lars Vogel, Martin Amdisen,
  Matthew Kraai, Paul Wagland, Rob Mayoff, Romain Picard, Vasco
  Almeida, and Victor Leschuk.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alexander Kuleshov, Alexander Shopov, Alex Henrie, Audric
  Schiltknecht, brian m. carlson, Carlos Martín Nieto, Christian
  Couder, David A. Greene, David Turner, Dennis Kaarsemaker,
  Dimitriy Ryazantcev, Edmundo Carmona Antoranz, Elia Pinto,
  Eric Sunshine, Eric Wong, Guillermo S. Romero, Jacob Keller,
  Jean-Noel Avila, Jeff King, Jiang Xin, Johannes Schindelin,
  Johannes Sixt, John Keeping, Jonathan Nieder, Junio C Hamano,
  Karsten Blees, Karthik Nayak, Knut Franke, Lars Schneider,
  Matthieu Moy, Matt McCutchen, Michael J Gruber, Mike Hommey,
  Nguyễn Thái Ngọc Duy, Øyvind A. Holm, Patrick Steinhardt,
  Pat Thoyts, Peter Krefting, Ralf Thielow, Ray Chen, Sebastian
  Schuberth, Shawn O. Pearce, Stefan Beller, Stephen P. Smith,
  SZEDER Gábor, Thomas Ackermann, Thomas Braun, Thomas Gummerer,
  Tobias Klauser, Torsten Bögershausen, Trần Ngọc Quân,
  and Will Palmer.

----------------------------------------------------------------

Git 2.8 Release Notes
=====================

Backward compatibility note
---------------------------

The rsync:// transport has been removed.


Updates since v2.7
------------------

UI, Workflows & Features

 * It turns out "git clone" over rsync transport has been broken when
   the source repository has packed references for a long time, and
   nobody noticed nor complained about it.

 * "push" learned that its "--delete" option can be shortened to
   "-d", just like "branch --delete" and "branch -d" are the same
   thing.

 * "git blame" learned to produce the progress eye-candy when it takes
   too much time before emitting the first line of the result.

 * "git grep" can now be configured (or told from the command line)
   how many threads to use when searching in the working tree files.

 * Some "git notes" operations, e.g. "git log --notes=<note>", should
   be able to read notes from any tree-ish that is shaped like a notes
   tree, but the notes infrastructure required that the argument must
   be a ref under refs/notes/.  Loosen it to require a valid ref only
   when the operation would update the notes (in which case we must
   have a place to store the updated notes tree, iow, a ref).

 * "git grep" by default does not fall back to its "--no-index"
   behavior outside a directory under Git's control (otherwise the
   user may by mistake end up running a huge recursive search); with a
   new configuration (set in $HOME/.gitconfig--by definition this
   cannot be set in the config file per project), this safety can be
   disabled.

 * "git pull --rebase" has been extended to allow invoking
   "rebase -i".

 * "git p4" learned to cope with the type of a file getting changed.

 * "git format-patch" learned to notice format.outputDirectory
   configuration variable.  This allows "-o <dir>" option to be
   omitted on the command line if you always use the same directory in
   your workflow.

 * "interpret-trailers" has been taught to optionally update a file in
   place, instead of always writing the result to the standard output.

 * Many commands that read files that are expected to contain text
   that is generated (or can be edited) by the end user to control
   their behavior (e.g. "git grep -f <filename>") have been updated
   to be more tolerant to lines that are terminated with CRLF (they
   used to treat such a line to contain payload that ends with CR,
   which is usually not what the users expect).

 * "git notes merge" used to limit the source of the merged notes tree
   to somewhere under refs/notes/ hierarchy, which was too limiting
   when inventing a workflow to exchange notes with remote
   repositories using remote-tracking notes trees (located in e.g.
   refs/remote-notes/ or somesuch).

 * "git ls-files" learned a new "--eol" option to help diagnose
   end-of-line problems.

 * "ls-remote" learned an option to show which branch the remote
   repository advertises as its primary by pointing its HEAD at.

 * New http.proxyAuthMethod configuration variable can be used to
   specify what authentication method to use, as a way to work around
   proxies that do not give error response expected by libcurl when
   CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
   has been taught to use credential API to store the authentication
   material in user's keyrings.

 * Update the untracked cache subsystem and change its primary UI from
   "git update-index" to "git config".

 * There were a few "now I am doing this thing" progress messages in
   the TCP connection code that can be triggered by setting a verbose
   option internally in the code, but "git fetch -v" and friends never
   passed the verbose option down to that codepath.

 * Clean/smudge filters defined in a configuration file of lower
   precedence can now be overridden to be a pass-through no-op by
   setting the variable to an empty string.

 * A new "<branch>^{/!-<pattern>}" notation can be used to name a
   commit that is reachable from <branch> that does not match the
   given <pattern>.

 * The "user.useConfigOnly" configuration variable can be used to
   force the user to always set user.email & user.name configuration
   variables, serving as a reminder for those who work on multiple
   projects and do not want to put these in their $HOME/.gitconfig.

 * "git fetch" and friends that make network connections can now be
   told to only use ipv4 (or ipv6).

 * Some authentication methods do not need username or password, but
   libcurl needs some hint that it needs to perform authentication.
   Supplying an empty username and password string is a valid way to
   do so, but you can set the http.[<url>.]emptyAuth configuration
   variable to achieve the same, if you find it cleaner.

 * You can now set http.[<url>.]pinnedpubkey to specify the pinned
   public key when building with recent enough versions of libcURL.

 * The configuration system has been taught to phrase where it found a
   bad configuration variable in a better way in its error messages.
   "git config" learnt a new "--show-origin" option to indicate where
   the values come from.

 * The "credential-cache" daemon process used to run in whatever
   directory it happened to start in, but this made umount(2)ing the
   filesystem that houses the repository harder; now the process
   chdir()s to the directory that house its own socket on startup.

 * When "git submodule update" did not result in fetching the commit
   object in the submodule that is referenced by the superproject, the
   command learned to retry another fetch, specifically asking for
   that commit that may not be connected to the refs it usually
   fetches.

 * "git merge-recursive" learned "--no-renames" option to disable its
   rename detection logic.

 * Across the transition at around Git version 2.0, the user used to
   get a pretty loud warning when running "git push" without setting
   push.default configuration variable.  We no longer warn because the
   transition was completed a long time ago.

 * README has been renamed to README.md and its contents got tweaked
   slightly to make it easier on the eyes.


Performance, Internal Implementation, Development Support etc.

 * Add a framework to spawn a group of processes in parallel, and use
   it to run "git fetch --recurse-submodules" in parallel.

 * A slight update to the Makefile to mark ".PHONY" targets as such
   correctly.

 * In-core storage of the reverse index for .pack files (which lets
   you go from a pack offset to an object name) has been streamlined.

 * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
   $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
   handling by overwriting GIT_WORK_TREE environment variable to
   affect subprocesses when set_git_work_tree() gets called, which
   resulted in a rather unpleasant regression to "clone" and "init".
   Try to address the same issue by always restoring the environment
   and respawning the real underlying command when handling alias.

 * The low-level code that is used to create symbolic references has
   been updated to share more code with the code that deals with
   normal references.

 * strbuf_getline() and friends have been redefined to make it easier
   to identify which callsite of (new) strbuf_getline_lf() should
   allow and silently ignore carriage-return at the end of the line to
   help users on DOSsy systems.

 * "git shortlog" used to accumulate various pieces of information
   regardless of what was asked to be shown in the final output.  It
   has been optimized by noticing what need not to be collected
   (e.g. there is no need to collect the log messages when showing
   only the number of changes).

 * "git checkout $branch" (and other operations that share the same
   underlying machinery) has been optimized.

 * Automated tests in Travis CI environment has been optimized by
   persisting runtime statistics of previous "prove" run, executing
   tests that take longer before other ones; this reduces the total
   wallclock time.

 * Test scripts have been updated to remove assumptions that are not
   portable between Git for POSIX and Git for Windows, or to skip ones
   with expectations that are not satisfiable on Git for Windows.

 * Some calls to strcpy(3) triggers a false warning from static
   analyzers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in a couple of protrams that are already safe
   has been rewritten to avoid false warnings.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat.  The API has been removed and its users have been
   rewritten to simplify the overall code complexity.

 * Help those who debug http(s) part of the system.
   (merge 0054045 sp/remote-curl-ssl-strerror later to maint).

 * The internal API to interact with "remote.*" configuration
   variables has been streamlined.

 * The ref-filter's format-parsing code has been refactored, in
   preparation for "branch --format" and friends.

 * Traditionally, the tests that try commands that work on the
   contents in the working tree were named with "worktree" in their
   filenames, but with the recent addition of "git worktree"
   subcommand, whose tests are also named similarly, it has become
   harder to tell them apart.  The traditional tests have been renamed
   to use "work-tree" instead in an attempt to differentiate them.
   (merge 5549029 mg/work-tree-tests later to maint).

 * Many codepaths forget to check return value from git_config_set();
   the function is made to die() to make sure we do not proceed when
   setting a configuration variable failed.
   (merge 3d18064 ps/config-error later to maint).

 * Handling of errors while writing into our internal asynchronous
   process has been made more robust, which reduces flakiness in our
   tests.
   (merge 43f3afc jk/epipe-in-async later to maint).

 * There is a new DEVELOPER knob that enables many compiler warning
   options in the Makefile.

 * The way the test scripts configure the Apache web server has been
   updated to work also for Apache 2.4 running on RedHat derived
   distros.

 * Out of maintenance gcc on OSX 10.6 fails to compile the code in
   'master'; work it around by using clang by default on the platform.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat, in many cases.  The API has been removed and its
   users have been rewritten to simplify the overall code complexity.
   This incidentally also closes some heap-corruption holes.

 * Recent versions of GNU grep is pickier than before to decide if a
   file is "binary" and refuse to give line-oriented hits when we
   expect it to, unless explicitly told with "-a" option.  As our
   scripted Porcelains use sane_grep wrapper for line-oriented data,
   even when the line may contain non-ASCII payload we took from
   end-user data, use "grep -a" to implement sane_grep wrapper when
   using an implementation of "grep" that takes the "-a" option.



Also contains various documentation updates and code clean-ups.


Fixes since v2.7
----------------

Unless otherwise noted, all the fixes since v2.7 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * An earlier change in 2.5.x-era broke users' hooks and aliases by
   exporting GIT_WORK_TREE to point at the root of the working tree,
   interfering when they tried to use a different working tree without
   setting GIT_WORK_TREE environment themselves.

 * The "exclude_list" structure has the usual "alloc, nr" pair of
   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
   array.

 * Paths that have been told the index about with "add -N" are not
   quite yet in the index, but a few commands behaved as if they
   already are in a harmful way.

 * "git send-email" was confused by escaped quotes stored in the alias
   files saved by "mutt", which has been corrected.

 * A few non-portable C construct have been spotted by clang compiler
   and have been fixed.

 * The documentation has been updated to hint the connection between
   the '--signoff' option and DCO.

 * "git reflog" incorrectly assumed that all objects that used to be
   at the tip of a ref must be commits, which caused it to segfault.

 * The ignore mechanism saw a few regressions around untracked file
   listing and sparse checkout selection areas in 2.7.0; the change
   that is responsible for the regression has been reverted.

 * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
   done.  This however did not work well if the repository is set to
   be shared with core.sharedRepository and the umask of the previous
   user is tighter.  They have been made to work better by calling
   unlink(2) and retrying after fopen(3) fails with EPERM.

 * Asking gitweb for a nonexistent commit left a warning in the server
   log.

   Somebody may want to follow this up with an additional test, perhaps?
   IIRC, we do test that no Perl warnings are given to the server log,
   so this should have been caught if our test coverage were good.

 * "git rebase", unlike all other callers of "gc --auto", did not
   ignore the exit code from "gc --auto".

 * Many codepaths that run "gc --auto" before exiting kept packfiles
   mapped and left the file descriptors to them open, which was not
   friendly to systems that cannot remove files that are open.  They
   now close the packs before doing so.

 * A recent optimization to filter-branch in v2.7.0 introduced a
   regression when --prune-empty filter is used, which has been
   corrected.

 * The description for SANITY prerequisite the test suite uses has
   been clarified both in the comment and in the implementation.

 * "git tag" started listing a tag "foo" as "tags/foo" when a branch
   named "foo" exists in the same repository; remove this unnecessary
   disambiguation, which is a regression introduced in v2.7.0.

 * The way "git svn" uses auth parameter was broken by Subversion
   1.9.0 and later.

 * The "split" subcommand of "git subtree" (in contrib/) incorrectly
   skipped merges when it shouldn't, which was corrected.

 * A few options of "git diff" did not work well when the command was
   run from a subdirectory.

 * The command line completion learned a handful of additional options
   and command specific syntax.

 * dirname() emulation has been added, as Msys2 lacks it.

 * The underlying machinery used by "ls-files -o" and other commands
   has been taught not to create empty submodule ref cache for a
   directory that is not a submodule.  This removes a ton of wasted
   CPU cycles.

 * "git worktree" had a broken code that attempted to auto-fix
   possible inconsistency that results from end-users moving a
   worktree to different places without telling Git (the original
   repository needs to maintain back-pointers to its worktrees,
   but "mv" run by end-users who are not familiar with that fact
   will obviously not adjust them), which actually made things
   worse when triggered.

 * The low-level merge machinery has been taught to use CRLF line
   termination when inserting conflict markers to merged contents that
   are themselves CRLF line-terminated.

 * "git push --force-with-lease" has been taught to report if the push
   needed to force (or fast-forwarded).

 * The emulated "yes" command used in our test scripts has been
   tweaked not to spend too much time generating unnecessary output
   that is not used, to help those who test on Windows where it would
   not stop until it fills the pipe buffer due to lack of SIGPIPE.

 * The documentation for "git clean" has been corrected; it mentioned
   that .git/modules/* are removed by giving two "-f", which has never
   been the case.

 * The vimdiff backend for "git mergetool" has been tweaked to arrange
   and number buffers in the order that would match the expectation of
   majority of people who read left to right, then top down and assign
   buffers 1 2 3 4 "mentally" to local base remote merge windows based
   on that order.

 * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
   rev, i.e. the object named by the the pathname with wildcard
   characters in a tree object.
   (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint).

 * "git rev-parse --git-common-dir" used in the worktree feature
   misbehaved when run from a subdirectory.
   (merge 17f1365 nd/git-common-dir-fix later to maint).

 * "git worktree add -B <branchname>" did not work.

 * The "v(iew)" subcommand of the interactive "git am -i" command was
   broken in 2.6.0 timeframe when the command was rewritten in C.
   (merge 708b8cc jc/am-i-v-fix later to maint).

 * "git merge-tree" used to mishandle "both sides added" conflict with
   its own "create a fake ancestor file that has the common parts of
   what both sides have added and do a 3-way merge" logic; this has
   been updated to use the usual "3-way merge with an empty blob as
   the fake common ancestor file" approach used in the rest of the
   system.
   (merge 907681e jk/no-diff-emit-common later to maint).

 * The memory ownership rule of fill_textconv() API, which was a bit
   tricky, has been documented a bit better.
   (merge a64e6a4 jk/more-comments-on-textconv later to maint).

 * Update various codepaths to avoid manually-counted malloc().
   (merge 08c95df jk/tighten-alloc later to maint).

 * The documentation did not clearly state that the 'simple' mode is
   now the default for "git push" when push.default configuration is
   not set.
   (merge f6b1fb3 mm/push-simple-doc later to maint).

 * Recent versions of GNU grep are pickier when their input contains
   arbitrary binary data, which some of our tests uses.  Rewrite the
   tests to sidestep the problem.
   (merge 3b1442d jk/grep-binary-workaround-in-test later to maint).

 * A helper function "git submodule" uses since v2.7.0 to list the
   modules that match the pathspec argument given to its subcommands
   (e.g. "submodule add <repo> <path>") has been fixed.
   (merge 2b56bb7 sb/submodule-module-list-fix later to maint).

 * "git config section.var value" to set a value in per-repository
   configuration file failed when it was run outside any repository,
   but didn't say the reason correctly.
   (merge 638fa62 js/config-set-in-non-repository later to maint).

 * The code to read the pack data using the offsets stored in the pack
   idx file has been made more carefully check the validity of the
   data in the idx.
   (merge 7465feb jk/pack-idx-corruption-safety later to maint).

 * Other minor clean-ups and documentation updates
   (merge f459823 ak/extract-argv0-last-dir-sep later to maint).
   (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint).
   (merge 4867f11 ps/plug-xdl-merge-leak later to maint).
   (merge 4938686 dt/initial-ref-xn-commit-doc later to maint).
   (merge 9537f21 ma/update-hooks-sample-typofix later to maint).

----------------------------------------------------------------

Changes since v2.7.0 are as follows:

Adam Dinwoodie (1):
      t9117: test specifying full url to git svn init -T

Alex Henrie (2):
      stripspace: call U+0020 a "space" instead of a "blank"
      l10n: ca.po: update translation

Alexander Kuleshov (3):
      format-patch: introduce format.outputDirectory configuration
      exec_cmd.c: use find_last_dir_sep() for code simplification
      git.c: simplify stripping extension of a file in handle_builtin()

Alexander Shopov (1):
      gitk: Update Bulgarian translation (311t)

Andrew Wheeler (1):
      push: fix ref status reporting for --force-with-lease

Audric Schiltknecht (1):
      l10n: fr.po: Correct case in sentence

Carlos Martín Nieto (1):
      Disown ssh+git and git+ssh

Changwoo Ryu (4):
      l10n: ko.po: Add Korean translation
      l10n: ko.po: Update Korean translation
      l10n: ko: Update Korean translation
      l10n: ko.po: Update Korean translation

Christian Couder (11):
      dir: free untracked cache when removing it
      update-index: use enum for untracked cache options
      update-index: add --test-untracked-cache
      update-index: add untracked cache notifications
      update-index: move 'uc' var declaration
      dir: add {new,add}_untracked_cache()
      dir: add remove_untracked_cache()
      dir: simplify untracked cache "ident" field
      config: add core.untrackedCache
      test-dump-untracked-cache: don't modify the untracked cache
      t7063: add tests for core.untrackedCache

Christoph Egger (1):
      http: implement public key pinning

Christoph Hoopmann (1):
      l10n: de.po: fix typo

Dan Aloni (1):
      ident: add user.useConfigOnly boolean for when ident shouldn't be guessed

Dave Ware (1):
      contrib/subtree: fix "subtree split" skipped-merge bug

David A. Greene (1):
      contrib/subtree: Make testing easier

David A. Wheeler (1):
      Expand documentation describing --signoff

David Turner (3):
      do_compare_entry: use already-computed path
      unpack-trees: fix accidentally quadratic behavior
      refs: document transaction semantics

Dennis Kaarsemaker (1):
      reflog-walk: don't segfault on non-commit sha1's in the reflog

Dickson Wong (1):
      mergetool: reorder vim/gvim buffers in three-way diffs

Dimitriy Ryazantcev (3):
      l10n: ru.po: update Russian translation
      l10n: ru.po: update Russian translation
      l10n: ru.po: update Russian translation

Edmundo Carmona Antoranz (1):
      blame: add support for --[no-]progress option

Elia Pinto (92):
      Makefile: add missing phony target
      contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
      contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
      git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
      t/lib-httpd.sh: use the $( ... ) construct for command substitution
      test-sha1.sh: use the $( ... ) construct for command substitution
      unimplemented.sh: use the $( ... ) construct for command substitution
      t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
      t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
      t/t1410-reflog.sh: use the $( ... ) construct for command substitution
      t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
      t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
      t/t1700-split-index.sh: use the $( ... ) construct for command substitution
      t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
      t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
      t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
      t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
      t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
      t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
      t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
      t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
      t/t3600-rm.sh: use the $( ... ) construct for command substitution
      t/t3700-add.sh: use the $( ... ) construct for command substitution
      t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
      t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
      t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
      t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
      t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
      t/t5304-prune.sh: use the $( ... ) construct for command substitution
      t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
      t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
      t/t5505-remote.sh: use the $( ... ) construct for command substitution
      t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
      t/t5510-fetch.sh: use the $( ... ) construct for command substitution
      t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
      t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
      t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
      t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
      t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
      t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
      t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
      t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
      t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
      t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
      t/t5601-clone.sh: use the $( ... ) construct for command substitution
      t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
      t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
      t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
      t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
      t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
      t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
      t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
      t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
      t/t7001-mv.sh: use the $( ... ) construct for command substitution
      t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
      t/t7004-tag.sh: use the $( ... ) construct for command substitution
      t/t7006-pager.sh: use the $( ... ) construct for command substitution
      t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
      t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
      t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
      t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
      t/t7700-repack.sh: use the $( ... ) construct for command substitution
      t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
      t/t9001-send-email.sh: use the $( ... ) construct for command substitution
      t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
      t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
      t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
      t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
      t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
      t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
      t9300-fast-import.sh: use the $( ... ) construct for command substitution
      t9350-fast-export.sh: use the $( ... ) construct for command substitution
      t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
      t9901-git-web--browse.sh: use the $( ... ) construct for command substitution

Eric Sunshine (2):
      git-compat-util: st_add4: work around gcc 4.2.x compiler crash
      Revert "config.mak.uname: use clang for Mac OS X 10.6"

Eric Wong (10):
      git-send-email: do not double-escape quotes from mutt
      for-each-ref: document `creatordate` and `creator` fields
      git-svn: fix auth parameter handling on SVN 1.9.0+
      pass transport verbosity down to git_connect
      connect & http: support -4 and -6 switches for remote operations
      t5570: add tests for "git {clone,fetch,pull} -v"
      git-svn: hoist out utf8 prep from t9129 to lib-git-svn
      tests: remove no-op full-svn-test target
      git-svn: shorten glob error message
      git-svn: fix URL canonicalization during init w/ SVN 1.7+

Felipe Gonçalves Assis (7):
      merge-recursive: option to disable renames
      merge-recursive: more consistent interface
      merge-strategies.txt: fix typo
      merge-recursive: find-renames resets threshold
      t3034: add rename threshold tests
      t3034: test option to disable renames
      t3034: test deprecated interface

Guillermo S. Romero (1):
      gitk: Follow themed bgcolor in help dialogs

GyuYong Jung (1):
      git-cvsserver.perl: fix typo

Jacob Keller (1):
      notes: allow merging from arbitrary references

Jean-Noel Avila (5):
      l10n: fr.po v2.8.0 round 1 2509t
      l10n: fr.po v2.8.0 round 2
      l10n: fr.po v2.8.0 round 3
      gitk: Update French translation (311t)
      gitk: fr.po: Sync translations with git

Jeff King (86):
      pack-revindex: drop hash table
      pack-revindex: store entries directly in packed_git
      create_symref: modernize variable names
      create_symref: use existing ref-lock code
      create_symref: write reflog while holding lock
      run-command: don't warn on SIGPIPE deaths
      avoid shifting signed integers 31 bits
      bswap: add NO_UNALIGNED_LOADS define
      checkout,clone: check return value of create_symref
      lock_ref_sha1_basic: always fill old_oid while holding lock
      lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
      rebase: ignore failures from "gc --auto"
      shortlog: match both "Author:" and "author" on stdin
      shortlog: use strbufs to read from stdin
      shortlog: replace hand-parsing of author with pretty-printer
      shortlog: optimize "--summary" mode
      shortlog: optimize out useless "<none>" normalization
      shortlog: optimize out useless string list
      shortlog: don't warn on empty author
      filter-branch: resolve $commit^{tree} in no-index case
      clean: make is_git_repository a public function
      resolve_gitlink_ref: ignore non-repository paths
      t6300: use test_atom for some un-modern tests
      tag: do not show ambiguous tag names as "tags/foo"
      transport: drop support for git-over-rsync
      give "nbuf" strbuf a more meaningful name
      checkout-index: simplify "-z" option parsing
      checkout-index: handle "--no-prefix" option
      checkout-index: handle "--no-index" option
      checkout-index: disallow "--no-stage" option
      apply, ls-files: simplify "-z" parsing
      fmt_ident: refactor strictness checks
      test-path-utils: use xsnprintf in favor of strcpy
      rerere: replace strcpy with xsnprintf
      checkout: reorder check_filename conditional
      check_filename: tighten dwim-wildcard ambiguity
      get_sha1: don't die() on bogus search strings
      http-push: stop using name_path
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks
      git-config: better document default behavior for `--include`
      ref-filter: use string_list_split over strbuf_split
      reflog_expire_cfg: NUL-terminate pattern field
      add helpers for detecting size_t overflow
      tree-diff: catch integer overflow in combine_diff_path allocation
      diff: clarify textconv interface
      harden REALLOC_ARRAY and xcalloc against size_t overflow
      add helpers for allocating flex-array structs
      argv-array: add detach function
      convert manual allocations to argv_array
      convert trivial cases to ALLOC_ARRAY
      use xmallocz to avoid size arithmetic
      convert trivial cases to FLEX_ARRAY macros
      use st_add and st_mult for allocation size computation
      prepare_{git,shell}_cmd: use argv_array
      write_untracked_extension: use FLEX_ALLOC helper
      fast-import: simplify allocation in start_packfile
      fetch-pack: simplify add_sought_entry
      test-path-utils: fix normalize_path_copy output buffer size
      sequencer: simplify memory allocation of get_message
      git-compat-util: drop mempcpy compat code
      transport_anonymize_url: use xstrfmt
      diff_populate_gitlink: use a strbuf
      convert ewah/bitmap code to use xmalloc
      ewah: convert to REALLOC_ARRAY, etc
      merge-one-file: use empty blob for add/add base
      merge-tree: drop generate_common strategy
      xdiff: drop XDL_EMIT_COMMON
      t5313: test bounds-checks of corrupted/malicious pack/idx files
      nth_packed_object_offset: bounds-check extended offset
      use_pack: handle signed off_t overflow
      write_or_die: handle EPIPE in async threads
      fetch-pack: ignore SIGPIPE in sideband demuxer
      test_must_fail: report number of unexpected signal
      t5504: handle expected output from SIGPIPE death
      compat/mingw: brown paper bag fix for 50a6c8e
      t9700: fix test for perl older than 5.14
      tree-diff: catch integer overflow in combine_diff_path allocation
      http-push: stop using name_path
      add helpers for detecting size_t overflow
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks

Jiang Xin (7):
      l10n: git.pot: v2.8.0 round 1 (48 new, 16 removed)
      http: honor no_http env variable to bypass proxy
      l10n: zh_CN: for git v2.8.0 l10n round 1
      l10n: git.pot: v2.8.0 round 2 (21 new, 1 removed)
      l10n: zh_CN: for git v2.8.0 l10n round 2
      l10n: git.pot: Add one new message for Git 2.8.0
      l10n: zh_CN: for git v2.8.0 l10n round 3

Johannes Schindelin (51):
      commit: allow editing the commit message even in shared repos
      Handle more file writes correctly in shared repos
      Refactor skipping DOS drive prefixes
      compat/basename: make basename() conform to POSIX
      compat/basename.c: provide a dirname() compatibility function
      t0060: verify that basename() and dirname() work as expected
      config.mak.uname: support MSys2
      config.mak.uname: supporting 64-bit MSys2
      fetch: release pack files before garbage-collecting
      am: release pack files before garbage-collecting
      merge: release pack files before garbage-collecting
      receive-pack: release pack files before garbage-collecting
      pull: allow interactive rebase with --rebase=interactive
      remote: handle the config setting branch.*.rebase=interactive
      completion: add missing branch.*.rebase values
      nedmalloc: allow compiling with MSys2's compiler
      compat/mingw: support MSys2-based MinGW build
      compat/winansi: support compiling with MSys2
      t0060: loosen overly strict expectations
      mingw: avoid redefining S_* constants
      mingw: avoid warnings when casting HANDLEs to int
      mingw: squash another warning about a cast
      mingw: uglify (a, 0) definitions to shut up warnings
      mingw: let's use gettext with MSYS2
      mingw: do not trust MSYS2's MinGW gettext.sh
      Git.pm: stop assuming that absolute paths start with a slash
      mingw: prepare the TMPDIR environment variable for shell scripts
      mingw: let lstat() fail with errno == ENOTDIR when appropriate
      merge-file: let conflict markers match end-of-line style of the context
      merge-file: ensure that conflict sections match eol style
      mingw: fix t5601-clone.sh
      mingw: accomodate t0060-path-utils for MSYS2
      mingw: disable mkfifo-based tests
      tests: turn off git-daemon tests if FIFOs are not available
      mingw: skip test in t1508 that fails due to path conversion
      mingw: fix t9700's assumption about directory separators
      mingw: work around pwd issues in the tests
      mingw: mark t9100's test cases with appropriate prereqs
      mingw: avoid illegal filename in t9118
      mingw: handle the missing POSIXPERM prereq in t9124
      mingw: skip a test in t9130 that cannot pass on Windows
      mingw: do not bother to test funny file names
      test-lib: limit the output of the yes utility
      gitignore: ignore generated test-fake-ssh executable
      t5505: 'remote add x y' should work when url.y.insteadOf = x
      git config: report when trying to modify a non-existing repo config
      Mark win32's pthread_exit() as NORETURN
      config --show-origin: report paths with forward slashes
      t1300-repo-config: make it resilient to being run via 'sh -x'
      t1300: fix the new --show-origin tests on Windows
      mingw: skip some tests in t9115 due to file name issues

Johannes Sixt (3):
      t/t5100: no need to use 'echo' command substitutions for globbing
      mingw: avoid linking to the C library's isalpha()
      t0001: fix GIT_* environment variable check under --valgrind

John Keeping (3):
      completion: add missing git-rebase options
      t8005: avoid grep on non-ASCII data
      t9200: avoid grep on non-ASCII data

Jon Griffiths (3):
      credential-cache--daemon: refactor check_socket_directory
      credential-cache--daemon: disallow relative socket path
      credential-cache--daemon: change to the socket dir on startup

Jonathan Nieder (1):
      submodule.c: write "Fetching submodule <foo>" to stderr

Junio C Hamano (59):
      First batch for post 2.7 cycle
      strbuf: miniscule style fix
      strbuf: make strbuf_getline_crlf() global
      strbuf: introduce strbuf_getline_{lf,nul}()
      mktree: there are only two possible line terminations
      check-attr: there are only two possible line terminations
      check-ignore: there are only two possible line terminations
      update-index: there are only two possible line terminations
      checkout-index: there are only two possible line terminations
      strbuf: give strbuf_getline() to the "most text friendly" variant
      hash-object: read --stdin-paths with strbuf_getline()
      revision: read --stdin with strbuf_getline()
      rev-parse: read parseopt spec with strbuf_getline()
      ident.c: read /etc/mailname with strbuf_getline()
      remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
      clone/sha1_file: read info/alternates with strbuf_getline()
      transport-helper: read helper response with strbuf_getline()
      cat-file: read batch stream with strbuf_getline()
      column: read lines with strbuf_getline()
      send-pack: read list of refs with strbuf_getline()
      grep: read -f file with strbuf_getline()
      test-sha1-array: read command stream with strbuf_getline()
      test-lib: clarify and tighten SANITY
      Second batch for 2.8 cycle
      Third batch for 2.8 cycle
      git: remove an early return from save_env_before_alias()
      git: protect against unbalanced calls to {save,restore}_env()
      git: simplify environment save/restore logic
      Fourth batch for 2.8.cycle
      Getting closer to 2.7.1
      restore_env(): free the saved environment variable once we are done
      Fifth batch for 2.8 cycle
      Git 2.7.1
      Sixth batch for the 2.8 cycle
      pager: lose a separate argv[]
      pager: factor out a helper to prepare a child process to run the pager
      am -i: fix "v"iew
      Start preparing for 2.7.2
      Seventh batch for the 2.8 cycle
      Git 2.7.2
      Eighth batch for 2.8
      Git 2.8-rc0
      Git 2.8-rc1
      gitignore: document that unignoring a directory unignores everything in it
      Git 2.7.3
      Git 2.8-rc2
      sane_grep: pass "-a" if grep accepts it
      rebase-i: clarify "is this commit relevant?" test
      RelNotes for 2.8.0: typofix
      Git 2.8-rc3
      Git 2.4.11
      Git 2.5.5
      Git 2.6.6
      Git 2.7.4
      Revert "Merge branch 'jc/exclusion-doc'"
      Revert "Merge branch 'nd/exclusion-regression-fix'"
      RelNotes: remove the mention of !reinclusion
      Git 2.8-rc4
      Git 2.8

Karsten Blees (1):
      mingw: factor out Windows specific environment setup

Karthik Nayak (10):
      ref-filter: bump 'used_atom' and related code to the top
      ref-filter: introduce struct used_atom
      ref-filter: introduce parsing functions for each valid atom
      ref-filter: introduce color_atom_parser()
      ref-filter: introduce parse_align_position()
      ref-filter: introduce align_atom_parser()
      ref-filter: align: introduce long-form syntax
      ref-filter: introduce remote_ref_atom_parser()
      ref-filter: introduce contents_atom_parser()
      ref-filter: introduce objectname_atom_parser()

Kazutoshi Satoda (2):
      git-svn: enable "svn.pathnameencoding" on dcommit
      git-svn: apply "svn.pathnameencoding" before URL encoding

Knut Franke (2):
      http: allow selection of proxy authentication method
      http: use credential API to handle proxy authentication

Lars Schneider (10):
      travis-ci: run previously failed tests first, then slowest to fastest
      travis-ci: explicity use container-based infrastructure
      convert: treat an empty string for clean/smudge filters as "cat"
      t: do not hide Git's exit code in tests using 'nul_to_q'
      rename git_config_from_buf to git_config_from_mem
      config: add 'origin_type' to config_source struct
      config: add '--show-origin' option to print the origin of a config value
      add DEVELOPER makefile knob to check for acknowledged warnings
      Documentation: use ASCII quotation marks in git-p4
      Documentation: fix git-p4 AsciiDoc formatting

Lars Vogel (1):
      git-add doc: do not say working directory when you mean working tree

Martin Amdisen (1):
      templates/hooks: fix minor typo in the sample update-hook

Matt McCutchen (1):
      Documentation/git-clean.txt: don't mention deletion of .git/modules/*

Matthew Kraai (1):
      Documentation: remove unnecessary backslashes

Matthieu Moy (8):
      Documentation/git-push: document that 'simple' is the default
      README: use markdown syntax
      README.md: add hyperlinks on filenames
      README.md: move the link to git-scm.com up
      README.md: don't call git stupid in the title
      README.md: move down historical explanation about the name
      push: remove "push.default is unset" warning message
      Documentation: fix broken linkgit to git-config

Michael J Gruber (5):
      t9100: fix breakage when SHELL_PATH is not /bin/sh
      tests: rename work-tree tests to *work-tree*
      t/lib-httpd: load mod_unixd
      t5510: do not leave changed cwd
      wt-status: allow "ahead " to be picked up by l10n

Mike Hommey (1):
      notes: allow treeish expressions as notes ref

Nguyễn Thái Ngọc Duy (25):
      blame: remove obsolete comment
      add and use a convenience macro ce_intent_to_add()
      Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
      git.c: make it clear save_env() is for alias handling only
      setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
      git.c: make sure we do not leak GIT_* to alias scripts
      grep: make it clear i-t-a entries are ignored
      dir.c: clean the entire struct in clear_exclude_list()
      Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"
      worktree.c: fix indentation
      diff-no-index: do not take a redundant prefix argument
      diff: make -O and --output work in subdirectory
      worktree: stop supporting moving worktrees manually
      rev-parse: take prefix into account in --git-common-dir
      dir.c: fix match_pathname()
      dir.c: support tracing exclude
      dir.c: support marking some patterns already matched
      dir.c: don't exclude whole dir prematurely
      worktree: fix "add -B"
      worktree add -B: do the checkout test before update branch
      sha1_file.c: mark strings for translation
      builtin/checkout.c: mark strings for translation
      builtin/clone.c: mark strings for translation
      ref-filter.c: mark strings for translation
      trailer.c: mark strings for translation

Pat Thoyts (1):
      t0008: avoid absolute path

Patrick Steinhardt (18):
      push: add '--delete' flag to synopsis
      push: add '-d' as shorthand for '--delete'
      config: introduce set_or_die wrappers
      branch: report errors in tracking branch setup
      branch: die on config error when unsetting upstream
      branch: die on config error when editing branch description
      submodule: die on config error when linking modules
      submodule--helper: die on config error when cloning module
      remote: die on config error when setting URL
      remote: die on config error when setting/adding branches
      remote: die on config error when manipulating remotes
      clone: die on config error in cmd_clone
      init-db: die on config errors when initializing empty repo
      sequencer: die on config error when saving replay opts
      compat: die when unable to set core.precomposeunicode
      config: rename git_config_set to git_config_set_gently
      config: rename git_config_set_or_die to git_config_set
      xdiff/xmerge: fix memory leak in xdl_merge

Paul Wagland (2):
      completion: complete show-branch "--date-order"
      completion: update completion arguments for stash

Peter Krefting (3):
      l10n: sv.po: Fix inconsistent translation of "progress meter"
      l10n: sv.po: Update Swedish translation (2509t0f0u)
      l10n: sv.po: Update Swedish translation (2530t0f0u)

Ralf Thielow (8):
      l10n: TEAMS: update Ralf Thielow's email address
      l10n: de.po: add space to abbreviation "z. B."
      l10n: de.po: fix interactive rebase message
      l10n: de.po: translate "command" as "Befehl"
      l10n: de.po: translate 48 new messages
      l10n: de.po: translate 22 new messages
      l10n: de.po: add missing newlines
      gitk: Update German translation

Ray Chen (1):
      l10n: zh_CN: review for git v2.8.0 l10n round 2

Rob Mayoff (1):
      contrib/subtree: unwrap tag refs

Romain Picard (1):
      git-p4.py: add support for filetype change

SZEDER Gábor (2):
      t6050-replace: make failing editor test more robust
      completion: fix mis-indentation in _git_stash()

Sebastian Schuberth (3):
      docs: clarify that passing --depth to git-clone implies --single-branch
      docs: say "commits" in the --depth option wording for git-clone
      docs: clarify that --depth for git-fetch works with newly initialized repos

Shawn O. Pearce (1):
      remote-curl: include curl_errorstr on SSL setup failures

Stefan Beller (11):
      xread: poll on non blocking fds
      strbuf: add strbuf_read_once to read without blocking
      sigchain: add command to pop all common signals
      run-command: add an asynchronous parallel child processor
      fetch_populated_submodules: use new parallel job processing
      submodules: allow parallel fetching, add tests and documentation
      submodule helper list: respect correct path prefix
      submodule: try harder to fetch needed sha1 by direct fetching sha1
      run-command: do not pass child process data into callbacks
      Documentation: reword rebase summary
      submodule: fix regression for deinit without submodules

Stephen P. Smith (4):
      user-manual: remove temporary branch entry from todo list
      glossary: define the term shallow clone
      user-manual: add section documenting shallow clones
      user-manual: add addition gitweb information

Thomas Ackermann (1):
      documentation: fix some typos

Thomas Braun (1):
      completion: complete "diff --word-diff-regex="

Thomas Gummerer (11):
      t7810: correct --no-index test
      builtin/grep: add grep.fallbackToNoIndex config
      ls-remote: document --quiet option
      ls-remote: document --refs option
      ls-remote: fix synopsis
      ls-remote: use parse-options api
      ls-remote: add support for showing symrefs
      remote: use parse_config_key
      remote: simplify remote_is_configured()
      remote: actually check if remote exits
      remote: use remote_is_configured() for add and rename

Tobias Klauser (2):
      trailer: allow to write to files other than stdout
      interpret-trailers: add option for in-place editing

Torsten Bögershausen (9):
      ls-files: add eol diagnostics
      t0027: add tests for get_stream_filter()
      convert.c: remove unused parameter 'path'
      convert.c: remove input_crlf_action()
      convert.c: use text_eol_is_crlf()
      convert.c: refactor crlf_action
      convert.c: simplify text_stat
      convert.c: correct attr_action()
      config.mak.uname: use clang for Mac OS X 10.6

Trần Ngọc Quân (2):
      l10n: vi.po (2509t): Updated Vietnamese translation
      l10n: vi.po (2530t): Update translation

Vasco Almeida (1):
      l10n: pt_PT: Update and add new translations

Victor Leschuk (4):
      grep: allow threading even on a single-core machine
      grep: slight refactoring to the code that disables threading
      grep: add --threads=<num> option and grep.threads configuration
      git-svn: loosen config globs limitations

Will Palmer (2):
      test for '!' handling in rev-parse's named commits
      object name: introduce '^{/!-<negative pattern>}' notation

brian m. carlson (1):
      http: add option to try authentication without username

Øyvind A. Holm (1):
      gitweb: squelch "uninitialized value" warning

마누엘 (1):
      mingw: try to delete target directory before renaming

^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.8.0-rc4
@ 2016-03-21 21:32  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-03-21 21:32 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

A release candidate Git v2.8.0-rc4 is now available for testing
at the usual places.  It is comprised of 521 non-merge commits
since v2.7.0, contributed by 73 people, 21 of which are new faces.

Relative to v2.8.0-rc3, this reverts the change to the gitignore
mechanism (which also is used in a reverse sense to implement the
sparse checkout feature), as the code seemed to be a bit premature
for general consumption (I haven't queued any replacements yet, but
after 2.8 final I do expect the effort to continue).  Also a new
workaround for GCC 4.2 that dies with "internal compiler error" has
been queued, which would help those who compile with that version of
the compiler (including MacOSX 10.6 and FreeBSD 9.x).

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.8.0-rc4' tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.7.0 are as follows.
Welcome to the Git development community!

  마누엘, Adam Dinwoodie, Andrew Wheeler, Changwoo Ryu,
  Christoph Egger, Christoph Hoopmann, Dan Aloni, Dave Ware, David
  A. Wheeler, Dickson Wong, Felipe Gonçalves Assis, GyuYong Jung,
  Jon Griffiths, Kazutoshi Satoda, Lars Vogel, Martin Amdisen,
  Matthew Kraai, Paul Wagland, Rob Mayoff, Romain Picard, and
  Victor Leschuk.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alexander Kuleshov, Alexander Shopov, Alex Henrie, Audric
  Schiltknecht, brian m. carlson, Carlos Martín Nieto, Christian
  Couder, David A. Greene, David Turner, Dennis Kaarsemaker,
  Dimitriy Ryazantcev, Edmundo Carmona Antoranz, Elia Pinto,
  Eric Sunshine, Eric Wong, Guillermo S. Romero, Jacob Keller,
  Jean-Noel Avila, Jeff King, Jiang Xin, Johannes Schindelin,
  Johannes Sixt, John Keeping, Jonathan Nieder, Junio C Hamano,
  Karsten Blees, Karthik Nayak, Knut Franke, Lars Schneider,
  Matthieu Moy, Matt McCutchen, Michael J Gruber, Mike Hommey,
  Nguyễn Thái Ngọc Duy, Øyvind A. Holm, Patrick Steinhardt,
  Pat Thoyts, Peter Krefting, Ralf Thielow, Ray Chen, Sebastian
  Schuberth, Shawn O. Pearce, Stefan Beller, Stephen P. Smith,
  SZEDER Gábor, Thomas Ackermann, Thomas Braun, Thomas Gummerer,
  Tobias Klauser, Torsten Bögershausen, Trần Ngọc Quân,
  and Will Palmer.

----------------------------------------------------------------

Git 2.8 Release Notes (draft)
=============================

Backward compatibility note
---------------------------

The rsync:// transport has been removed.


Updates since v2.7
------------------

UI, Workflows & Features

 * It turns out "git clone" over rsync transport has been broken when
   the source repository has packed references for a long time, and
   nobody noticed nor complained about it.

 * "push" learned that its "--delete" option can be shortened to
   "-d", just like "branch --delete" and "branch -d" are the same
   thing.

 * "git blame" learned to produce the progress eye-candy when it takes
   too much time before emitting the first line of the result.

 * "git grep" can now be configured (or told from the command line)
   how many threads to use when searching in the working tree files.

 * Some "git notes" operations, e.g. "git log --notes=<note>", should
   be able to read notes from any tree-ish that is shaped like a notes
   tree, but the notes infrastructure required that the argument must
   be a ref under refs/notes/.  Loosen it to require a valid ref only
   when the operation would update the notes (in which case we must
   have a place to store the updated notes tree, iow, a ref).

 * "git grep" by default does not fall back to its "--no-index"
   behaviour outside a directory under Git's control (otherwise the
   user may by mistake end up running a huge recursive search); with a
   new configuration (set in $HOME/.gitconfig--by definition this
   cannot be set in the config file per project), this safety can be
   disabled.

 * "git pull --rebase" has been extended to allow invoking
   "rebase -i".

 * "git p4" learned to cope with the type of a file getting changed.

 * "git format-patch" learned to notice format.outputDirectory
   configuration variable.  This allows "-o <dir>" option to be
   omitted on the command line if you always use the same directory in
   your workflow.

 * "interpret-trailers" has been taught to optionally update a file in
   place, instead of always writing the result to the standard output.

 * Many commands that read files that are expected to contain text
   that is generated (or can be edited) by the end user to control
   their behaviour (e.g. "git grep -f <filename>") have been updated
   to be more tolerant to lines that are terminated with CRLF (they
   used to treat such a line to contain payload that ends with CR,
   which is usually not what the users expect).

 * "git notes merge" used to limit the source of the merged notes tree
   to somewhere under refs/notes/ hierarchy, which was too limiting
   when inventing a workflow to exchange notes with remote
   repositories using remote-tracking notes trees (located in e.g.
   refs/remote-notes/ or somesuch).

 * "git ls-files" learned a new "--eol" option to help diagnose
   end-of-line problems.

 * "ls-remote" learned an option to show which branch the remote
   repository advertises as its primary by pointing its HEAD at.

 * New http.proxyAuthMethod configuration variable can be used to
   specify what authentication method to use, as a way to work around
   proxies that do not give error response expected by libcurl when
   CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
   has been taught to use credential API to store the authentication
   material in user's keyrings.

 * Update the untracked cache subsystem and change its primary UI from
   "git update-index" to "git config".

 * There were a few "now I am doing this thing" progress messages in
   the TCP connection code that can be triggered by setting a verbose
   option internally in the code, but "git fetch -v" and friends never
   passed the verbose option down to that codepath.

 * Clean/smudge filters defined in a configuration file of lower
   precedence can now be overridden to be a pass-through no-op by
   setting the variable to an empty string.

 * A new "<branch>^{/!-<pattern>}" notation can be used to name a
   commit that is reachable from <branch> that does not match the
   given <pattern>.

 * The "user.useConfigOnly" configuration variable can be used to
   force the user to always set user.email & user.name configuration
   variables, serving as a reminder for those who work on multiple
   projects and do not want to put these in their $HOME/.gitconfig.

 * "git fetch" and friends that make network connections can now be
   told to only use ipv4 (or ipv6).

 * Some authentication methods do not need username or password, but
   libcurl needs some hint that it needs to perform authentication.
   Supplying an empty username and password string is a valid way to
   do so, but you can set the http.[<url>.]emptyAuth configuration
   variable to achieve the same, if you find it cleaner.

 * You can now set http.[<url>.]pinnedpubkey to specify the pinned
   public key when building with recent enough versions of libcURL.

 * The configuration system has been taught to phrase where it found a
   bad configuration variable in a better way in its error messages.
   "git config" learnt a new "--show-origin" option to indicate where
   the values come from.

 * The "credential-cache" daemon process used to run in whatever
   directory it happened to start in, but this made umount(2)ing the
   filesystem that houses the repository harder; now the process
   chdir()s to the directory that house its own socket on startup.

 * When "git submodule update" did not result in fetching the commit
   object in the submodule that is referenced by the superproject, the
   command learned to retry another fetch, specifically asking for
   that commit that may not be connected to the refs it usually
   fetches.

 * "git merge-recursive" learned "--no-renames" option to disable its
   rename detection logic.

 * Across the transition at around Git version 2.0, the user used to
   get a pretty loud warning when running "git push" without setting
   push.default configuration variable.  We no longer warn because the
   transition was completed a long time ago.

 * README has been renamed to README.md and its contents got tweaked
   slightly to make it easier on the eyes.


Performance, Internal Implementation, Development Support etc.

 * Add a framework to spawn a group of processes in parallel, and use
   it to run "git fetch --recurse-submodules" in parallel.

 * A slight update to the Makefile to mark ".PHONY" targets as such
   correctly.

 * In-core storage of the reverse index for .pack files (which lets
   you go from a pack offset to an object name) has been streamlined.

 * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
   $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
   handling by overwriting GIT_WORK_TREE environment variable to
   affect subprocesses when set_git_work_tree() gets called, which
   resulted in a rather unpleasant regression to "clone" and "init".
   Try to address the same issue by always restoring the environment
   and respawning the real underlying command when handling alias.

 * The low-level code that is used to create symbolic references has
   been updated to share more code with the code that deals with
   normal references.

 * strbuf_getline() and friends have been redefined to make it easier
   to identify which callsite of (new) strbuf_getline_lf() should
   allow and silently ignore carriage-return at the end of the line to
   help users on DOSsy systems.

 * "git shortlog" used to accumulate various pieces of information
   regardless of what was asked to be shown in the final output.  It
   has been optimized by noticing what need not to be collected
   (e.g. there is no need to collect the log messages when showing
   only the number of changes).

 * "git checkout $branch" (and other operations that share the same
   underlying machinery) has been optimized.

 * Automated tests in Travis CI environment has been optimized by
   persisting runtime statistics of previous "prove" run, executing
   tests that take longer before other ones; this reduces the total
   wallclock time.

 * Test scripts have been updated to remove assumptions that are not
   portable between Git for POSIX and Git for Windows, or to skip ones
   with expectations that are not satisfiable on Git for Windows.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in a couple of protrams that are already safe
   has been rewritten to avoid false warnings.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat.  The API has been removed and its users have been
   rewritten to simplify the overall code complexity.

 * Help those who debug http(s) part of the system.
   (merge 0054045 sp/remote-curl-ssl-strerror later to maint).

 * The internal API to interact with "remote.*" configuration
   variables has been streamlined.

 * The ref-filter's format-parsing code has been refactored, in
   preparation for "branch --format" and friends.

 * Traditionally, the tests that try commands that work on the
   contents in the working tree were named with "worktree" in their
   filenames, but with the recent addition of "git worktree"
   subcommand, whose tests are also named similarly, it has become
   harder to tell them apart.  The traditional tests have been renamed
   to use "work-tree" instead in an attempt to differentiate them.
   (merge 5549029 mg/work-tree-tests later to maint).

 * Many codepaths forget to check return value from git_config_set();
   the function is made to die() to make sure we do not proceed when
   setting a configuration variable failed.
   (merge 3d18064 ps/config-error later to maint).

 * Handling of errors while writing into our internal asynchronous
   process has been made more robust, which reduces flakiness in our
   tests.
   (merge 43f3afc jk/epipe-in-async later to maint).

 * There is a new DEVELOPER knob that enables many compiler warning
   options in the Makefile.

 * The way the test scripts configure the Apache web server has been
   updated to work also for Apache 2.4 running on RedHat derived
   distros.

 * Out of maintenance gcc on OSX 10.6 fails to compile the code in
   'master'; work it around by using clang by default on the platform.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat, in many cases.  The API has been removed and its
   users have been rewritten to simplify the overall code complexity.
   This incidentally also closes some heap-corruption holes.

 * Recent versions of GNU grep is pickier than before to decide if a
   file is "binary" and refuse to give line-oriented hits when we
   expect it to, unless explicitly told with "-a" option.  As our
   scripted Porcelains use sane_grep wrapper for line-oriented data,
   even when the line may contain non-ASCII payload we took from
   end-user data, use "grep -a" to implement sane_grep wrapper when
   using an implementation of "grep" that takes the "-a" option.



Also contains various documentation updates and code clean-ups.


Fixes since v2.7
----------------

Unless otherwise noted, all the fixes since v2.7 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * An earlier change in 2.5.x-era broke users' hooks and aliases by
   exporting GIT_WORK_TREE to point at the root of the working tree,
   interfering when they tried to use a different working tree without
   setting GIT_WORK_TREE environment themselves.

 * The "exclude_list" structure has the usual "alloc, nr" pair of
   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
   array.

 * Paths that have been told the index about with "add -N" are not
   quite yet in the index, but a few commands behaved as if they
   already are in a harmful way.

 * "git send-email" was confused by escaped quotes stored in the alias
   files saved by "mutt", which has been corrected.

 * A few unportable C construct have been spotted by clang compiler
   and have been fixed.

 * The documentation has been updated to hint the connection between
   the '--signoff' option and DCO.

 * "git reflog" incorrectly assumed that all objects that used to be
   at the tip of a ref must be commits, which caused it to segfault.

 * The ignore mechanism saw a few regressions around untracked file
   listing and sparse checkout selection areas in 2.7.0; the change
   that is responsible for the regression has been reverted.

 * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
   done.  This however did not work well if the repository is set to
   be shared with core.sharedRepository and the umask of the previous
   user is tighter.  They have been made to work better by calling
   unlink(2) and retrying after fopen(3) fails with EPERM.

 * Asking gitweb for a nonexistent commit left a warning in the server
   log.

   Somebody may want to follow this up with an additional test, perhaps?
   IIRC, we do test that no Perl warnings are given to the server log,
   so this should have been caught if our test coverage were good.

 * "git rebase", unlike all other callers of "gc --auto", did not
   ignore the exit code from "gc --auto".

 * Many codepaths that run "gc --auto" before exiting kept packfiles
   mapped and left the file descriptors to them open, which was not
   friendly to systems that cannot remove files that are open.  They
   now close the packs before doing so.

 * A recent optimization to filter-branch in v2.7.0 introduced a
   regression when --prune-empty filter is used, which has been
   corrected.

 * The description for SANITY prerequisite the test suite uses has
   been clarified both in the comment and in the implementation.

 * "git tag" started listing a tag "foo" as "tags/foo" when a branch
   named "foo" exists in the same repository; remove this unnecessary
   disambiguation, which is a regression introduced in v2.7.0.

 * The way "git svn" uses auth parameter was broken by Subversion
   1.9.0 and later.

 * The "split" subcommand of "git subtree" (in contrib/) incorrectly
   skipped merges when it shouldn't, which was corrected.

 * A few options of "git diff" did not work well when the command was
   run from a subdirectory.

 * The command line completion learned a handful of additional options
   and command specific syntax.

 * dirname() emulation has been added, as Msys2 lacks it.

 * The underlying machinery used by "ls-files -o" and other commands
   has been taught not to create empty submodule ref cache for a
   directory that is not a submodule.  This removes a ton of wasted
   CPU cycles.

 * "git worktree" had a broken code that attempted to auto-fix
   possible inconsistency that results from end-users moving a
   worktree to different places without telling Git (the original
   repository needs to maintain backpointers to its worktrees, but
   "mv" run by end-users who are not familiar with that fact will
   obviously not adjust them), which actually made things worse
   when triggered.

 * The low-level merge machinery has been taught to use CRLF line
   termination when inserting conflict markers to merged contents that
   are themselves CRLF line-terminated.

 * "git push --force-with-lease" has been taught to report if the push
   needed to force (or fast-forwarded).

 * The emulated "yes" command used in our test scripts has been
   tweaked not to spend too much time generating unnecessary output
   that is not used, to help those who test on Windows where it would
   not stop until it fills the pipe buffer due to lack of SIGPIPE.

 * The documentation for "git clean" has been corrected; it mentioned
   that .git/modules/* are removed by giving two "-f", which has never
   been the case.

 * The vimdiff backend for "git mergetool" has been tweaked to arrange
   and number buffers in the order that would match the expectation of
   majority of people who read left to right, then top down and assign
   buffers 1 2 3 4 "mentally" to local base remote merge windows based
   on that order.

 * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
   rev, i.e. the object named by the the pathname with wildcard
   characters in a tree object.
   (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint).

 * "git rev-parse --git-common-dir" used in the worktree feature
   misbehaved when run from a subdirectory.
   (merge 17f1365 nd/git-common-dir-fix later to maint).

 * "git worktree add -B <branchname>" did not work.

 * The "v(iew)" subcommand of the interactive "git am -i" command was
   broken in 2.6.0 timeframe when the command was rewritten in C.
   (merge 708b8cc jc/am-i-v-fix later to maint).

 * "git merge-tree" used to mishandle "both sides added" conflict with
   its own "create a fake ancestor file that has the common parts of
   what both sides have added and do a 3-way merge" logic; this has
   been updated to use the usual "3-way merge with an empty blob as
   the fake common ancestor file" approach used in the rest of the
   system.
   (merge 907681e jk/no-diff-emit-common later to maint).

 * The memory ownership rule of fill_textconv() API, which was a bit
   tricky, has been documented a bit better.
   (merge a64e6a4 jk/more-comments-on-textconv later to maint).

 * Update various codepaths to avoid manually-counted malloc().
   (merge 08c95df jk/tighten-alloc later to maint).

 * The documentation did not clearly state that the 'simple' mode is
   now the default for "git push" when push.default configuration is
   not set.
   (merge f6b1fb3 mm/push-simple-doc later to maint).

 * Recent versions of GNU grep are pickier when their input contains
   arbitrary binary data, which some of our tests uses.  Rewrite the
   tests to sidestep the problem.
   (merge 3b1442d jk/grep-binary-workaround-in-test later to maint).

 * A helper function "git submodule" uses since v2.7.0 to list the
   modules that match the pathspec argument given to its subcommands
   (e.g. "submodule add <repo> <path>") has been fixed.
   (merge 2b56bb7 sb/submodule-module-list-fix later to maint).

 * "git config section.var value" to set a value in per-repository
   configuration file failed when it was run outside any repository,
   but didn't say the reason correctly.
   (merge 638fa62 js/config-set-in-non-repository later to maint).

 * The code to read the pack data using the offsets stored in the pack
   idx file has been made more carefully check the validity of the
   data in the idx.
   (merge 7465feb jk/pack-idx-corruption-safety later to maint).

 * Other minor clean-ups and documentation updates
   (merge f459823 ak/extract-argv0-last-dir-sep later to maint).
   (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint).
   (merge 4867f11 ps/plug-xdl-merge-leak later to maint).
   (merge 4938686 dt/initial-ref-xn-commit-doc later to maint).
   (merge 9537f21 ma/update-hooks-sample-typofix later to maint).

----------------------------------------------------------------

Changes since v2.7.0 are as follows:

Adam Dinwoodie (1):
      t9117: test specifying full url to git svn init -T

Alex Henrie (1):
      stripspace: call U+0020 a "space" instead of a "blank"

Alexander Kuleshov (3):
      format-patch: introduce format.outputDirectory configuration
      exec_cmd.c: use find_last_dir_sep() for code simplification
      git.c: simplify stripping extension of a file in handle_builtin()

Alexander Shopov (1):
      gitk: Update Bulgarian translation (311t)

Andrew Wheeler (1):
      push: fix ref status reporting for --force-with-lease

Audric Schiltknecht (1):
      l10n: fr.po: Correct case in sentence

Carlos Martín Nieto (1):
      Disown ssh+git and git+ssh

Changwoo Ryu (4):
      l10n: ko.po: Add Korean translation
      l10n: ko.po: Update Korean translation
      l10n: ko: Update Korean translation
      l10n: ko.po: Update Korean translation

Christian Couder (11):
      dir: free untracked cache when removing it
      update-index: use enum for untracked cache options
      update-index: add --test-untracked-cache
      update-index: add untracked cache notifications
      update-index: move 'uc' var declaration
      dir: add {new,add}_untracked_cache()
      dir: add remove_untracked_cache()
      dir: simplify untracked cache "ident" field
      config: add core.untrackedCache
      test-dump-untracked-cache: don't modify the untracked cache
      t7063: add tests for core.untrackedCache

Christoph Egger (1):
      http: implement public key pinning

Christoph Hoopmann (1):
      l10n: de.po: fix typo

Dan Aloni (1):
      ident: add user.useConfigOnly boolean for when ident shouldn't be guessed

Dave Ware (1):
      contrib/subtree: fix "subtree split" skipped-merge bug

David A. Greene (1):
      contrib/subtree: Make testing easier

David A. Wheeler (1):
      Expand documentation describing --signoff

David Turner (3):
      do_compare_entry: use already-computed path
      unpack-trees: fix accidentally quadratic behavior
      refs: document transaction semantics

Dennis Kaarsemaker (1):
      reflog-walk: don't segfault on non-commit sha1's in the reflog

Dickson Wong (1):
      mergetool: reorder vim/gvim buffers in three-way diffs

Dimitriy Ryazantcev (3):
      l10n: ru.po: update Russian translation
      l10n: ru.po: update Russian translation
      l10n: ru.po: update Russian translation

Edmundo Carmona Antoranz (1):
      blame: add support for --[no-]progress option

Elia Pinto (92):
      Makefile: add missing phony target
      contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
      contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
      git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
      t/lib-httpd.sh: use the $( ... ) construct for command substitution
      test-sha1.sh: use the $( ... ) construct for command substitution
      unimplemented.sh: use the $( ... ) construct for command substitution
      t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
      t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
      t/t1410-reflog.sh: use the $( ... ) construct for command substitution
      t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
      t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
      t/t1700-split-index.sh: use the $( ... ) construct for command substitution
      t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
      t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
      t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
      t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
      t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
      t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
      t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
      t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
      t/t3600-rm.sh: use the $( ... ) construct for command substitution
      t/t3700-add.sh: use the $( ... ) construct for command substitution
      t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
      t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
      t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
      t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
      t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
      t/t5304-prune.sh: use the $( ... ) construct for command substitution
      t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
      t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
      t/t5505-remote.sh: use the $( ... ) construct for command substitution
      t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
      t/t5510-fetch.sh: use the $( ... ) construct for command substitution
      t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
      t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
      t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
      t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
      t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
      t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
      t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
      t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
      t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
      t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
      t/t5601-clone.sh: use the $( ... ) construct for command substitution
      t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
      t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
      t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
      t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
      t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
      t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
      t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
      t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
      t/t7001-mv.sh: use the $( ... ) construct for command substitution
      t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
      t/t7004-tag.sh: use the $( ... ) construct for command substitution
      t/t7006-pager.sh: use the $( ... ) construct for command substitution
      t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
      t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
      t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
      t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
      t/t7700-repack.sh: use the $( ... ) construct for command substitution
      t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
      t/t9001-send-email.sh: use the $( ... ) construct for command substitution
      t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
      t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
      t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
      t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
      t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
      t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
      t9300-fast-import.sh: use the $( ... ) construct for command substitution
      t9350-fast-export.sh: use the $( ... ) construct for command substitution
      t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
      t9901-git-web--browse.sh: use the $( ... ) construct for command substitution

Eric Sunshine (2):
      git-compat-util: st_add4: work around gcc 4.2.x compiler crash
      Revert "config.mak.uname: use clang for Mac OS X 10.6"

Eric Wong (10):
      git-send-email: do not double-escape quotes from mutt
      for-each-ref: document `creatordate` and `creator` fields
      git-svn: fix auth parameter handling on SVN 1.9.0+
      pass transport verbosity down to git_connect
      connect & http: support -4 and -6 switches for remote operations
      t5570: add tests for "git {clone,fetch,pull} -v"
      git-svn: hoist out utf8 prep from t9129 to lib-git-svn
      tests: remove no-op full-svn-test target
      git-svn: shorten glob error message
      git-svn: fix URL canonicalization during init w/ SVN 1.7+

Felipe Gonçalves Assis (7):
      merge-recursive: option to disable renames
      merge-recursive: more consistent interface
      merge-strategies.txt: fix typo
      merge-recursive: find-renames resets threshold
      t3034: add rename threshold tests
      t3034: test option to disable renames
      t3034: test deprecated interface

Guillermo S. Romero (1):
      gitk: Follow themed bgcolor in help dialogs

GyuYong Jung (1):
      git-cvsserver.perl: fix typo

Jacob Keller (1):
      notes: allow merging from arbitrary references

Jean-Noel Avila (5):
      l10n: fr.po v2.8.0 round 1 2509t
      l10n: fr.po v2.8.0 round 2
      l10n: fr.po v2.8.0 round 3
      gitk: Update French translation (311t)
      gitk: fr.po: Sync translations with git

Jeff King (86):
      pack-revindex: drop hash table
      pack-revindex: store entries directly in packed_git
      create_symref: modernize variable names
      create_symref: use existing ref-lock code
      create_symref: write reflog while holding lock
      run-command: don't warn on SIGPIPE deaths
      avoid shifting signed integers 31 bits
      bswap: add NO_UNALIGNED_LOADS define
      checkout,clone: check return value of create_symref
      lock_ref_sha1_basic: always fill old_oid while holding lock
      lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
      rebase: ignore failures from "gc --auto"
      shortlog: match both "Author:" and "author" on stdin
      shortlog: use strbufs to read from stdin
      shortlog: replace hand-parsing of author with pretty-printer
      shortlog: optimize "--summary" mode
      shortlog: optimize out useless "<none>" normalization
      shortlog: optimize out useless string list
      shortlog: don't warn on empty author
      filter-branch: resolve $commit^{tree} in no-index case
      clean: make is_git_repository a public function
      resolve_gitlink_ref: ignore non-repository paths
      t6300: use test_atom for some un-modern tests
      tag: do not show ambiguous tag names as "tags/foo"
      transport: drop support for git-over-rsync
      give "nbuf" strbuf a more meaningful name
      checkout-index: simplify "-z" option parsing
      checkout-index: handle "--no-prefix" option
      checkout-index: handle "--no-index" option
      checkout-index: disallow "--no-stage" option
      apply, ls-files: simplify "-z" parsing
      fmt_ident: refactor strictness checks
      test-path-utils: use xsnprintf in favor of strcpy
      rerere: replace strcpy with xsnprintf
      checkout: reorder check_filename conditional
      check_filename: tighten dwim-wildcard ambiguity
      get_sha1: don't die() on bogus search strings
      http-push: stop using name_path
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks
      git-config: better document default behavior for `--include`
      ref-filter: use string_list_split over strbuf_split
      reflog_expire_cfg: NUL-terminate pattern field
      add helpers for detecting size_t overflow
      tree-diff: catch integer overflow in combine_diff_path allocation
      diff: clarify textconv interface
      harden REALLOC_ARRAY and xcalloc against size_t overflow
      add helpers for allocating flex-array structs
      argv-array: add detach function
      convert manual allocations to argv_array
      convert trivial cases to ALLOC_ARRAY
      use xmallocz to avoid size arithmetic
      convert trivial cases to FLEX_ARRAY macros
      use st_add and st_mult for allocation size computation
      prepare_{git,shell}_cmd: use argv_array
      write_untracked_extension: use FLEX_ALLOC helper
      fast-import: simplify allocation in start_packfile
      fetch-pack: simplify add_sought_entry
      test-path-utils: fix normalize_path_copy output buffer size
      sequencer: simplify memory allocation of get_message
      git-compat-util: drop mempcpy compat code
      transport_anonymize_url: use xstrfmt
      diff_populate_gitlink: use a strbuf
      convert ewah/bitmap code to use xmalloc
      ewah: convert to REALLOC_ARRAY, etc
      merge-one-file: use empty blob for add/add base
      merge-tree: drop generate_common strategy
      xdiff: drop XDL_EMIT_COMMON
      t5313: test bounds-checks of corrupted/malicious pack/idx files
      nth_packed_object_offset: bounds-check extended offset
      use_pack: handle signed off_t overflow
      write_or_die: handle EPIPE in async threads
      fetch-pack: ignore SIGPIPE in sideband demuxer
      test_must_fail: report number of unexpected signal
      t5504: handle expected output from SIGPIPE death
      compat/mingw: brown paper bag fix for 50a6c8e
      t9700: fix test for perl older than 5.14
      tree-diff: catch integer overflow in combine_diff_path allocation
      http-push: stop using name_path
      add helpers for detecting size_t overflow
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks

Jiang Xin (7):
      l10n: git.pot: v2.8.0 round 1 (48 new, 16 removed)
      http: honor no_http env variable to bypass proxy
      l10n: zh_CN: for git v2.8.0 l10n round 1
      l10n: git.pot: v2.8.0 round 2 (21 new, 1 removed)
      l10n: zh_CN: for git v2.8.0 l10n round 2
      l10n: git.pot: Add one new message for Git 2.8.0
      l10n: zh_CN: for git v2.8.0 l10n round 3

Johannes Schindelin (47):
      commit: allow editing the commit message even in shared repos
      Handle more file writes correctly in shared repos
      Refactor skipping DOS drive prefixes
      compat/basename: make basename() conform to POSIX
      compat/basename.c: provide a dirname() compatibility function
      t0060: verify that basename() and dirname() work as expected
      config.mak.uname: support MSys2
      config.mak.uname: supporting 64-bit MSys2
      fetch: release pack files before garbage-collecting
      am: release pack files before garbage-collecting
      merge: release pack files before garbage-collecting
      receive-pack: release pack files before garbage-collecting
      pull: allow interactive rebase with --rebase=interactive
      remote: handle the config setting branch.*.rebase=interactive
      completion: add missing branch.*.rebase values
      nedmalloc: allow compiling with MSys2's compiler
      compat/mingw: support MSys2-based MinGW build
      compat/winansi: support compiling with MSys2
      t0060: loosen overly strict expectations
      mingw: avoid redefining S_* constants
      mingw: avoid warnings when casting HANDLEs to int
      mingw: squash another warning about a cast
      mingw: uglify (a, 0) definitions to shut up warnings
      mingw: let's use gettext with MSYS2
      mingw: do not trust MSYS2's MinGW gettext.sh
      Git.pm: stop assuming that absolute paths start with a slash
      mingw: prepare the TMPDIR environment variable for shell scripts
      mingw: let lstat() fail with errno == ENOTDIR when appropriate
      merge-file: let conflict markers match end-of-line style of the context
      merge-file: ensure that conflict sections match eol style
      mingw: fix t5601-clone.sh
      mingw: accomodate t0060-path-utils for MSYS2
      mingw: disable mkfifo-based tests
      tests: turn off git-daemon tests if FIFOs are not available
      mingw: skip test in t1508 that fails due to path conversion
      mingw: fix t9700's assumption about directory separators
      mingw: work around pwd issues in the tests
      mingw: mark t9100's test cases with appropriate prereqs
      mingw: avoid illegal filename in t9118
      mingw: handle the missing POSIXPERM prereq in t9124
      mingw: skip a test in t9130 that cannot pass on Windows
      mingw: do not bother to test funny file names
      test-lib: limit the output of the yes utility
      gitignore: ignore generated test-fake-ssh executable
      t5505: 'remote add x y' should work when url.y.insteadOf = x
      git config: report when trying to modify a non-existing repo config
      Mark win32's pthread_exit() as NORETURN

Johannes Sixt (3):
      t/t5100: no need to use 'echo' command substitutions for globbing
      mingw: avoid linking to the C library's isalpha()
      t0001: fix GIT_* environment variable check under --valgrind

John Keeping (3):
      completion: add missing git-rebase options
      t8005: avoid grep on non-ASCII data
      t9200: avoid grep on non-ASCII data

Jon Griffiths (3):
      credential-cache--daemon: refactor check_socket_directory
      credential-cache--daemon: disallow relative socket path
      credential-cache--daemon: change to the socket dir on startup

Jonathan Nieder (1):
      submodule.c: write "Fetching submodule <foo>" to stderr

Junio C Hamano (58):
      First batch for post 2.7 cycle
      strbuf: miniscule style fix
      strbuf: make strbuf_getline_crlf() global
      strbuf: introduce strbuf_getline_{lf,nul}()
      mktree: there are only two possible line terminations
      check-attr: there are only two possible line terminations
      check-ignore: there are only two possible line terminations
      update-index: there are only two possible line terminations
      checkout-index: there are only two possible line terminations
      strbuf: give strbuf_getline() to the "most text friendly" variant
      hash-object: read --stdin-paths with strbuf_getline()
      revision: read --stdin with strbuf_getline()
      rev-parse: read parseopt spec with strbuf_getline()
      ident.c: read /etc/mailname with strbuf_getline()
      remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
      clone/sha1_file: read info/alternates with strbuf_getline()
      transport-helper: read helper response with strbuf_getline()
      cat-file: read batch stream with strbuf_getline()
      column: read lines with strbuf_getline()
      send-pack: read list of refs with strbuf_getline()
      grep: read -f file with strbuf_getline()
      test-sha1-array: read command stream with strbuf_getline()
      test-lib: clarify and tighten SANITY
      Second batch for 2.8 cycle
      Third batch for 2.8 cycle
      git: remove an early return from save_env_before_alias()
      git: protect against unbalanced calls to {save,restore}_env()
      git: simplify environment save/restore logic
      Fourth batch for 2.8.cycle
      Getting closer to 2.7.1
      restore_env(): free the saved environment variable once we are done
      Fifth batch for 2.8 cycle
      Git 2.7.1
      Sixth batch for the 2.8 cycle
      pager: lose a separate argv[]
      pager: factor out a helper to prepare a child process to run the pager
      am -i: fix "v"iew
      Start preparing for 2.7.2
      Seventh batch for the 2.8 cycle
      Git 2.7.2
      Eighth batch for 2.8
      Git 2.8-rc0
      Git 2.8-rc1
      gitignore: document that unignoring a directory unignores everything in it
      Git 2.7.3
      Git 2.8-rc2
      sane_grep: pass "-a" if grep accepts it
      rebase-i: clarify "is this commit relevant?" test
      RelNotes for 2.8.0: typofix
      Git 2.8-rc3
      Git 2.4.11
      Git 2.5.5
      Git 2.6.6
      Git 2.7.4
      Revert "Merge branch 'jc/exclusion-doc'"
      Revert "Merge branch 'nd/exclusion-regression-fix'"
      RelNotes: remove the mention of !reinclusion
      Git 2.8-rc4

Karsten Blees (1):
      mingw: factor out Windows specific environment setup

Karthik Nayak (10):
      ref-filter: bump 'used_atom' and related code to the top
      ref-filter: introduce struct used_atom
      ref-filter: introduce parsing functions for each valid atom
      ref-filter: introduce color_atom_parser()
      ref-filter: introduce parse_align_position()
      ref-filter: introduce align_atom_parser()
      ref-filter: align: introduce long-form syntax
      ref-filter: introduce remote_ref_atom_parser()
      ref-filter: introduce contents_atom_parser()
      ref-filter: introduce objectname_atom_parser()

Kazutoshi Satoda (2):
      git-svn: enable "svn.pathnameencoding" on dcommit
      git-svn: apply "svn.pathnameencoding" before URL encoding

Knut Franke (2):
      http: allow selection of proxy authentication method
      http: use credential API to handle proxy authentication

Lars Schneider (8):
      travis-ci: run previously failed tests first, then slowest to fastest
      travis-ci: explicity use container-based infrastructure
      convert: treat an empty string for clean/smudge filters as "cat"
      t: do not hide Git's exit code in tests using 'nul_to_q'
      rename git_config_from_buf to git_config_from_mem
      config: add 'origin_type' to config_source struct
      config: add '--show-origin' option to print the origin of a config value
      add DEVELOPER makefile knob to check for acknowledged warnings

Lars Vogel (1):
      git-add doc: do not say working directory when you mean working tree

Martin Amdisen (1):
      templates/hooks: fix minor typo in the sample update-hook

Matt McCutchen (1):
      Documentation/git-clean.txt: don't mention deletion of .git/modules/*

Matthew Kraai (1):
      Documentation: remove unnecessary backslashes

Matthieu Moy (8):
      Documentation/git-push: document that 'simple' is the default
      README: use markdown syntax
      README.md: add hyperlinks on filenames
      README.md: move the link to git-scm.com up
      README.md: don't call git stupid in the title
      README.md: move down historical explanation about the name
      push: remove "push.default is unset" warning message
      Documentation: fix broken linkgit to git-config

Michael J Gruber (5):
      t9100: fix breakage when SHELL_PATH is not /bin/sh
      tests: rename work-tree tests to *work-tree*
      t/lib-httpd: load mod_unixd
      t5510: do not leave changed cwd
      wt-status: allow "ahead " to be picked up by l10n

Mike Hommey (1):
      notes: allow treeish expressions as notes ref

Nguyễn Thái Ngọc Duy (25):
      blame: remove obsolete comment
      add and use a convenience macro ce_intent_to_add()
      Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
      git.c: make it clear save_env() is for alias handling only
      setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
      git.c: make sure we do not leak GIT_* to alias scripts
      grep: make it clear i-t-a entries are ignored
      dir.c: clean the entire struct in clear_exclude_list()
      Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"
      worktree.c: fix indentation
      diff-no-index: do not take a redundant prefix argument
      diff: make -O and --output work in subdirectory
      worktree: stop supporting moving worktrees manually
      rev-parse: take prefix into account in --git-common-dir
      dir.c: fix match_pathname()
      dir.c: support tracing exclude
      dir.c: support marking some patterns already matched
      dir.c: don't exclude whole dir prematurely
      worktree: fix "add -B"
      worktree add -B: do the checkout test before update branch
      sha1_file.c: mark strings for translation
      builtin/checkout.c: mark strings for translation
      builtin/clone.c: mark strings for translation
      ref-filter.c: mark strings for translation
      trailer.c: mark strings for translation

Pat Thoyts (1):
      t0008: avoid absolute path

Patrick Steinhardt (18):
      push: add '--delete' flag to synopsis
      push: add '-d' as shorthand for '--delete'
      config: introduce set_or_die wrappers
      branch: report errors in tracking branch setup
      branch: die on config error when unsetting upstream
      branch: die on config error when editing branch description
      submodule: die on config error when linking modules
      submodule--helper: die on config error when cloning module
      remote: die on config error when setting URL
      remote: die on config error when setting/adding branches
      remote: die on config error when manipulating remotes
      clone: die on config error in cmd_clone
      init-db: die on config errors when initializing empty repo
      sequencer: die on config error when saving replay opts
      compat: die when unable to set core.precomposeunicode
      config: rename git_config_set to git_config_set_gently
      config: rename git_config_set_or_die to git_config_set
      xdiff/xmerge: fix memory leak in xdl_merge

Paul Wagland (2):
      completion: complete show-branch "--date-order"
      completion: update completion arguments for stash

Peter Krefting (3):
      l10n: sv.po: Fix inconsistent translation of "progress meter"
      l10n: sv.po: Update Swedish translation (2509t0f0u)
      l10n: sv.po: Update Swedish translation (2530t0f0u)

Ralf Thielow (8):
      l10n: TEAMS: update Ralf Thielow's email address
      l10n: de.po: add space to abbreviation "z. B."
      l10n: de.po: fix interactive rebase message
      l10n: de.po: translate "command" as "Befehl"
      l10n: de.po: translate 48 new messages
      l10n: de.po: translate 22 new messages
      l10n: de.po: add missing newlines
      gitk: Update German translation

Ray Chen (1):
      l10n: zh_CN: review for git v2.8.0 l10n round 2

Rob Mayoff (1):
      contrib/subtree: unwrap tag refs

Romain Picard (1):
      git-p4.py: add support for filetype change

SZEDER Gábor (2):
      t6050-replace: make failing editor test more robust
      completion: fix mis-indentation in _git_stash()

Sebastian Schuberth (3):
      docs: clarify that passing --depth to git-clone implies --single-branch
      docs: say "commits" in the --depth option wording for git-clone
      docs: clarify that --depth for git-fetch works with newly initialized repos

Shawn O. Pearce (1):
      remote-curl: include curl_errorstr on SSL setup failures

Stefan Beller (10):
      xread: poll on non blocking fds
      strbuf: add strbuf_read_once to read without blocking
      sigchain: add command to pop all common signals
      run-command: add an asynchronous parallel child processor
      fetch_populated_submodules: use new parallel job processing
      submodules: allow parallel fetching, add tests and documentation
      submodule helper list: respect correct path prefix
      submodule: try harder to fetch needed sha1 by direct fetching sha1
      run-command: do not pass child process data into callbacks
      Documentation: reword rebase summary

Stephen P. Smith (4):
      user-manual: remove temporary branch entry from todo list
      glossary: define the term shallow clone
      user-manual: add section documenting shallow clones
      user-manual: add addition gitweb information

Thomas Ackermann (1):
      documentation: fix some typos

Thomas Braun (1):
      completion: complete "diff --word-diff-regex="

Thomas Gummerer (11):
      t7810: correct --no-index test
      builtin/grep: add grep.fallbackToNoIndex config
      ls-remote: document --quiet option
      ls-remote: document --refs option
      ls-remote: fix synopsis
      ls-remote: use parse-options api
      ls-remote: add support for showing symrefs
      remote: use parse_config_key
      remote: simplify remote_is_configured()
      remote: actually check if remote exits
      remote: use remote_is_configured() for add and rename

Tobias Klauser (2):
      trailer: allow to write to files other than stdout
      interpret-trailers: add option for in-place editing

Torsten Bögershausen (9):
      ls-files: add eol diagnostics
      t0027: add tests for get_stream_filter()
      convert.c: remove unused parameter 'path'
      convert.c: remove input_crlf_action()
      convert.c: use text_eol_is_crlf()
      convert.c: refactor crlf_action
      convert.c: simplify text_stat
      convert.c: correct attr_action()
      config.mak.uname: use clang for Mac OS X 10.6

Trần Ngọc Quân (1):
      l10n: vi.po (2509t): Updated Vietnamese translation

Victor Leschuk (4):
      grep: allow threading even on a single-core machine
      grep: slight refactoring to the code that disables threading
      grep: add --threads=<num> option and grep.threads configuration
      git-svn: loosen config globs limitations

Will Palmer (2):
      test for '!' handling in rev-parse's named commits
      object name: introduce '^{/!-<negative pattern>}' notation

brian m. carlson (1):
      http: add option to try authentication without username

Øyvind A. Holm (1):
      gitweb: squelch "uninitialized value" warning

마누엘 (1):
      mingw: try to delete target directory before renaming

^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.8.0-rc3
@ 2016-03-16 22:24  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-03-16 22:24 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

A release candidate Git v2.8.0-rc3 is now available for testing
at the usual places.  It is comprised of 498 non-merge commits
since v2.7.0, contributed by 69 people, 21 of which are new faces.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.8.0-rc3' tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.7.0 are as follows.
Welcome to the Git development community!

  마누엘, Adam Dinwoodie, Andrew Wheeler, Changwoo Ryu,
  Christoph Egger, Christoph Hoopmann, Dan Aloni, Dave Ware, David
  A. Wheeler, Dickson Wong, Felipe Gonçalves Assis, GyuYong Jung,
  Jon Griffiths, Kazutoshi Satoda, Lars Vogel, Martin Amdisen,
  Matthew Kraai, Paul Wagland, Rob Mayoff, Romain Picard, and
  Victor Leschuk.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alexander Kuleshov, Alex Henrie, Audric Schiltknecht, brian
  m. carlson, Carlos Martín Nieto, Christian Couder, David
  A. Greene, David Turner, Dennis Kaarsemaker, Dimitriy Ryazantcev,
  Edmundo Carmona Antoranz, Elia Pinto, Eric Wong, Jacob Keller,
  Jean-Noel Avila, Jeff King, Jiang Xin, Johannes Schindelin,
  Johannes Sixt, John Keeping, Jonathan Nieder, Junio C Hamano,
  Karsten Blees, Karthik Nayak, Knut Franke, Lars Schneider,
  Matthieu Moy, Matt McCutchen, Michael J Gruber, Mike Hommey,
  Nguyễn Thái Ngọc Duy, Øyvind A. Holm, Patrick Steinhardt,
  Pat Thoyts, Peter Krefting, Ralf Thielow, Sebastian Schuberth,
  Shawn O. Pearce, Stefan Beller, Stephen P. Smith, SZEDER Gábor,
  Thomas Ackermann, Thomas Braun, Thomas Gummerer, Tobias Klauser,
  Torsten Bögershausen, Trần Ngọc Quân, and Will Palmer.

----------------------------------------------------------------

Git 2.8 Release Notes (draft)
=============================

Backward compatibility note
---------------------------

The rsync:// transport has been removed.


Updates since v2.7
------------------

UI, Workflows & Features

 * It turns out "git clone" over rsync transport has been broken when
   the source repository has packed references for a long time, and
   nobody noticed nor complained about it.

 * "push" learned that its "--delete" option can be shortened to
   "-d", just like "branch --delete" and "branch -d" are the same
   thing.

 * "git blame" learned to produce the progress eye-candy when it takes
   too much time before emitting the first line of the result.

 * "git grep" can now be configured (or told from the command line)
   how many threads to use when searching in the working tree files.

 * Some "git notes" operations, e.g. "git log --notes=<note>", should
   be able to read notes from any tree-ish that is shaped like a notes
   tree, but the notes infrastructure required that the argument must
   be a ref under refs/notes/.  Loosen it to require a valid ref only
   when the operation would update the notes (in which case we must
   have a place to store the updated notes tree, iow, a ref).

 * "git grep" by default does not fall back to its "--no-index"
   behaviour outside a directory under Git's control (otherwise the
   user may by mistake end up running a huge recursive search); with a
   new configuration (set in $HOME/.gitconfig--by definition this
   cannot be set in the config file per project), this safety can be
   disabled.

 * "git pull --rebase" has been extended to allow invoking
   "rebase -i".

 * "git p4" learned to cope with the type of a file getting changed.

 * "git format-patch" learned to notice format.outputDirectory
   configuration variable.  This allows "-o <dir>" option to be
   omitted on the command line if you always use the same directory in
   your workflow.

 * "interpret-trailers" has been taught to optionally update a file in
   place, instead of always writing the result to the standard output.

 * Many commands that read files that are expected to contain text
   that is generated (or can be edited) by the end user to control
   their behaviour (e.g. "git grep -f <filename>") have been updated
   to be more tolerant to lines that are terminated with CRLF (they
   used to treat such a line to contain payload that ends with CR,
   which is usually not what the users expect).

 * "git notes merge" used to limit the source of the merged notes tree
   to somewhere under refs/notes/ hierarchy, which was too limiting
   when inventing a workflow to exchange notes with remote
   repositories using remote-tracking notes trees (located in e.g.
   refs/remote-notes/ or somesuch).

 * "git ls-files" learned a new "--eol" option to help diagnose
   end-of-line problems.

 * "ls-remote" learned an option to show which branch the remote
   repository advertises as its primary by pointing its HEAD at.

 * New http.proxyAuthMethod configuration variable can be used to
   specify what authentication method to use, as a way to work around
   proxies that do not give error response expected by libcurl when
   CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
   has been taught to use credential API to store the authentication
   material in user's keyrings.

 * Update the untracked cache subsystem and change its primary UI from
   "git update-index" to "git config".

 * There were a few "now I am doing this thing" progress messages in
   the TCP connection code that can be triggered by setting a verbose
   option internally in the code, but "git fetch -v" and friends never
   passed the verbose option down to that codepath.

 * Clean/smudge filters defined in a configuration file of lower
   precedence can now be overridden to be a pass-through no-op by
   setting the variable to an empty string.

 * A new "<branch>^{/!-<pattern>}" notation can be used to name a
   commit that is reachable from <branch> that does not match the
   given <pattern>.

 * The "user.useConfigOnly" configuration variable can be used to
   force the user to always set user.email & user.name configuration
   variables, serving as a reminder for those who work on multiple
   projects and do not want to put these in their $HOME/.gitconfig.

 * "git fetch" and friends that make network connections can now be
   told to only use ipv4 (or ipv6).

 * Some authentication methods do not need username or password, but
   libcurl needs some hint that it needs to perform authentication.
   Supplying an empty username and password string is a valid way to
   do so, but you can set the http.[<url>.]emptyAuth configuration
   variable to achieve the same, if you find it cleaner.

 * You can now set http.[<url>.]pinnedpubkey to specify the pinned
   public key when building with recent enough versions of libcURL.

 * The configuration system has been taught to phrase where it found a
   bad configuration variable in a better way in its error messages.
   "git config" learnt a new "--show-origin" option to indicate where
   the values come from.

 * The "credential-cache" daemon process used to run in whatever
   directory it happened to start in, but this made umount(2)ing the
   filesystem that houses the repository harder; now the process
   chdir()s to the directory that house its own socket on startup.

 * When "git submodule update" did not result in fetching the commit
   object in the submodule that is referenced by the superproject, the
   command learned to retry another fetch, specifically asking for
   that commit that may not be connected to the refs it usually
   fetches.

 * "git merge-recursive" learned "--no-renames" option to disable its
   rename detection logic.

 * Across the transition at around Git version 2.0, the user used to
   get a pretty loud warning when running "git push" without setting
   push.default configuration variable.  We no longer warn because the
   transition was completed a long time ago.

 * README has been renamed to README.md and its contents got tweaked
   slightly to make it easier on the eyes.


Performance, Internal Implementation, Development Support etc.

 * Add a framework to spawn a group of processes in parallel, and use
   it to run "git fetch --recurse-submodules" in parallel.

 * A slight update to the Makefile to mark ".PHONY" targets as such
   correctly.

 * In-core storage of the reverse index for .pack files (which lets
   you go from a pack offset to an object name) has been streamlined.

 * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
   $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
   handling by overwriting GIT_WORK_TREE environment variable to
   affect subprocesses when set_git_work_tree() gets called, which
   resulted in a rather unpleasant regression to "clone" and "init".
   Try to address the same issue by always restoring the environment
   and respawning the real underlying command when handling alias.

 * The low-level code that is used to create symbolic references has
   been updated to share more code with the code that deals with
   normal references.

 * strbuf_getline() and friends have been redefined to make it easier
   to identify which callsite of (new) strbuf_getline_lf() should
   allow and silently ignore carriage-return at the end of the line to
   help users on DOSsy systems.

 * "git shortlog" used to accumulate various pieces of information
   regardless of what was asked to be shown in the final output.  It
   has been optimized by noticing what need not to be collected
   (e.g. there is no need to collect the log messages when showing
   only the number of changes).

 * "git checkout $branch" (and other operations that share the same
   underlying machinery) has been optimized.

 * Automated tests in Travis CI environment has been optimized by
   persisting runtime statistics of previous "prove" run, executing
   tests that take longer before other ones; this reduces the total
   wallclock time.

 * Test scripts have been updated to remove assumptions that are not
   portable between Git for POSIX and Git for Windows, or to skip ones
   with expectations that are not satisfiable on Git for Windows.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in a couple of protrams that are already safe
   has been rewritten to avoid false warnings.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat.  The API has been removed and its users have been
   rewritten to simplify the overall code complexity.

 * Help those who debug http(s) part of the system.
   (merge 0054045 sp/remote-curl-ssl-strerror later to maint).

 * The internal API to interact with "remote.*" configuration
   variables has been streamlined.

 * The ref-filter's format-parsing code has been refactored, in
   preparation for "branch --format" and friends.

 * Traditionally, the tests that try commands that work on the
   contents in the working tree were named with "worktree" in their
   filenames, but with the recent addition of "git worktree"
   subcommand, whose tests are also named similarly, it has become
   harder to tell them apart.  The traditional tests have been renamed
   to use "work-tree" instead in an attempt to differentiate them.
   (merge 5549029 mg/work-tree-tests later to maint).

 * Many codepaths forget to check return value from git_config_set();
   the function is made to die() to make sure we do not proceed when
   setting a configuration variable failed.
   (merge 3d18064 ps/config-error later to maint).

 * Handling of errors while writing into our internal asynchronous
   process has been made more robust, which reduces flakiness in our
   tests.
   (merge 43f3afc jk/epipe-in-async later to maint).

 * There is a new DEVELOPER knob that enables many compiler warning
   options in the Makefile.

 * The way the test scripts configure the Apache web server has been
   updated to work also for Apache 2.4 running on RedHat derived
   distros.

 * Out of maintenance gcc on OSX 10.6 fails to compile the code in
   'master'; work it around by using clang by default on the platform.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat, in many cases.  The API has been removed and its
   users have been rewritten to simplify the overall code complexity.
   This incidentally also closes some heap-corruption holes.

 * Recent versions of GNU grep is pickier than before to decide if a
   file is "binary" and refuse to give line-oriented hits when we
   expect it to, unless explicitly told with "-a" option.  As our
   scripted Porcelains use sane_grep wrapper for line-oriented data,
   even when the line may contain non-ASCII payload we took from
   end-user data, use "grep -a" to implement sane_grep wrapper when
   using an implementation of "grep" that takes the "-a" option.



Also contains various documentation updates and code clean-ups.


Fixes since v2.7
----------------

Unless otherwise noted, all the fixes since v2.7 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * An earlier change in 2.5.x-era broke users' hooks and aliases by
   exporting GIT_WORK_TREE to point at the root of the working tree,
   interfering when they tried to use a different working tree without
   setting GIT_WORK_TREE environment themselves.

 * The "exclude_list" structure has the usual "alloc, nr" pair of
   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
   array.

 * Paths that have been told the index about with "add -N" are not
   quite yet in the index, but a few commands behaved as if they
   already are in a harmful way.

 * "git send-email" was confused by escaped quotes stored in the alias
   files saved by "mutt", which has been corrected.

 * A few unportable C construct have been spotted by clang compiler
   and have been fixed.

 * The documentation has been updated to hint the connection between
   the '--signoff' option and DCO.

 * "git reflog" incorrectly assumed that all objects that used to be
   at the tip of a ref must be commits, which caused it to segfault.

 * The ignore mechanism saw a few regressions around untracked file
   listing and sparse checkout selection areas in 2.7.0; the change
   that is responsible for the regression has been reverted.

 * Another try to improve the ignore mechanism that lets you say "this
   is excluded" and then later say "oh, no, this part (that is a
   subset of the previous part) is not excluded".  This has still a
   known limitation, though.

 * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
   done.  This however did not work well if the repository is set to
   be shared with core.sharedRepository and the umask of the previous
   user is tighter.  They have been made to work better by calling
   unlink(2) and retrying after fopen(3) fails with EPERM.

 * Asking gitweb for a nonexistent commit left a warning in the server
   log.

   Somebody may want to follow this up with an additional test, perhaps?
   IIRC, we do test that no Perl warnings are given to the server log,
   so this should have been caught if our test coverage were good.

 * "git rebase", unlike all other callers of "gc --auto", did not
   ignore the exit code from "gc --auto".

 * Many codepaths that run "gc --auto" before exiting kept packfiles
   mapped and left the file descriptors to them open, which was not
   friendly to systems that cannot remove files that are open.  They
   now close the packs before doing so.

 * A recent optimization to filter-branch in v2.7.0 introduced a
   regression when --prune-empty filter is used, which has been
   corrected.

 * The description for SANITY prerequisite the test suite uses has
   been clarified both in the comment and in the implementation.

 * "git tag" started listing a tag "foo" as "tags/foo" when a branch
   named "foo" exists in the same repository; remove this unnecessary
   disambiguation, which is a regression introduced in v2.7.0.

 * The way "git svn" uses auth parameter was broken by Subversion
   1.9.0 and later.

 * The "split" subcommand of "git subtree" (in contrib/) incorrectly
   skipped merges when it shouldn't, which was corrected.

 * A few options of "git diff" did not work well when the command was
   run from a subdirectory.

 * The command line completion learned a handful of additional options
   and command specific syntax.

 * dirname() emulation has been added, as Msys2 lacks it.

 * The underlying machinery used by "ls-files -o" and other commands
   has been taught not to create empty submodule ref cache for a
   directory that is not a submodule.  This removes a ton of wasted
   CPU cycles.

 * "git worktree" had a broken code that attempted to auto-fix
   possible inconsistency that results from end-users moving a
   worktree to different places without telling Git (the original
   repository needs to maintain backpointers to its worktrees, but
   "mv" run by end-users who are not familiar with that fact will
   obviously not adjust them), which actually made things worse
   when triggered.

 * The low-level merge machinery has been taught to use CRLF line
   termination when inserting conflict markers to merged contents that
   are themselves CRLF line-terminated.

 * "git push --force-with-lease" has been taught to report if the push
   needed to force (or fast-forwarded).

 * The emulated "yes" command used in our test scripts has been
   tweaked not to spend too much time generating unnecessary output
   that is not used, to help those who test on Windows where it would
   not stop until it fills the pipe buffer due to lack of SIGPIPE.

 * The documentation for "git clean" has been corrected; it mentioned
   that .git/modules/* are removed by giving two "-f", which has never
   been the case.

 * The vimdiff backend for "git mergetool" has been tweaked to arrange
   and number buffers in the order that would match the expectation of
   majority of people who read left to right, then top down and assign
   buffers 1 2 3 4 "mentally" to local base remote merge windows based
   on that order.

 * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
   rev, i.e. the object named by the the pathname with wildcard
   characters in a tree object.
   (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint).

 * "git rev-parse --git-common-dir" used in the worktree feature
   misbehaved when run from a subdirectory.
   (merge 17f1365 nd/git-common-dir-fix later to maint).

 * "git worktree add -B <branchname>" did not work.

 * The "v(iew)" subcommand of the interactive "git am -i" command was
   broken in 2.6.0 timeframe when the command was rewritten in C.
   (merge 708b8cc jc/am-i-v-fix later to maint).

 * "git merge-tree" used to mishandle "both sides added" conflict with
   its own "create a fake ancestor file that has the common parts of
   what both sides have added and do a 3-way merge" logic; this has
   been updated to use the usual "3-way merge with an empty blob as
   the fake common ancestor file" approach used in the rest of the
   system.
   (merge 907681e jk/no-diff-emit-common later to maint).

 * The memory ownership rule of fill_textconv() API, which was a bit
   tricky, has been documented a bit better.
   (merge a64e6a4 jk/more-comments-on-textconv later to maint).

 * Update various codepaths to avoid manually-counted malloc().
   (merge 08c95df jk/tighten-alloc later to maint).

 * The documentation did not clearly state that the 'simple' mode is
   now the default for "git push" when push.default configuration is
   not set.
   (merge f6b1fb3 mm/push-simple-doc later to maint).

 * Recent versions of GNU grep are pickier when their input contains
   arbitrary binary data, which some of our tests uses.  Rewrite the
   tests to sidestep the problem.
   (merge 3b1442d jk/grep-binary-workaround-in-test later to maint).

 * A helper function "git submodule" uses since v2.7.0 to list the
   modules that match the pathspec argument given to its subcommands
   (e.g. "submodule add <repo> <path>") has been fixed.
   (merge 2b56bb7 sb/submodule-module-list-fix later to maint).

 * "git config section.var value" to set a value in per-repository
   configuration file failed when it was run outside any repository,
   but didn't say the reason correctly.
   (merge 638fa62 js/config-set-in-non-repository later to maint).

 * The code to read the pack data using the offsets stored in the pack
   idx file has been made more carefully check the validity of the
   data in the idx.
   (merge 7465feb jk/pack-idx-corruption-safety later to maint).

 * Other minor clean-ups and documentation updates
   (merge f459823 ak/extract-argv0-last-dir-sep later to maint).
   (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint).
   (merge 4867f11 ps/plug-xdl-merge-leak later to maint).
   (merge 4938686 dt/initial-ref-xn-commit-doc later to maint).
   (merge 9537f21 ma/update-hooks-sample-typofix later to maint).

----------------------------------------------------------------

Changes since v2.7.0 are as follows:

Adam Dinwoodie (1):
      t9117: test specifying full url to git svn init -T

Alex Henrie (1):
      stripspace: call U+0020 a "space" instead of a "blank"

Alexander Kuleshov (3):
      format-patch: introduce format.outputDirectory configuration
      exec_cmd.c: use find_last_dir_sep() for code simplification
      git.c: simplify stripping extension of a file in handle_builtin()

Andrew Wheeler (1):
      push: fix ref status reporting for --force-with-lease

Audric Schiltknecht (1):
      l10n: fr.po: Correct case in sentence

Carlos Martín Nieto (1):
      Disown ssh+git and git+ssh

Changwoo Ryu (3):
      l10n: ko.po: Add Korean translation
      l10n: ko.po: Update Korean translation
      l10n: ko: Update Korean translation

Christian Couder (11):
      dir: free untracked cache when removing it
      update-index: use enum for untracked cache options
      update-index: add --test-untracked-cache
      update-index: add untracked cache notifications
      update-index: move 'uc' var declaration
      dir: add {new,add}_untracked_cache()
      dir: add remove_untracked_cache()
      dir: simplify untracked cache "ident" field
      config: add core.untrackedCache
      test-dump-untracked-cache: don't modify the untracked cache
      t7063: add tests for core.untrackedCache

Christoph Egger (1):
      http: implement public key pinning

Christoph Hoopmann (1):
      l10n: de.po: fix typo

Dan Aloni (1):
      ident: add user.useConfigOnly boolean for when ident shouldn't be guessed

Dave Ware (1):
      contrib/subtree: fix "subtree split" skipped-merge bug

David A. Greene (1):
      contrib/subtree: Make testing easier

David A. Wheeler (1):
      Expand documentation describing --signoff

David Turner (3):
      do_compare_entry: use already-computed path
      unpack-trees: fix accidentally quadratic behavior
      refs: document transaction semantics

Dennis Kaarsemaker (1):
      reflog-walk: don't segfault on non-commit sha1's in the reflog

Dickson Wong (1):
      mergetool: reorder vim/gvim buffers in three-way diffs

Dimitriy Ryazantcev (2):
      l10n: ru.po: update Russian translation
      l10n: ru.po: update Russian translation

Edmundo Carmona Antoranz (1):
      blame: add support for --[no-]progress option

Elia Pinto (92):
      Makefile: add missing phony target
      contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
      contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
      git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
      t/lib-httpd.sh: use the $( ... ) construct for command substitution
      test-sha1.sh: use the $( ... ) construct for command substitution
      unimplemented.sh: use the $( ... ) construct for command substitution
      t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
      t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
      t/t1410-reflog.sh: use the $( ... ) construct for command substitution
      t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
      t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
      t/t1700-split-index.sh: use the $( ... ) construct for command substitution
      t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
      t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
      t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
      t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
      t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
      t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
      t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
      t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
      t/t3600-rm.sh: use the $( ... ) construct for command substitution
      t/t3700-add.sh: use the $( ... ) construct for command substitution
      t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
      t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
      t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
      t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
      t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
      t/t5304-prune.sh: use the $( ... ) construct for command substitution
      t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
      t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
      t/t5505-remote.sh: use the $( ... ) construct for command substitution
      t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
      t/t5510-fetch.sh: use the $( ... ) construct for command substitution
      t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
      t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
      t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
      t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
      t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
      t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
      t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
      t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
      t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
      t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
      t/t5601-clone.sh: use the $( ... ) construct for command substitution
      t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
      t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
      t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
      t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
      t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
      t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
      t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
      t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
      t/t7001-mv.sh: use the $( ... ) construct for command substitution
      t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
      t/t7004-tag.sh: use the $( ... ) construct for command substitution
      t/t7006-pager.sh: use the $( ... ) construct for command substitution
      t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
      t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
      t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
      t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
      t/t7700-repack.sh: use the $( ... ) construct for command substitution
      t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
      t/t9001-send-email.sh: use the $( ... ) construct for command substitution
      t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
      t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
      t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
      t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
      t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
      t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
      t9300-fast-import.sh: use the $( ... ) construct for command substitution
      t9350-fast-export.sh: use the $( ... ) construct for command substitution
      t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
      t9901-git-web--browse.sh: use the $( ... ) construct for command substitution

Eric Wong (10):
      git-send-email: do not double-escape quotes from mutt
      for-each-ref: document `creatordate` and `creator` fields
      git-svn: fix auth parameter handling on SVN 1.9.0+
      pass transport verbosity down to git_connect
      connect & http: support -4 and -6 switches for remote operations
      t5570: add tests for "git {clone,fetch,pull} -v"
      git-svn: hoist out utf8 prep from t9129 to lib-git-svn
      tests: remove no-op full-svn-test target
      git-svn: shorten glob error message
      git-svn: fix URL canonicalization during init w/ SVN 1.7+

Felipe Gonçalves Assis (7):
      merge-recursive: option to disable renames
      merge-recursive: more consistent interface
      merge-strategies.txt: fix typo
      merge-recursive: find-renames resets threshold
      t3034: add rename threshold tests
      t3034: test option to disable renames
      t3034: test deprecated interface

GyuYong Jung (1):
      git-cvsserver.perl: fix typo

Jacob Keller (1):
      notes: allow merging from arbitrary references

Jean-Noel Avila (2):
      l10n: fr.po v2.8.0 round 1 2509t
      l10n: fr.po v2.8.0 round 2

Jeff King (86):
      pack-revindex: drop hash table
      pack-revindex: store entries directly in packed_git
      create_symref: modernize variable names
      create_symref: use existing ref-lock code
      create_symref: write reflog while holding lock
      run-command: don't warn on SIGPIPE deaths
      avoid shifting signed integers 31 bits
      bswap: add NO_UNALIGNED_LOADS define
      checkout,clone: check return value of create_symref
      lock_ref_sha1_basic: always fill old_oid while holding lock
      lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
      rebase: ignore failures from "gc --auto"
      shortlog: match both "Author:" and "author" on stdin
      shortlog: use strbufs to read from stdin
      shortlog: replace hand-parsing of author with pretty-printer
      shortlog: optimize "--summary" mode
      shortlog: optimize out useless "<none>" normalization
      shortlog: optimize out useless string list
      shortlog: don't warn on empty author
      filter-branch: resolve $commit^{tree} in no-index case
      clean: make is_git_repository a public function
      resolve_gitlink_ref: ignore non-repository paths
      t6300: use test_atom for some un-modern tests
      tag: do not show ambiguous tag names as "tags/foo"
      transport: drop support for git-over-rsync
      give "nbuf" strbuf a more meaningful name
      checkout-index: simplify "-z" option parsing
      checkout-index: handle "--no-prefix" option
      checkout-index: handle "--no-index" option
      checkout-index: disallow "--no-stage" option
      apply, ls-files: simplify "-z" parsing
      fmt_ident: refactor strictness checks
      test-path-utils: use xsnprintf in favor of strcpy
      rerere: replace strcpy with xsnprintf
      checkout: reorder check_filename conditional
      check_filename: tighten dwim-wildcard ambiguity
      get_sha1: don't die() on bogus search strings
      http-push: stop using name_path
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks
      git-config: better document default behavior for `--include`
      ref-filter: use string_list_split over strbuf_split
      reflog_expire_cfg: NUL-terminate pattern field
      add helpers for detecting size_t overflow
      tree-diff: catch integer overflow in combine_diff_path allocation
      diff: clarify textconv interface
      harden REALLOC_ARRAY and xcalloc against size_t overflow
      add helpers for allocating flex-array structs
      argv-array: add detach function
      convert manual allocations to argv_array
      convert trivial cases to ALLOC_ARRAY
      use xmallocz to avoid size arithmetic
      convert trivial cases to FLEX_ARRAY macros
      use st_add and st_mult for allocation size computation
      prepare_{git,shell}_cmd: use argv_array
      write_untracked_extension: use FLEX_ALLOC helper
      fast-import: simplify allocation in start_packfile
      fetch-pack: simplify add_sought_entry
      test-path-utils: fix normalize_path_copy output buffer size
      sequencer: simplify memory allocation of get_message
      git-compat-util: drop mempcpy compat code
      transport_anonymize_url: use xstrfmt
      diff_populate_gitlink: use a strbuf
      convert ewah/bitmap code to use xmalloc
      ewah: convert to REALLOC_ARRAY, etc
      merge-one-file: use empty blob for add/add base
      merge-tree: drop generate_common strategy
      xdiff: drop XDL_EMIT_COMMON
      t5313: test bounds-checks of corrupted/malicious pack/idx files
      nth_packed_object_offset: bounds-check extended offset
      use_pack: handle signed off_t overflow
      write_or_die: handle EPIPE in async threads
      fetch-pack: ignore SIGPIPE in sideband demuxer
      test_must_fail: report number of unexpected signal
      t5504: handle expected output from SIGPIPE death
      compat/mingw: brown paper bag fix for 50a6c8e
      t9700: fix test for perl older than 5.14
      add helpers for detecting size_t overflow
      tree-diff: catch integer overflow in combine_diff_path allocation
      http-push: stop using name_path
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks

Jiang Xin (7):
      l10n: git.pot: v2.8.0 round 1 (48 new, 16 removed)
      http: honor no_http env variable to bypass proxy
      l10n: zh_CN: for git v2.8.0 l10n round 1
      l10n: git.pot: v2.8.0 round 2 (21 new, 1 removed)
      l10n: zh_CN: for git v2.8.0 l10n round 2
      l10n: git.pot: Add one new message for Git 2.8.0
      l10n: zh_CN: for git v2.8.0 l10n round 3

Johannes Schindelin (47):
      commit: allow editing the commit message even in shared repos
      Handle more file writes correctly in shared repos
      Refactor skipping DOS drive prefixes
      compat/basename: make basename() conform to POSIX
      compat/basename.c: provide a dirname() compatibility function
      t0060: verify that basename() and dirname() work as expected
      config.mak.uname: support MSys2
      config.mak.uname: supporting 64-bit MSys2
      fetch: release pack files before garbage-collecting
      am: release pack files before garbage-collecting
      merge: release pack files before garbage-collecting
      receive-pack: release pack files before garbage-collecting
      pull: allow interactive rebase with --rebase=interactive
      remote: handle the config setting branch.*.rebase=interactive
      completion: add missing branch.*.rebase values
      nedmalloc: allow compiling with MSys2's compiler
      compat/mingw: support MSys2-based MinGW build
      compat/winansi: support compiling with MSys2
      t0060: loosen overly strict expectations
      mingw: avoid redefining S_* constants
      mingw: avoid warnings when casting HANDLEs to int
      mingw: squash another warning about a cast
      mingw: uglify (a, 0) definitions to shut up warnings
      mingw: let's use gettext with MSYS2
      mingw: do not trust MSYS2's MinGW gettext.sh
      Git.pm: stop assuming that absolute paths start with a slash
      mingw: prepare the TMPDIR environment variable for shell scripts
      mingw: let lstat() fail with errno == ENOTDIR when appropriate
      merge-file: let conflict markers match end-of-line style of the context
      merge-file: ensure that conflict sections match eol style
      mingw: fix t5601-clone.sh
      mingw: accomodate t0060-path-utils for MSYS2
      mingw: disable mkfifo-based tests
      tests: turn off git-daemon tests if FIFOs are not available
      mingw: skip test in t1508 that fails due to path conversion
      mingw: fix t9700's assumption about directory separators
      mingw: work around pwd issues in the tests
      mingw: mark t9100's test cases with appropriate prereqs
      mingw: avoid illegal filename in t9118
      mingw: handle the missing POSIXPERM prereq in t9124
      mingw: skip a test in t9130 that cannot pass on Windows
      mingw: do not bother to test funny file names
      test-lib: limit the output of the yes utility
      gitignore: ignore generated test-fake-ssh executable
      t5505: 'remote add x y' should work when url.y.insteadOf = x
      git config: report when trying to modify a non-existing repo config
      Mark win32's pthread_exit() as NORETURN

Johannes Sixt (3):
      t/t5100: no need to use 'echo' command substitutions for globbing
      mingw: avoid linking to the C library's isalpha()
      t0001: fix GIT_* environment variable check under --valgrind

John Keeping (3):
      completion: add missing git-rebase options
      t8005: avoid grep on non-ASCII data
      t9200: avoid grep on non-ASCII data

Jon Griffiths (3):
      credential-cache--daemon: refactor check_socket_directory
      credential-cache--daemon: disallow relative socket path
      credential-cache--daemon: change to the socket dir on startup

Jonathan Nieder (1):
      submodule.c: write "Fetching submodule <foo>" to stderr

Junio C Hamano (50):
      First batch for post 2.7 cycle
      strbuf: miniscule style fix
      strbuf: make strbuf_getline_crlf() global
      strbuf: introduce strbuf_getline_{lf,nul}()
      mktree: there are only two possible line terminations
      check-attr: there are only two possible line terminations
      check-ignore: there are only two possible line terminations
      update-index: there are only two possible line terminations
      checkout-index: there are only two possible line terminations
      strbuf: give strbuf_getline() to the "most text friendly" variant
      hash-object: read --stdin-paths with strbuf_getline()
      revision: read --stdin with strbuf_getline()
      rev-parse: read parseopt spec with strbuf_getline()
      ident.c: read /etc/mailname with strbuf_getline()
      remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
      clone/sha1_file: read info/alternates with strbuf_getline()
      transport-helper: read helper response with strbuf_getline()
      cat-file: read batch stream with strbuf_getline()
      column: read lines with strbuf_getline()
      send-pack: read list of refs with strbuf_getline()
      grep: read -f file with strbuf_getline()
      test-sha1-array: read command stream with strbuf_getline()
      test-lib: clarify and tighten SANITY
      Second batch for 2.8 cycle
      Third batch for 2.8 cycle
      git: remove an early return from save_env_before_alias()
      git: protect against unbalanced calls to {save,restore}_env()
      git: simplify environment save/restore logic
      Fourth batch for 2.8.cycle
      Getting closer to 2.7.1
      restore_env(): free the saved environment variable once we are done
      Fifth batch for 2.8 cycle
      Git 2.7.1
      Sixth batch for the 2.8 cycle
      pager: lose a separate argv[]
      pager: factor out a helper to prepare a child process to run the pager
      am -i: fix "v"iew
      Start preparing for 2.7.2
      Seventh batch for the 2.8 cycle
      Git 2.7.2
      Eighth batch for 2.8
      Git 2.8-rc0
      Git 2.8-rc1
      gitignore: document that unignoring a directory unignores everything in it
      Git 2.7.3
      Git 2.8-rc2
      sane_grep: pass "-a" if grep accepts it
      rebase-i: clarify "is this commit relevant?" test
      RelNotes for 2.8.0: typofix
      Git 2.8-rc3

Karsten Blees (1):
      mingw: factor out Windows specific environment setup

Karthik Nayak (10):
      ref-filter: bump 'used_atom' and related code to the top
      ref-filter: introduce struct used_atom
      ref-filter: introduce parsing functions for each valid atom
      ref-filter: introduce color_atom_parser()
      ref-filter: introduce parse_align_position()
      ref-filter: introduce align_atom_parser()
      ref-filter: align: introduce long-form syntax
      ref-filter: introduce remote_ref_atom_parser()
      ref-filter: introduce contents_atom_parser()
      ref-filter: introduce objectname_atom_parser()

Kazutoshi Satoda (2):
      git-svn: enable "svn.pathnameencoding" on dcommit
      git-svn: apply "svn.pathnameencoding" before URL encoding

Knut Franke (2):
      http: allow selection of proxy authentication method
      http: use credential API to handle proxy authentication

Lars Schneider (8):
      travis-ci: run previously failed tests first, then slowest to fastest
      travis-ci: explicity use container-based infrastructure
      convert: treat an empty string for clean/smudge filters as "cat"
      t: do not hide Git's exit code in tests using 'nul_to_q'
      rename git_config_from_buf to git_config_from_mem
      config: add 'origin_type' to config_source struct
      config: add '--show-origin' option to print the origin of a config value
      add DEVELOPER makefile knob to check for acknowledged warnings

Lars Vogel (1):
      git-add doc: do not say working directory when you mean working tree

Martin Amdisen (1):
      templates/hooks: fix minor typo in the sample update-hook

Matt McCutchen (1):
      Documentation/git-clean.txt: don't mention deletion of .git/modules/*

Matthew Kraai (1):
      Documentation: remove unnecessary backslashes

Matthieu Moy (7):
      Documentation/git-push: document that 'simple' is the default
      README: use markdown syntax
      README.md: add hyperlinks on filenames
      README.md: move the link to git-scm.com up
      README.md: don't call git stupid in the title
      README.md: move down historical explanation about the name
      push: remove "push.default is unset" warning message

Michael J Gruber (5):
      t9100: fix breakage when SHELL_PATH is not /bin/sh
      tests: rename work-tree tests to *work-tree*
      t/lib-httpd: load mod_unixd
      t5510: do not leave changed cwd
      wt-status: allow "ahead " to be picked up by l10n

Mike Hommey (1):
      notes: allow treeish expressions as notes ref

Nguyễn Thái Ngọc Duy (25):
      blame: remove obsolete comment
      add and use a convenience macro ce_intent_to_add()
      Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
      git.c: make it clear save_env() is for alias handling only
      setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
      git.c: make sure we do not leak GIT_* to alias scripts
      grep: make it clear i-t-a entries are ignored
      dir.c: clean the entire struct in clear_exclude_list()
      Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"
      worktree.c: fix indentation
      diff-no-index: do not take a redundant prefix argument
      diff: make -O and --output work in subdirectory
      worktree: stop supporting moving worktrees manually
      rev-parse: take prefix into account in --git-common-dir
      dir.c: fix match_pathname()
      dir.c: support tracing exclude
      dir.c: support marking some patterns already matched
      dir.c: don't exclude whole dir prematurely
      worktree: fix "add -B"
      worktree add -B: do the checkout test before update branch
      sha1_file.c: mark strings for translation
      builtin/checkout.c: mark strings for translation
      builtin/clone.c: mark strings for translation
      ref-filter.c: mark strings for translation
      trailer.c: mark strings for translation

Pat Thoyts (1):
      t0008: avoid absolute path

Patrick Steinhardt (18):
      push: add '--delete' flag to synopsis
      push: add '-d' as shorthand for '--delete'
      config: introduce set_or_die wrappers
      branch: report errors in tracking branch setup
      branch: die on config error when unsetting upstream
      branch: die on config error when editing branch description
      submodule: die on config error when linking modules
      submodule--helper: die on config error when cloning module
      remote: die on config error when setting URL
      remote: die on config error when setting/adding branches
      remote: die on config error when manipulating remotes
      clone: die on config error in cmd_clone
      init-db: die on config errors when initializing empty repo
      sequencer: die on config error when saving replay opts
      compat: die when unable to set core.precomposeunicode
      config: rename git_config_set to git_config_set_gently
      config: rename git_config_set_or_die to git_config_set
      xdiff/xmerge: fix memory leak in xdl_merge

Paul Wagland (2):
      completion: complete show-branch "--date-order"
      completion: update completion arguments for stash

Peter Krefting (2):
      l10n: sv.po: Fix inconsistent translation of "progress meter"
      l10n: sv.po: Update Swedish translation (2509t0f0u)

Ralf Thielow (5):
      l10n: TEAMS: update Ralf Thielow's email address
      l10n: de.po: add space to abbreviation "z. B."
      l10n: de.po: fix interactive rebase message
      l10n: de.po: translate "command" as "Befehl"
      l10n: de.po: translate 48 new messages

Rob Mayoff (1):
      contrib/subtree: unwrap tag refs

Romain Picard (1):
      git-p4.py: add support for filetype change

SZEDER Gábor (2):
      t6050-replace: make failing editor test more robust
      completion: fix mis-indentation in _git_stash()

Sebastian Schuberth (3):
      docs: clarify that passing --depth to git-clone implies --single-branch
      docs: say "commits" in the --depth option wording for git-clone
      docs: clarify that --depth for git-fetch works with newly initialized repos

Shawn O. Pearce (1):
      remote-curl: include curl_errorstr on SSL setup failures

Stefan Beller (10):
      xread: poll on non blocking fds
      strbuf: add strbuf_read_once to read without blocking
      sigchain: add command to pop all common signals
      run-command: add an asynchronous parallel child processor
      fetch_populated_submodules: use new parallel job processing
      submodules: allow parallel fetching, add tests and documentation
      submodule helper list: respect correct path prefix
      submodule: try harder to fetch needed sha1 by direct fetching sha1
      run-command: do not pass child process data into callbacks
      Documentation: reword rebase summary

Stephen P. Smith (4):
      user-manual: remove temporary branch entry from todo list
      glossary: define the term shallow clone
      user-manual: add section documenting shallow clones
      user-manual: add addition gitweb information

Thomas Ackermann (1):
      documentation: fix some typos

Thomas Braun (1):
      completion: complete "diff --word-diff-regex="

Thomas Gummerer (11):
      t7810: correct --no-index test
      builtin/grep: add grep.fallbackToNoIndex config
      ls-remote: document --quiet option
      ls-remote: document --refs option
      ls-remote: fix synopsis
      ls-remote: use parse-options api
      ls-remote: add support for showing symrefs
      remote: use parse_config_key
      remote: simplify remote_is_configured()
      remote: actually check if remote exits
      remote: use remote_is_configured() for add and rename

Tobias Klauser (2):
      trailer: allow to write to files other than stdout
      interpret-trailers: add option for in-place editing

Torsten Bögershausen (9):
      ls-files: add eol diagnostics
      t0027: add tests for get_stream_filter()
      convert.c: remove unused parameter 'path'
      convert.c: remove input_crlf_action()
      convert.c: use text_eol_is_crlf()
      convert.c: refactor crlf_action
      convert.c: simplify text_stat
      convert.c: correct attr_action()
      config.mak.uname: use clang for Mac OS X 10.6

Trần Ngọc Quân (1):
      l10n: vi.po (2509t): Updated Vietnamese translation

Victor Leschuk (4):
      grep: allow threading even on a single-core machine
      grep: slight refactoring to the code that disables threading
      grep: add --threads=<num> option and grep.threads configuration
      git-svn: loosen config globs limitations

Will Palmer (2):
      test for '!' handling in rev-parse's named commits
      object name: introduce '^{/!-<negative pattern>}' notation

brian m. carlson (1):
      http: add option to try authentication without username

Øyvind A. Holm (1):
      gitweb: squelch "uninitialized value" warning

마누엘 (1):
      mingw: try to delete target directory before renaming

^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.8.0-rc2
@ 2016-03-10 23:04  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-03-10 23:04 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

A release candidate Git v2.8.0-rc2 is now available for testing
at the usual places.  It is comprised of 459 non-merge commits
since v2.7.0, contributed by 60 people, 19 of which are new faces.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.8.0-rc2' tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.7.0 are as follows.
Welcome to the Git development community!

  마누엘, Andrew Wheeler, Changwoo Ryu, Christoph Egger,
  Dan Aloni, Dave Ware, David A. Wheeler, Dickson Wong, Felipe
  Gonçalves Assis, GyuYong Jung, Jon Griffiths, Kazutoshi Satoda,
  Lars Vogel, Martin Amdisen, Matthew Kraai, Paul Wagland, Rob
  Mayoff, Romain Picard, and Victor Leschuk.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alexander Kuleshov, Alex Henrie, brian m. carlson, Christian
  Couder, David A. Greene, David Turner, Dennis Kaarsemaker,
  Edmundo Carmona Antoranz, Elia Pinto, Eric Wong, Jacob Keller,
  Jeff King, Jiang Xin, Johannes Schindelin, Johannes Sixt,
  John Keeping, Jonathan Nieder, Junio C Hamano, Karsten Blees,
  Karthik Nayak, Knut Franke, Lars Schneider, Matthieu Moy, Matt
  McCutchen, Michael J Gruber, Mike Hommey, Nguyễn Thái Ngọc
  Duy, Øyvind A. Holm, Patrick Steinhardt, Pat Thoyts, Sebastian
  Schuberth, Shawn O. Pearce, Stefan Beller, Stephen P. Smith,
  SZEDER Gábor, Thomas Ackermann, Thomas Braun, Thomas Gummerer,
  Tobias Klauser, Torsten Bögershausen, and Will Palmer.

----------------------------------------------------------------

Git 2.8 Release Notes (draft)
=============================

Backward compatibility note
---------------------------

The rsync:// transport has been removed.


Updates since v2.7
------------------

UI, Workflows & Features

 * It turns out "git clone" over rsync transport has been broken when
   the source repository has packed references for a long time, and
   nobody noticed nor complained about it.

 * "branch --delete" has "branch -d" but "push --delete" does not.

 * "git blame" learned to produce the progress eye-candy when it takes
   too much time before emitting the first line of the result.

 * "git grep" can now be configured (or told from the command line)
   how many threads to use when searching in the working tree files.

 * Some "git notes" operations, e.g. "git log --notes=<note>", should
   be able to read notes from any tree-ish that is shaped like a notes
   tree, but the notes infrastructure required that the argument must
   be a ref under refs/notes/.  Loosen it to require a valid ref only
   when the operation would update the notes (in which case we must
   have a place to store the updated notes tree, iow, a ref).

 * "git grep" by default does not fall back to its "--no-index"
   behaviour outside a directory under Git's control (otherwise the
   user may by mistake end up running a huge recursive search); with a
   new configuration (set in $HOME/.gitconfig--by definition this
   cannot be set in the config file per project), this safety can be
   disabled.

 * "git pull --rebase" has been extended to allow invoking
   "rebase -i".

 * "git p4" learned to cope with the type of a file getting changed.

 * "git format-patch" learned to notice format.outputDirectory
   configuration variable.  This allows "-o <dir>" option to be
   omitted on the command line if you always use the same directory in
   your workflow.

 * "interpret-trailers" has been taught to optionally update a file in
   place, instead of always writing the result to the standard output.

 * Many commands that read files that are expected to contain text
   that is generated (or can be edited) by the end user to control
   their behaviour (e.g. "git grep -f <filename>") have been updated
   to be more tolerant to lines that are terminated with CRLF (they
   used to treat such a line to contain payload that ends with CR,
   which is usually not what the users expect).

 * "git notes merge" used to limit the source of the merged notes tree
   to somewhere under refs/notes/ hierarchy, which was too limiting
   when inventing a workflow to exchange notes with remote
   repositories using remote-tracking notes trees (located in e.g.
   refs/remote-notes/ or somesuch).

 * "git ls-files" learned a new "--eol" option to help diagnose
   end-of-line problems.

 * "ls-remote" learned an option to show which branch the remote
   repository advertises as its primary by pointing its HEAD at.

 * New http.proxyAuthMethod configuration variable can be used to
   specify what authentication method to use, as a way to work around
   proxies that do not give error response expected by libcurl when
   CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
   has been taught to use credential API to store the authentication
   material in user's keyrings.

 * Update the untracked cache subsystem and change its primary UI from
   "git update-index" to "git config".

 * There were a few "now I am doing this thing" progress messages in
   the TCP connection code that can be triggered by setting a verbose
   option internally in the code, but "git fetch -v" and friends never
   passed the verbose option down to that codepath.

 * Clean/smudge filters defined in a configuration file of lower
   precedence can now be overridden to be a pass-through no-op by
   setting the variable to an empty string.

 * A new "<branch>^{/!-<pattern>}" notation can be used to name a
   commit that is reachable from <branch> that does not match the
   given <pattern>.

 * The "user.useConfigOnly" configuration variable can be used to
   force the user to always set user.email & user.name configuration
   variables, serving as a reminder for those who work on multiple
   projects and do not want to put these in their $HOME/.gitconfig.

 * "git fetch" and friends that make network connections can now be
   told to only use ipv4 (or ipv6).

 * Some authentication methods do not need username or password, but
   libcurl needs some hint that it needs to perform authentication.
   Supplying an empty username and password string is a valid way to
   do so, but you can set the http.[<url>.]emptyAuth configuration
   variable to achieve the same, if you find it cleaner.

 * You can now set http.[<url>.]pinnedpubkey to specify the pinned
   public key when building with recent enough versions of libcURL.

 * The configuration system has been taught to phrase where it found a
   bad configuration variable in a better way in its error messages.
   "git config" learnt a new "--show-origin" option to indicate where
   the values come from.

 * The "credential-cache" daemon process used to run in whatever
   directory it happened to start in, but this made umount(2)ing the
   filesystem that houses the repository harder; now the process
   chdir()s to the directory that house its own socket on startup.

 * When "git submodule update" did not result in fetching the commit
   object in the submodule that is referenced by the superproject, the
   command learned to retry another fetch, specifically asking for
   that commit that may not be connected to the refs it usually
   fetches.

 * "git merge-recursive" learned "--no-renames" option to disable its
   rename detection logic.

 * Across the transition at around Git version 2.0, the user used to
   get a pretty loud warning when running "git push" without setting
   push.default configuration variable.  We no longer warn, given that
   the transition is over long time ago.

 * README has been renamed to README.md and its contents got tweaked
   slightly to make it easier on the eyes.


Performance, Internal Implementation, Development Support etc.

 * Add a framework to spawn a group of processes in parallel, and use
   it to run "git fetch --recurse-submodules" in parallel.

 * A slight update to the Makefile to mark "phoney" targets
   as such correctly.

 * In-core storage of the reverse index for .pack files (which lets
   you go from a pack offset to an object name) has been streamlined.

 * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
   $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
   handling by overwriting GIT_WORK_TREE environment variable to
   affect subprocesses when set_git_work_tree() gets called, which
   resulted in a rather unpleasant regression to "clone" and "init".
   Try to address the same issue by always restoring the environment
   and respawning the real underlying command when handling alias.

 * The low-level code that is used to create symbolic references has
   been updated to share more code with the code that deals with
   normal references.

 * strbuf_getline() and friends have been redefined to make it easier
   to identify which callsite of (new) strbuf_getline_lf() should
   allow and silently ignore carriage-return at the end of the line to
   help users on DOSsy systems.

 * "git shortlog" used to accumulate various pieces of information
   regardless of what was asked to be shown in the final output.  It
   has been optimized by noticing what need not to be collected
   (e.g. there is no need to collect the log messages when showing
   only the number of changes).

 * "git checkout $branch" (and other operations that share the same
   underlying machinery) has been optimized.

 * Automated tests in Travis CI environment has been optimized by
   persisting runtime statistics of previous "prove" run, executing
   tests that take longer before other ones; this reduces the total
   wallclock time.

 * Test scripts have been updated to remove assumptions that are not
   portable between Git for POSIX and Git for Windows, or to skip ones
   with expectations that are not satisfiable on Git for Windows.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in test-path-utils that are already safe has
   been rewritten to avoid false wanings.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in "git rerere" that are already safe has been
   rewritten to avoid false wanings.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat.  The API has been removed and its users have been
   rewritten to simplify the overall code complexity.

 * Help those who debug http(s) part of the system.
   (merge 0054045 sp/remote-curl-ssl-strerror later to maint).

 * The internal API to interact with "remote.*" configuration
   variables has been streamlined.

 * The ref-filter's format-parsing code has been refactored, in
   preparation for "branch --format" and friends.

 * Traditionally, the tests that try commands that work on the
   contents in the working tree were named with "worktree" in their
   filenames, but with the recent addition of "git worktree"
   subcommand, whose tests are also named similarly, it has become
   harder to tell them apart.  The traditional tests have been renamed
   to use "work-tree" instead in an attempt to differentiate them.
   (merge 5549029 mg/work-tree-tests later to maint).

 * Many codepaths forget to check return value from git_config_set();
   the function is made to die() to make sure we do not proceed when
   setting a configuration variable failed.
   (merge 3d18064 ps/config-error later to maint).

 * Handling of errors while writing into our internal asynchronous
   process has been made more robust, which reduces flakiness in our
   tests.
   (merge 43f3afc jk/epipe-in-async later to maint).

 * There is a new DEVELOPER knob that enables many compiler warning
   options in the Makefile.

 * The way the test scripts configure the Apache web server has been
   updated to work also for Apache 2.4 running on RedHat derived
   distros.

 * Out of maintenance gcc on OSX 10.6 fails to compile the code in
   'master'; work it around by using clang by default on the platform.


Also contains various documentation updates and code clean-ups.


Fixes since v2.7
----------------

Unless otherwise noted, all the fixes since v2.7 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * An earlier change in 2.5.x-era broke users' hooks and aliases by
   exporting GIT_WORK_TREE to point at the root of the working tree,
   interfering when they tried to use a different working tree without
   setting GIT_WORK_TREE environment themselves.

 * The "exclude_list" structure has the usual "alloc, nr" pair of
   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
   array.

 * Paths that have been told the index about with "add -N" are not
   quite yet in the index, but a few commands behaved as if they
   already are in a harmful way.

 * "git send-email" was confused by escaped quotes stored in the alias
   files saved by "mutt", which has been corrected.

 * A few unportable C construct have been spotted by clang compiler
   and have been fixed.

 * The documentation has been updated to hint the connection between
   the '--signoff' option and DCO.

 * "git reflog" incorrectly assumed that all objects that used to be
   at the tip of a ref must be commits, which caused it to segfault.

 * The ignore mechanism saw a few regressions around untracked file
   listing and sparse checkout selection areas in 2.7.0; the change
   that is responsible for the regression has been reverted.

 * Another try to improve the ignore mechanism that lets you say "this
   is excluded" and then later say "oh, no, this part (that is a
   subset of the previous part) is not excluded".  This has still a
   known limitation, though.

 * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
   done.  This however did not work well if the repository is set to
   be shared with core.sharedRepository and the umask of the previous
   user is tighter.  They have been made to work better by calling
   unlink(2) and retrying after fopen(3) fails with EPERM.

 * Asking gitweb for a nonexistent commit left a warning in the server
   log.

   Somebody may want to follow this up with an additional test, perhaps?
   IIRC, we do test that no Perl warnings are given to the server log,
   so this should have been caught if our test coverage were good.

 * "git rebase", unlike all other callers of "gc --auto", did not
   ignore the exit code from "gc --auto".

 * Many codepaths that run "gc --auto" before exiting kept packfiles
   mapped and left the file descriptors to them open, which was not
   friendly to systems that cannot remove files that are open.  They
   now close the packs before doing so.

 * A recent optimization to filter-branch in v2.7.0 introduced a
   regression when --prune-empty filter is used, which has been
   corrected.

 * The description for SANITY prerequisite the test suite uses has
   been clarified both in the comment and in the implementation.

 * "git tag" started listing a tag "foo" as "tags/foo" when a branch
   named "foo" exists in the same repository; remove this unnecessary
   disambiguation, which is a regression introduced in v2.7.0.

 * The way "git svn" uses auth parameter was broken by Subversion
   1.9.0 and later.

 * The "split" subcommand of "git subtree" (in contrib/) incorrectly
   skipped merges when it shouldn't, which was corrected.

 * A few options of "git diff" did not work well when the command was
   run from a subdirectory.

 * The command line completion learned a handful of additional options
   and command specific syntax.

 * dirname() emulation has been added, as Msys2 lacks it.

 * The underlying machinery used by "ls-files -o" and other commands
   have been taught not to create empty submodule ref cache for a
   directory that is not a submodule.  This removes a ton of wasted
   CPU cycles.

 * "git worktree" had a broken code that attempted to auto-fix
   possible inconsistency that results from end-users moving a
   worktree to different places without telling Git (the original
   repository needs to maintain backpointers to its worktrees, but
   "mv" run by end-users who are not familiar with that fact will
   obviously not adjust them), which actually made things worse
   when triggered.

 * The low-level merge machinery has been taught to use CRLF line
   termination when inserting conflict markers to merged contents that
   are themselves CRLF line-terminated.

 * "git push --force-with-lease" has been taught to report if the push
   needed to force (or fast-forwarded).

 * The emulated "yes" command used in our test scripts has been
   tweaked not to spend too much time generating unnecessary output
   that is not used, to help those who test on Windows where it would
   not stop until it fills the pipe buffer due to lack of SIGPIPE.

 * The documentation for "git clean" has been corrected; it mentioned
   that .git/modules/* are removed by giving two "-f", which has never
   been the case.

 * The vimdiff backend for "git mergetool" has been tweaked to arrange
   and number buffers in the order that would match the expectation of
   majority of people who read left to right, then top down and assign
   buffers 1 2 3 4 "mentally" to local base remote merge windows based
   on that order.

 * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
   rev, i.e. the object named by the the pathname with wildcard
   characters in a tree object.
   (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint).

 * "git rev-parse --git-common-dir" used in the worktree feature
   misbehaved when run from a subdirectory.
   (merge 17f1365 nd/git-common-dir-fix later to maint).

 * "git worktree add -B <branchname>" did not work.

 * The "v(iew)" subcommand of the interactive "git am -i" command was
   broken in 2.6.0 timeframe when the command was rewritten in C.
   (merge 708b8cc jc/am-i-v-fix later to maint).

 * "git merge-tree" used to mishandle "both sides added" conflict with
   its own "create a fake ancestor file that has the common parts of
   what both sides have added and do a 3-way merge" logic; this has
   been updated to use the usual "3-way merge with an empty blob as
   the fake common ancestor file" approach used in the rest of the
   system.
   (merge 907681e jk/no-diff-emit-common later to maint).

 * The memory ownership rule of fill_textconv() API, which was a bit
   tricky, has been documented a bit better.
   (merge a64e6a4 jk/more-comments-on-textconv later to maint).

 * Update various codepaths to avoid manually-counted malloc().
   (merge 08c95df jk/tighten-alloc later to maint).

 * The documentation did not clearly state that the 'simple' mode is
   now the default for "git push" when push.default configuration is
   not set.
   (merge f6b1fb3 mm/push-simple-doc later to maint).

 * Recent versions of GNU grep are pickier when their input contains
   arbitrary binary data, which some of our tests uses.  Rewrite the
   tests to sidestep the problem.
   (merge 3b1442d jk/grep-binary-workaround-in-test later to maint).

 * A helper function "git submodule" uses since v2.7.0 to list the
   modules that match the pathspec argument given to its subcommands
   (e.g. "submodule add <repo> <path>") has been fixed.
   (merge 2b56bb7 sb/submodule-module-list-fix later to maint).

 * "git config section.var value" to set a value in per-repository
   configuration file failed when it was run outside any repository,
   but didn't say the reason correctly.
   (merge 638fa62 js/config-set-in-non-repository later to maint).

 * The code to read the pack data using the offsets stored in the pack
   idx file has been made more carefully check the validity of the
   data in the idx.
   (merge 7465feb jk/pack-idx-corruption-safety later to maint).

 * Other minor clean-ups and documentation updates
   (merge f459823 ak/extract-argv0-last-dir-sep later to maint).
   (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint).
   (merge 4867f11 ps/plug-xdl-merge-leak later to maint).
   (merge 4938686 dt/initial-ref-xn-commit-doc later to maint).
   (merge 9537f21 ma/update-hooks-sample-typofix later to maint).

----------------------------------------------------------------

Changes since v2.7.0 are as follows:

Alex Henrie (1):
      stripspace: call U+0020 a "space" instead of a "blank"

Alexander Kuleshov (3):
      format-patch: introduce format.outputDirectory configuration
      exec_cmd.c: use find_last_dir_sep() for code simplification
      git.c: simplify stripping extension of a file in handle_builtin()

Andrew Wheeler (1):
      push: fix ref status reporting for --force-with-lease

Changwoo Ryu (1):
      l10n: ko.po: Add Korean translation

Christian Couder (11):
      dir: free untracked cache when removing it
      update-index: use enum for untracked cache options
      update-index: add --test-untracked-cache
      update-index: add untracked cache notifications
      update-index: move 'uc' var declaration
      dir: add {new,add}_untracked_cache()
      dir: add remove_untracked_cache()
      dir: simplify untracked cache "ident" field
      config: add core.untrackedCache
      test-dump-untracked-cache: don't modify the untracked cache
      t7063: add tests for core.untrackedCache

Christoph Egger (1):
      http: implement public key pinning

Dan Aloni (1):
      ident: add user.useConfigOnly boolean for when ident shouldn't be guessed

Dave Ware (1):
      contrib/subtree: fix "subtree split" skipped-merge bug

David A. Greene (1):
      contrib/subtree: Make testing easier

David A. Wheeler (1):
      Expand documentation describing --signoff

David Turner (3):
      do_compare_entry: use already-computed path
      unpack-trees: fix accidentally quadratic behavior
      refs: document transaction semantics

Dennis Kaarsemaker (1):
      reflog-walk: don't segfault on non-commit sha1's in the reflog

Dickson Wong (1):
      mergetool: reorder vim/gvim buffers in three-way diffs

Edmundo Carmona Antoranz (1):
      blame: add support for --[no-]progress option

Elia Pinto (92):
      Makefile: add missing phony target
      contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
      contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
      git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
      t/lib-httpd.sh: use the $( ... ) construct for command substitution
      test-sha1.sh: use the $( ... ) construct for command substitution
      unimplemented.sh: use the $( ... ) construct for command substitution
      t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
      t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
      t/t1410-reflog.sh: use the $( ... ) construct for command substitution
      t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
      t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
      t/t1700-split-index.sh: use the $( ... ) construct for command substitution
      t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
      t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
      t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
      t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
      t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
      t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
      t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
      t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
      t/t3600-rm.sh: use the $( ... ) construct for command substitution
      t/t3700-add.sh: use the $( ... ) construct for command substitution
      t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
      t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
      t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
      t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
      t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
      t/t5304-prune.sh: use the $( ... ) construct for command substitution
      t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
      t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
      t/t5505-remote.sh: use the $( ... ) construct for command substitution
      t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
      t/t5510-fetch.sh: use the $( ... ) construct for command substitution
      t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
      t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
      t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
      t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
      t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
      t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
      t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
      t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
      t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
      t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
      t/t5601-clone.sh: use the $( ... ) construct for command substitution
      t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
      t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
      t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
      t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
      t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
      t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
      t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
      t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
      t/t7001-mv.sh: use the $( ... ) construct for command substitution
      t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
      t/t7004-tag.sh: use the $( ... ) construct for command substitution
      t/t7006-pager.sh: use the $( ... ) construct for command substitution
      t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
      t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
      t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
      t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
      t/t7700-repack.sh: use the $( ... ) construct for command substitution
      t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
      t/t9001-send-email.sh: use the $( ... ) construct for command substitution
      t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
      t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
      t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
      t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
      t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
      t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
      t9300-fast-import.sh: use the $( ... ) construct for command substitution
      t9350-fast-export.sh: use the $( ... ) construct for command substitution
      t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
      t9901-git-web--browse.sh: use the $( ... ) construct for command substitution

Eric Wong (8):
      git-send-email: do not double-escape quotes from mutt
      for-each-ref: document `creatordate` and `creator` fields
      git-svn: fix auth parameter handling on SVN 1.9.0+
      pass transport verbosity down to git_connect
      connect & http: support -4 and -6 switches for remote operations
      t5570: add tests for "git {clone,fetch,pull} -v"
      git-svn: hoist out utf8 prep from t9129 to lib-git-svn
      tests: remove no-op full-svn-test target

Felipe Gonçalves Assis (7):
      merge-recursive: option to disable renames
      merge-recursive: more consistent interface
      merge-strategies.txt: fix typo
      merge-recursive: find-renames resets threshold
      t3034: add rename threshold tests
      t3034: test option to disable renames
      t3034: test deprecated interface

GyuYong Jung (1):
      git-cvsserver.perl: fix typo

Jacob Keller (1):
      notes: allow merging from arbitrary references

Jeff King (79):
      pack-revindex: drop hash table
      pack-revindex: store entries directly in packed_git
      create_symref: modernize variable names
      create_symref: use existing ref-lock code
      create_symref: write reflog while holding lock
      run-command: don't warn on SIGPIPE deaths
      avoid shifting signed integers 31 bits
      bswap: add NO_UNALIGNED_LOADS define
      checkout,clone: check return value of create_symref
      lock_ref_sha1_basic: always fill old_oid while holding lock
      lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
      rebase: ignore failures from "gc --auto"
      shortlog: match both "Author:" and "author" on stdin
      shortlog: use strbufs to read from stdin
      shortlog: replace hand-parsing of author with pretty-printer
      shortlog: optimize "--summary" mode
      shortlog: optimize out useless "<none>" normalization
      shortlog: optimize out useless string list
      shortlog: don't warn on empty author
      filter-branch: resolve $commit^{tree} in no-index case
      clean: make is_git_repository a public function
      resolve_gitlink_ref: ignore non-repository paths
      t6300: use test_atom for some un-modern tests
      tag: do not show ambiguous tag names as "tags/foo"
      transport: drop support for git-over-rsync
      give "nbuf" strbuf a more meaningful name
      checkout-index: simplify "-z" option parsing
      checkout-index: handle "--no-prefix" option
      checkout-index: handle "--no-index" option
      checkout-index: disallow "--no-stage" option
      apply, ls-files: simplify "-z" parsing
      fmt_ident: refactor strictness checks
      test-path-utils: use xsnprintf in favor of strcpy
      rerere: replace strcpy with xsnprintf
      checkout: reorder check_filename conditional
      check_filename: tighten dwim-wildcard ambiguity
      get_sha1: don't die() on bogus search strings
      http-push: stop using name_path
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks
      git-config: better document default behavior for `--include`
      ref-filter: use string_list_split over strbuf_split
      reflog_expire_cfg: NUL-terminate pattern field
      add helpers for detecting size_t overflow
      tree-diff: catch integer overflow in combine_diff_path allocation
      diff: clarify textconv interface
      harden REALLOC_ARRAY and xcalloc against size_t overflow
      add helpers for allocating flex-array structs
      argv-array: add detach function
      convert manual allocations to argv_array
      convert trivial cases to ALLOC_ARRAY
      use xmallocz to avoid size arithmetic
      convert trivial cases to FLEX_ARRAY macros
      use st_add and st_mult for allocation size computation
      prepare_{git,shell}_cmd: use argv_array
      write_untracked_extension: use FLEX_ALLOC helper
      fast-import: simplify allocation in start_packfile
      fetch-pack: simplify add_sought_entry
      test-path-utils: fix normalize_path_copy output buffer size
      sequencer: simplify memory allocation of get_message
      git-compat-util: drop mempcpy compat code
      transport_anonymize_url: use xstrfmt
      diff_populate_gitlink: use a strbuf
      convert ewah/bitmap code to use xmalloc
      ewah: convert to REALLOC_ARRAY, etc
      merge-one-file: use empty blob for add/add base
      merge-tree: drop generate_common strategy
      xdiff: drop XDL_EMIT_COMMON
      t5313: test bounds-checks of corrupted/malicious pack/idx files
      nth_packed_object_offset: bounds-check extended offset
      use_pack: handle signed off_t overflow
      write_or_die: handle EPIPE in async threads
      fetch-pack: ignore SIGPIPE in sideband demuxer
      test_must_fail: report number of unexpected signal
      t5504: handle expected output from SIGPIPE death
      compat/mingw: brown paper bag fix for 50a6c8e
      t9700: fix test for perl older than 5.14

Jiang Xin (1):
      http: honor no_http env variable to bypass proxy

Johannes Schindelin (47):
      commit: allow editing the commit message even in shared repos
      Handle more file writes correctly in shared repos
      Refactor skipping DOS drive prefixes
      compat/basename: make basename() conform to POSIX
      compat/basename.c: provide a dirname() compatibility function
      t0060: verify that basename() and dirname() work as expected
      config.mak.uname: support MSys2
      config.mak.uname: supporting 64-bit MSys2
      fetch: release pack files before garbage-collecting
      am: release pack files before garbage-collecting
      merge: release pack files before garbage-collecting
      receive-pack: release pack files before garbage-collecting
      pull: allow interactive rebase with --rebase=interactive
      remote: handle the config setting branch.*.rebase=interactive
      completion: add missing branch.*.rebase values
      nedmalloc: allow compiling with MSys2's compiler
      compat/mingw: support MSys2-based MinGW build
      compat/winansi: support compiling with MSys2
      t0060: loosen overly strict expectations
      mingw: avoid redefining S_* constants
      mingw: avoid warnings when casting HANDLEs to int
      mingw: squash another warning about a cast
      mingw: uglify (a, 0) definitions to shut up warnings
      mingw: let's use gettext with MSYS2
      mingw: do not trust MSYS2's MinGW gettext.sh
      Git.pm: stop assuming that absolute paths start with a slash
      mingw: prepare the TMPDIR environment variable for shell scripts
      mingw: let lstat() fail with errno == ENOTDIR when appropriate
      merge-file: let conflict markers match end-of-line style of the context
      merge-file: ensure that conflict sections match eol style
      mingw: fix t5601-clone.sh
      mingw: accomodate t0060-path-utils for MSYS2
      mingw: disable mkfifo-based tests
      tests: turn off git-daemon tests if FIFOs are not available
      mingw: skip test in t1508 that fails due to path conversion
      mingw: fix t9700's assumption about directory separators
      mingw: work around pwd issues in the tests
      mingw: mark t9100's test cases with appropriate prereqs
      mingw: avoid illegal filename in t9118
      mingw: handle the missing POSIXPERM prereq in t9124
      mingw: skip a test in t9130 that cannot pass on Windows
      mingw: do not bother to test funny file names
      test-lib: limit the output of the yes utility
      gitignore: ignore generated test-fake-ssh executable
      t5505: 'remote add x y' should work when url.y.insteadOf = x
      git config: report when trying to modify a non-existing repo config
      Mark win32's pthread_exit() as NORETURN

Johannes Sixt (3):
      t/t5100: no need to use 'echo' command substitutions for globbing
      mingw: avoid linking to the C library's isalpha()
      t0001: fix GIT_* environment variable check under --valgrind

John Keeping (3):
      completion: add missing git-rebase options
      t8005: avoid grep on non-ASCII data
      t9200: avoid grep on non-ASCII data

Jon Griffiths (3):
      credential-cache--daemon: refactor check_socket_directory
      credential-cache--daemon: disallow relative socket path
      credential-cache--daemon: change to the socket dir on startup

Jonathan Nieder (1):
      submodule.c: write "Fetching submodule <foo>" to stderr

Junio C Hamano (46):
      First batch for post 2.7 cycle
      strbuf: miniscule style fix
      strbuf: make strbuf_getline_crlf() global
      strbuf: introduce strbuf_getline_{lf,nul}()
      mktree: there are only two possible line terminations
      check-attr: there are only two possible line terminations
      check-ignore: there are only two possible line terminations
      update-index: there are only two possible line terminations
      checkout-index: there are only two possible line terminations
      strbuf: give strbuf_getline() to the "most text friendly" variant
      hash-object: read --stdin-paths with strbuf_getline()
      revision: read --stdin with strbuf_getline()
      rev-parse: read parseopt spec with strbuf_getline()
      ident.c: read /etc/mailname with strbuf_getline()
      remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
      clone/sha1_file: read info/alternates with strbuf_getline()
      transport-helper: read helper response with strbuf_getline()
      cat-file: read batch stream with strbuf_getline()
      column: read lines with strbuf_getline()
      send-pack: read list of refs with strbuf_getline()
      grep: read -f file with strbuf_getline()
      test-sha1-array: read command stream with strbuf_getline()
      test-lib: clarify and tighten SANITY
      Second batch for 2.8 cycle
      Third batch for 2.8 cycle
      git: remove an early return from save_env_before_alias()
      git: protect against unbalanced calls to {save,restore}_env()
      git: simplify environment save/restore logic
      Fourth batch for 2.8.cycle
      Getting closer to 2.7.1
      restore_env(): free the saved environment variable once we are done
      Fifth batch for 2.8 cycle
      Git 2.7.1
      Sixth batch for the 2.8 cycle
      pager: lose a separate argv[]
      pager: factor out a helper to prepare a child process to run the pager
      am -i: fix "v"iew
      Start preparing for 2.7.2
      Seventh batch for the 2.8 cycle
      Git 2.7.2
      Eighth batch for 2.8
      Git 2.8-rc0
      Git 2.8-rc1
      gitignore: document that unignoring a directory unignores everything in it
      Git 2.7.3
      Git 2.8-rc2

Karsten Blees (1):
      mingw: factor out Windows specific environment setup

Karthik Nayak (10):
      ref-filter: bump 'used_atom' and related code to the top
      ref-filter: introduce struct used_atom
      ref-filter: introduce parsing functions for each valid atom
      ref-filter: introduce color_atom_parser()
      ref-filter: introduce parse_align_position()
      ref-filter: introduce align_atom_parser()
      ref-filter: align: introduce long-form syntax
      ref-filter: introduce remote_ref_atom_parser()
      ref-filter: introduce contents_atom_parser()
      ref-filter: introduce objectname_atom_parser()

Kazutoshi Satoda (2):
      git-svn: enable "svn.pathnameencoding" on dcommit
      git-svn: apply "svn.pathnameencoding" before URL encoding

Knut Franke (2):
      http: allow selection of proxy authentication method
      http: use credential API to handle proxy authentication

Lars Schneider (8):
      travis-ci: run previously failed tests first, then slowest to fastest
      travis-ci: explicity use container-based infrastructure
      convert: treat an empty string for clean/smudge filters as "cat"
      t: do not hide Git's exit code in tests using 'nul_to_q'
      rename git_config_from_buf to git_config_from_mem
      config: add 'origin_type' to config_source struct
      config: add '--show-origin' option to print the origin of a config value
      add DEVELOPER makefile knob to check for acknowledged warnings

Lars Vogel (1):
      git-add doc: do not say working directory when you mean working tree

Martin Amdisen (1):
      templates/hooks: fix minor typo in the sample update-hook

Matt McCutchen (1):
      Documentation/git-clean.txt: don't mention deletion of .git/modules/*

Matthew Kraai (1):
      Documentation: remove unnecessary backslashes

Matthieu Moy (7):
      Documentation/git-push: document that 'simple' is the default
      README: use markdown syntax
      README.md: add hyperlinks on filenames
      README.md: move the link to git-scm.com up
      README.md: don't call git stupid in the title
      README.md: move down historical explanation about the name
      push: remove "push.default is unset" warning message

Michael J Gruber (4):
      t9100: fix breakage when SHELL_PATH is not /bin/sh
      tests: rename work-tree tests to *work-tree*
      t/lib-httpd: load mod_unixd
      t5510: do not leave changed cwd

Mike Hommey (1):
      notes: allow treeish expressions as notes ref

Nguyễn Thái Ngọc Duy (25):
      blame: remove obsolete comment
      add and use a convenience macro ce_intent_to_add()
      Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
      git.c: make it clear save_env() is for alias handling only
      setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
      git.c: make sure we do not leak GIT_* to alias scripts
      grep: make it clear i-t-a entries are ignored
      dir.c: clean the entire struct in clear_exclude_list()
      Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"
      worktree.c: fix indentation
      diff-no-index: do not take a redundant prefix argument
      diff: make -O and --output work in subdirectory
      worktree: stop supporting moving worktrees manually
      rev-parse: take prefix into account in --git-common-dir
      dir.c: fix match_pathname()
      dir.c: support tracing exclude
      dir.c: support marking some patterns already matched
      dir.c: don't exclude whole dir prematurely
      worktree: fix "add -B"
      worktree add -B: do the checkout test before update branch
      sha1_file.c: mark strings for translation
      builtin/checkout.c: mark strings for translation
      builtin/clone.c: mark strings for translation
      ref-filter.c: mark strings for translation
      trailer.c: mark strings for translation

Pat Thoyts (1):
      t0008: avoid absolute path

Patrick Steinhardt (18):
      push: add '--delete' flag to synopsis
      push: add '-d' as shorthand for '--delete'
      config: introduce set_or_die wrappers
      branch: report errors in tracking branch setup
      branch: die on config error when unsetting upstream
      branch: die on config error when editing branch description
      submodule: die on config error when linking modules
      submodule--helper: die on config error when cloning module
      remote: die on config error when setting URL
      remote: die on config error when setting/adding branches
      remote: die on config error when manipulating remotes
      clone: die on config error in cmd_clone
      init-db: die on config errors when initializing empty repo
      sequencer: die on config error when saving replay opts
      compat: die when unable to set core.precomposeunicode
      config: rename git_config_set to git_config_set_gently
      config: rename git_config_set_or_die to git_config_set
      xdiff/xmerge: fix memory leak in xdl_merge

Paul Wagland (2):
      completion: complete show-branch "--date-order"
      completion: update completion arguments for stash

Rob Mayoff (1):
      contrib/subtree: unwrap tag refs

Romain Picard (1):
      git-p4.py: add support for filetype change

SZEDER Gábor (2):
      t6050-replace: make failing editor test more robust
      completion: fix mis-indentation in _git_stash()

Sebastian Schuberth (3):
      docs: clarify that passing --depth to git-clone implies --single-branch
      docs: say "commits" in the --depth option wording for git-clone
      docs: clarify that --depth for git-fetch works with newly initialized repos

Shawn O. Pearce (1):
      remote-curl: include curl_errorstr on SSL setup failures

Stefan Beller (10):
      xread: poll on non blocking fds
      strbuf: add strbuf_read_once to read without blocking
      sigchain: add command to pop all common signals
      run-command: add an asynchronous parallel child processor
      fetch_populated_submodules: use new parallel job processing
      submodules: allow parallel fetching, add tests and documentation
      submodule helper list: respect correct path prefix
      submodule: try harder to fetch needed sha1 by direct fetching sha1
      run-command: do not pass child process data into callbacks
      Documentation: reword rebase summary

Stephen P. Smith (4):
      user-manual: remove temporary branch entry from todo list
      glossary: define the term shallow clone
      user-manual: add section documenting shallow clones
      user-manual: add addition gitweb information

Thomas Ackermann (1):
      documentation: fix some typos

Thomas Braun (1):
      completion: complete "diff --word-diff-regex="

Thomas Gummerer (11):
      t7810: correct --no-index test
      builtin/grep: add grep.fallbackToNoIndex config
      ls-remote: document --quiet option
      ls-remote: document --refs option
      ls-remote: fix synopsis
      ls-remote: use parse-options api
      ls-remote: add support for showing symrefs
      remote: use parse_config_key
      remote: simplify remote_is_configured()
      remote: actually check if remote exits
      remote: use remote_is_configured() for add and rename

Tobias Klauser (2):
      trailer: allow to write to files other than stdout
      interpret-trailers: add option for in-place editing

Torsten Bögershausen (9):
      ls-files: add eol diagnostics
      t0027: add tests for get_stream_filter()
      convert.c: remove unused parameter 'path'
      convert.c: remove input_crlf_action()
      convert.c: use text_eol_is_crlf()
      convert.c: refactor crlf_action
      convert.c: simplify text_stat
      convert.c: correct attr_action()
      config.mak.uname: use clang for Mac OS X 10.6

Victor Leschuk (3):
      grep: allow threading even on a single-core machine
      grep: slight refactoring to the code that disables threading
      grep: add --threads=<num> option and grep.threads configuration

Will Palmer (2):
      test for '!' handling in rev-parse's named commits
      object name: introduce '^{/!-<negative pattern>}' notation

brian m. carlson (1):
      http: add option to try authentication without username

Øyvind A. Holm (1):
      gitweb: squelch "uninitialized value" warning

마누엘 (1):
      mingw: try to delete target directory before renaming

^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.8.0-rc1
@ 2016-03-04 22:31  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-03-04 22:31 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

A release candidate Git v2.8.0-rc1 is now available for testing
at the usual places.  It is comprised of 453 non-merge commits
since v2.7.0, contributed by 59 people, 19 of which are new faces.

There still is a known regression around "git status" (and "ls-files
-o") relative to v2.7.2, which we may end up resolving by reverting
a topic before v2.8.0 final.  We'll see how it goes.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.8.0-rc1' tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.7.0 are as follows.
Welcome to the Git development community!

  마누엘, Andrew Wheeler, Changwoo Ryu, Christoph Egger,
  Dan Aloni, Dave Ware, David A. Wheeler, Dickson Wong, Felipe
  Gonçalves Assis, GyuYong Jung, Jon Griffiths, Kazutoshi Satoda,
  Lars Vogel, Martin Amdisen, Matthew Kraai, Paul Wagland, Rob
  Mayoff, Romain Picard, and Victor Leschuk.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alexander Kuleshov, Alex Henrie, brian m. carlson, Christian
  Couder, David A. Greene, David Turner, Dennis Kaarsemaker,
  Edmundo Carmona Antoranz, Elia Pinto, Eric Wong, Jacob Keller,
  Jeff King, Johannes Schindelin, Johannes Sixt, John Keeping,
  Jonathan Nieder, Junio C Hamano, Karsten Blees, Karthik Nayak,
  Knut Franke, Lars Schneider, Matthieu Moy, Matt McCutchen,
  Michael J Gruber, Mike Hommey, Nguyễn Thái Ngọc Duy,
  Øyvind A. Holm, Patrick Steinhardt, Pat Thoyts, Sebastian
  Schuberth, Shawn O. Pearce, Stefan Beller, Stephen P. Smith,
  SZEDER Gábor, Thomas Ackermann, Thomas Braun, Thomas Gummerer,
  Tobias Klauser, Torsten Bögershausen, and Will Palmer.

----------------------------------------------------------------

Git 2.8 Release Notes (draft)
=============================

Backward compatibility note
---------------------------

The rsync:// transport has been removed.


Updates since v2.7
------------------

UI, Workflows & Features

 * It turns out "git clone" over rsync transport has been broken when
   the source repository has packed references for a long time, and
   nobody noticed nor complained about it.

 * "branch --delete" has "branch -d" but "push --delete" does not.

 * "git blame" learned to produce the progress eye-candy when it takes
   too much time before emitting the first line of the result.

 * "git grep" can now be configured (or told from the command line)
   how many threads to use when searching in the working tree files.

 * Some "git notes" operations, e.g. "git log --notes=<note>", should
   be able to read notes from any tree-ish that is shaped like a notes
   tree, but the notes infrastructure required that the argument must
   be a ref under refs/notes/.  Loosen it to require a valid ref only
   when the operation would update the notes (in which case we must
   have a place to store the updated notes tree, iow, a ref).

 * "git grep" by default does not fall back to its "--no-index"
   behaviour outside a directory under Git's control (otherwise the
   user may by mistake end up running a huge recursive search); with a
   new configuration (set in $HOME/.gitconfig--by definition this
   cannot be set in the config file per project), this safety can be
   disabled.

 * "git pull --rebase" has been extended to allow invoking
   "rebase -i".

 * "git p4" learned to cope with the type of a file getting changed.

 * "git format-patch" learned to notice format.outputDirectory
   configuration variable.  This allows "-o <dir>" option to be
   omitted on the command line if you always use the same directory in
   your workflow.

 * "interpret-trailers" has been taught to optionally update a file in
   place, instead of always writing the result to the standard output.

 * Many commands that read files that are expected to contain text
   that is generated (or can be edited) by the end user to control
   their behaviour (e.g. "git grep -f <filename>") have been updated
   to be more tolerant to lines that are terminated with CRLF (they
   used to treat such a line to contain payload that ends with CR,
   which is usually not what the users expect).

 * "git notes merge" used to limit the source of the merged notes tree
   to somewhere under refs/notes/ hierarchy, which was too limiting
   when inventing a workflow to exchange notes with remote
   repositories using remote-tracking notes trees (located in e.g.
   refs/remote-notes/ or somesuch).

 * "git ls-files" learned a new "--eol" option to help diagnose
   end-of-line problems.

 * "ls-remote" learned an option to show which branch the remote
   repository advertises as its primary by pointing its HEAD at.

 * New http.proxyAuthMethod configuration variable can be used to
   specify what authentication method to use, as a way to work around
   proxies that do not give error response expected by libcurl when
   CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
   has been taught to use credential API to store the authentication
   material in user's keyrings.

 * Update the untracked cache subsystem and change its primary UI from
   "git update-index" to "git config".

 * There were a few "now I am doing this thing" progress messages in
   the TCP connection code that can be triggered by setting a verbose
   option internally in the code, but "git fetch -v" and friends never
   passed the verbose option down to that codepath.

 * Clean/smudge filters defined in a configuration file of lower
   precedence can now be overridden to be a pass-through no-op by
   setting the variable to an empty string.

 * A new "<branch>^{/!-<pattern>}" notation can be used to name a
   commit that is reachable from <branch> that does not match the
   given <pattern>.

 * The "user.useConfigOnly" configuration variable can be used to
   force the user to always set user.email & user.name configuration
   variables, serving as a reminder for those who work on multiple
   projects and do not want to put these in their $HOME/.gitconfig.

 * "git fetch" and friends that make network connections can now be
   told to only use ipv4 (or ipv6).

 * Some authentication methods do not need username or password, but
   libcurl needs some hint that it needs to perform authentication.
   Supplying an empty username and password string is a valid way to
   do so, but you can set the http.[<url>.]emptyAuth configuration
   variable to achieve the same, if you find it cleaner.

 * You can now set http.[<url>.]pinnedpubkey to specify the pinned
   public key when building with recent enough versions of libcURL.

 * The configuration system has been taught to phrase where it found a
   bad configuration variable in a better way in its error messages.
   "git config" learnt a new "--show-origin" option to indicate where
   the values come from.

 * The "credential-cache" daemon process used to run in whatever
   directory it happened to start in, but this made umount(2)ing the
   filesystem that houses the repository harder; now the process
   chdir()s to the directory that house its own socket on startup.

 * When "git submodule update" did not result in fetching the commit
   object in the submodule that is referenced by the superproject, the
   command learned to retry another fetch, specifically asking for
   that commit that may not be connected to the refs it usually
   fetches.

 * "git merge-recursive" learned "--no-renames" option to disable its
   rename detection logic.

 * Across the transition at around Git version 2.0, the user used to
   get a pretty loud warning when running "git push" without setting
   push.default configuration variable.  We no longer warn, given that
   the transition is over long time ago.

 * README has been renamed to README.md and its contents got tweaked
   slightly to make it easier on the eyes.


Performance, Internal Implementation, Development Support etc.

 * Add a framework to spawn a group of processes in parallel, and use
   it to run "git fetch --recurse-submodules" in parallel.

 * A slight update to the Makefile to mark "phoney" targets
   as such correctly.

 * In-core storage of the reverse index for .pack files (which lets
   you go from a pack offset to an object name) has been streamlined.

 * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
   $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
   handling by overwriting GIT_WORK_TREE environment variable to
   affect subprocesses when set_git_work_tree() gets called, which
   resulted in a rather unpleasant regression to "clone" and "init".
   Try to address the same issue by always restoring the environment
   and respawning the real underlying command when handling alias.

 * The low-level code that is used to create symbolic references has
   been updated to share more code with the code that deals with
   normal references.

 * strbuf_getline() and friends have been redefined to make it easier
   to identify which callsite of (new) strbuf_getline_lf() should
   allow and silently ignore carriage-return at the end of the line to
   help users on DOSsy systems.

 * "git shortlog" used to accumulate various pieces of information
   regardless of what was asked to be shown in the final output.  It
   has been optimized by noticing what need not to be collected
   (e.g. there is no need to collect the log messages when showing
   only the number of changes).

 * "git checkout $branch" (and other operations that share the same
   underlying machinery) has been optimized.

 * Automated tests in Travis CI environment has been optimized by
   persisting runtime statistics of previous "prove" run, executing
   tests that take longer before other ones; this reduces the total
   wallclock time.

 * Test scripts have been updated to remove assumptions that are not
   portable between Git for POSIX and Git for Windows, or to skip ones
   with expectations that are not satisfiable on Git for Windows.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in test-path-utils that are already safe has
   been rewritten to avoid false wanings.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in "git rerere" that are already safe has been
   rewritten to avoid false wanings.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat.  The API has been removed and its users have been
   rewritten to simplify the overall code complexity.

 * Help those who debug http(s) part of the system.
   (merge 0054045 sp/remote-curl-ssl-strerror later to maint).

 * The internal API to interact with "remote.*" configuration
   variables has been streamlined.

 * The ref-filter's format-parsing code has been refactored, in
   preparation for "branch --format" and friends.

 * Traditionally, the tests that try commands that work on the
   contents in the working tree were named with "worktree" in their
   filenames, but with the recent addition of "git worktree"
   subcommand, whose tests are also named similarly, it has become
   harder to tell them apart.  The traditional tests have been renamed
   to use "work-tree" instead in an attempt to differentiate them.
   (merge 5549029 mg/work-tree-tests later to maint).

 * Many codepaths forget to check return value from git_config_set();
   the function is made to die() to make sure we do not proceed when
   setting a configuration variable failed.
   (merge 3d18064 ps/config-error later to maint).

 * Handling of errors while writing into our internal asynchronous
   process has been made more robust, which reduces flakiness in our
   tests.
   (merge 43f3afc jk/epipe-in-async later to maint).

 * There is a new DEVELOPER knob that enables many compiler warning
   options in the Makefile.

 * The way the test scripts configure the Apache web server has been
   updated to work also for Apache 2.4 running on RedHat derived
   distros.

 * Out of maintenance gcc on OSX 10.6 fails to compile the code in
   'master'; work it around by using clang by default on the platform.


Also contains various documentation updates and code clean-ups.


Fixes since v2.7
----------------

Unless otherwise noted, all the fixes since v2.7 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * An earlier change in 2.5.x-era broke users' hooks and aliases by
   exporting GIT_WORK_TREE to point at the root of the working tree,
   interfering when they tried to use a different working tree without
   setting GIT_WORK_TREE environment themselves.

 * The "exclude_list" structure has the usual "alloc, nr" pair of
   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
   array.

 * Paths that have been told the index about with "add -N" are not
   quite yet in the index, but a few commands behaved as if they
   already are in a harmful way.

 * "git send-email" was confused by escaped quotes stored in the alias
   files saved by "mutt", which has been corrected.

 * A few unportable C construct have been spotted by clang compiler
   and have been fixed.

 * The documentation has been updated to hint the connection between
   the '--signoff' option and DCO.

 * "git reflog" incorrectly assumed that all objects that used to be
   at the tip of a ref must be commits, which caused it to segfault.

 * The ignore mechanism saw a few regressions around untracked file
   listing and sparse checkout selection areas in 2.7.0; the change
   that is responsible for the regression has been reverted.

 * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
   done.  This however did not work well if the repository is set to
   be shared with core.sharedRepository and the umask of the previous
   user is tighter.  They have been made to work better by calling
   unlink(2) and retrying after fopen(3) fails with EPERM.

 * Asking gitweb for a nonexistent commit left a warning in the server
   log.

   Somebody may want to follow this up with an additional test, perhaps?
   IIRC, we do test that no Perl warnings are given to the server log,
   so this should have been caught if our test coverage were good.

 * "git rebase", unlike all other callers of "gc --auto", did not
   ignore the exit code from "gc --auto".

 * Many codepaths that run "gc --auto" before exiting kept packfiles
   mapped and left the file descriptors to them open, which was not
   friendly to systems that cannot remove files that are open.  They
   now close the packs before doing so.

 * A recent optimization to filter-branch in v2.7.0 introduced a
   regression when --prune-empty filter is used, which has been
   corrected.

 * The description for SANITY prerequisite the test suite uses has
   been clarified both in the comment and in the implementation.

 * "git tag" started listing a tag "foo" as "tags/foo" when a branch
   named "foo" exists in the same repository; remove this unnecessary
   disambiguation, which is a regression introduced in v2.7.0.

 * The way "git svn" uses auth parameter was broken by Subversion
   1.9.0 and later.

 * The "split" subcommand of "git subtree" (in contrib/) incorrectly
   skipped merges when it shouldn't, which was corrected.

 * A few options of "git diff" did not work well when the command was
   run from a subdirectory.

 * The command line completion learned a handful of additional options
   and command specific syntax.

 * dirname() emulation has been added, as Msys2 lacks it.

 * The underlying machinery used by "ls-files -o" and other commands
   have been taught not to create empty submodule ref cache for a
   directory that is not a submodule.  This removes a ton of wasted
   CPU cycles.

 * "git worktree" had a broken code that attempted to auto-fix
   possible inconsistency that results from end-users moving a
   worktree to different places without telling Git (the original
   repository needs to maintain backpointers to its worktrees, but
   "mv" run by end-users who are not familiar with that fact will
   obviously not adjust them), which actually made things worse
   when triggered.

 * The low-level merge machinery has been taught to use CRLF line
   termination when inserting conflict markers to merged contents that
   are themselves CRLF line-terminated.

 * "git push --force-with-lease" has been taught to report if the push
   needed to force (or fast-forwarded).

 * The emulated "yes" command used in our test scripts has been
   tweaked not to spend too much time generating unnecessary output
   that is not used, to help those who test on Windows where it would
   not stop until it fills the pipe buffer due to lack of SIGPIPE.

 * The documentation for "git clean" has been corrected; it mentioned
   that .git/modules/* are removed by giving two "-f", which has never
   been the case.

 * The vimdiff backend for "git mergetool" has been tweaked to arrange
   and number buffers in the order that would match the expectation of
   majority of people who read left to right, then top down and assign
   buffers 1 2 3 4 "mentally" to local base remote merge windows based
   on that order.

 * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
   rev, i.e. the object named by the the pathname with wildcard
   characters in a tree object.
   (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint).

 * "git rev-parse --git-common-dir" used in the worktree feature
   misbehaved when run from a subdirectory.
   (merge 17f1365 nd/git-common-dir-fix later to maint).

 * Another try to add support to the ignore mechanism that lets you
   say "this is excluded" and then later say "oh, no, this part (that
   is a subset of the previous part) is not excluded".

 * "git worktree add -B <branchname>" did not work.

 * The "v(iew)" subcommand of the interactive "git am -i" command was
   broken in 2.6.0 timeframe when the command was rewritten in C.
   (merge 708b8cc jc/am-i-v-fix later to maint).

 * "git merge-tree" used to mishandle "both sides added" conflict with
   its own "create a fake ancestor file that has the common parts of
   what both sides have added and do a 3-way merge" logic; this has
   been updated to use the usual "3-way merge with an empty blob as
   the fake common ancestor file" approach used in the rest of the
   system.
   (merge 907681e jk/no-diff-emit-common later to maint).

 * The memory ownership rule of fill_textconv() API, which was a bit
   tricky, has been documented a bit better.
   (merge a64e6a4 jk/more-comments-on-textconv later to maint).

 * Update various codepaths to avoid manually-counted malloc().
   (merge 08c95df jk/tighten-alloc later to maint).

 * The documentation did not clearly state that the 'simple' mode is
   now the default for "git push" when push.default configuration is
   not set.
   (merge f6b1fb3 mm/push-simple-doc later to maint).

 * Recent versions of GNU grep are pickier when their input contains
   arbitrary binary data, which some of our tests uses.  Rewrite the
   tests to sidestep the problem.
   (merge 3b1442d jk/grep-binary-workaround-in-test later to maint).

 * A helper function "git submodule" uses since v2.7.0 to list the
   modules that match the pathspec argument given to its subcommands
   (e.g. "submodule add <repo> <path>") has been fixed.
   (merge 2b56bb7 sb/submodule-module-list-fix later to maint).

 * "git config section.var value" to set a value in per-repository
   configuration file failed when it was run outside any repository,
   but didn't say the reason correctly.
   (merge 638fa62 js/config-set-in-non-repository later to maint).

 * The code to read the pack data using the offsets stored in the pack
   idx file has been made more carefully check the validity of the
   data in the idx.
   (merge 7465feb jk/pack-idx-corruption-safety later to maint).

 * Other minor clean-ups and documentation updates
   (merge f459823 ak/extract-argv0-last-dir-sep later to maint).
   (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint).
   (merge 4867f11 ps/plug-xdl-merge-leak later to maint).
   (merge 4938686 dt/initial-ref-xn-commit-doc later to maint).
   (merge 9537f21 ma/update-hooks-sample-typofix later to maint).

----------------------------------------------------------------

Changes since v2.7.0 are as follows:

Alex Henrie (1):
      stripspace: call U+0020 a "space" instead of a "blank"

Alexander Kuleshov (3):
      format-patch: introduce format.outputDirectory configuration
      exec_cmd.c: use find_last_dir_sep() for code simplification
      git.c: simplify stripping extension of a file in handle_builtin()

Andrew Wheeler (1):
      push: fix ref status reporting for --force-with-lease

Changwoo Ryu (1):
      l10n: ko.po: Add Korean translation

Christian Couder (11):
      dir: free untracked cache when removing it
      update-index: use enum for untracked cache options
      update-index: add --test-untracked-cache
      update-index: add untracked cache notifications
      update-index: move 'uc' var declaration
      dir: add {new,add}_untracked_cache()
      dir: add remove_untracked_cache()
      dir: simplify untracked cache "ident" field
      config: add core.untrackedCache
      test-dump-untracked-cache: don't modify the untracked cache
      t7063: add tests for core.untrackedCache

Christoph Egger (1):
      http: implement public key pinning

Dan Aloni (1):
      ident: add user.useConfigOnly boolean for when ident shouldn't be guessed

Dave Ware (1):
      contrib/subtree: fix "subtree split" skipped-merge bug

David A. Greene (1):
      contrib/subtree: Make testing easier

David A. Wheeler (1):
      Expand documentation describing --signoff

David Turner (3):
      do_compare_entry: use already-computed path
      unpack-trees: fix accidentally quadratic behavior
      refs: document transaction semantics

Dennis Kaarsemaker (1):
      reflog-walk: don't segfault on non-commit sha1's in the reflog

Dickson Wong (1):
      mergetool: reorder vim/gvim buffers in three-way diffs

Edmundo Carmona Antoranz (1):
      blame: add support for --[no-]progress option

Elia Pinto (92):
      Makefile: add missing phony target
      contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
      contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
      git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
      t/lib-httpd.sh: use the $( ... ) construct for command substitution
      test-sha1.sh: use the $( ... ) construct for command substitution
      unimplemented.sh: use the $( ... ) construct for command substitution
      t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
      t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
      t/t1410-reflog.sh: use the $( ... ) construct for command substitution
      t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
      t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
      t/t1700-split-index.sh: use the $( ... ) construct for command substitution
      t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
      t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
      t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
      t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
      t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
      t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
      t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
      t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
      t/t3600-rm.sh: use the $( ... ) construct for command substitution
      t/t3700-add.sh: use the $( ... ) construct for command substitution
      t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
      t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
      t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
      t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
      t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
      t/t5304-prune.sh: use the $( ... ) construct for command substitution
      t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
      t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
      t/t5505-remote.sh: use the $( ... ) construct for command substitution
      t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
      t/t5510-fetch.sh: use the $( ... ) construct for command substitution
      t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
      t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
      t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
      t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
      t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
      t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
      t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
      t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
      t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
      t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
      t/t5601-clone.sh: use the $( ... ) construct for command substitution
      t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
      t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
      t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
      t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
      t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
      t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
      t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
      t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
      t/t7001-mv.sh: use the $( ... ) construct for command substitution
      t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
      t/t7004-tag.sh: use the $( ... ) construct for command substitution
      t/t7006-pager.sh: use the $( ... ) construct for command substitution
      t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
      t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
      t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
      t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
      t/t7700-repack.sh: use the $( ... ) construct for command substitution
      t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
      t/t9001-send-email.sh: use the $( ... ) construct for command substitution
      t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
      t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
      t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
      t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
      t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
      t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
      t9300-fast-import.sh: use the $( ... ) construct for command substitution
      t9350-fast-export.sh: use the $( ... ) construct for command substitution
      t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
      t9901-git-web--browse.sh: use the $( ... ) construct for command substitution

Eric Wong (8):
      git-send-email: do not double-escape quotes from mutt
      for-each-ref: document `creatordate` and `creator` fields
      git-svn: fix auth parameter handling on SVN 1.9.0+
      pass transport verbosity down to git_connect
      connect & http: support -4 and -6 switches for remote operations
      t5570: add tests for "git {clone,fetch,pull} -v"
      git-svn: hoist out utf8 prep from t9129 to lib-git-svn
      tests: remove no-op full-svn-test target

Felipe Gonçalves Assis (7):
      merge-recursive: option to disable renames
      merge-recursive: more consistent interface
      merge-strategies.txt: fix typo
      merge-recursive: find-renames resets threshold
      t3034: add rename threshold tests
      t3034: test option to disable renames
      t3034: test deprecated interface

GyuYong Jung (1):
      git-cvsserver.perl: fix typo

Jacob Keller (1):
      notes: allow merging from arbitrary references

Jeff King (79):
      pack-revindex: drop hash table
      pack-revindex: store entries directly in packed_git
      create_symref: modernize variable names
      create_symref: use existing ref-lock code
      create_symref: write reflog while holding lock
      run-command: don't warn on SIGPIPE deaths
      avoid shifting signed integers 31 bits
      bswap: add NO_UNALIGNED_LOADS define
      checkout,clone: check return value of create_symref
      lock_ref_sha1_basic: always fill old_oid while holding lock
      lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
      rebase: ignore failures from "gc --auto"
      shortlog: match both "Author:" and "author" on stdin
      shortlog: use strbufs to read from stdin
      shortlog: replace hand-parsing of author with pretty-printer
      shortlog: optimize "--summary" mode
      shortlog: optimize out useless "<none>" normalization
      shortlog: optimize out useless string list
      shortlog: don't warn on empty author
      filter-branch: resolve $commit^{tree} in no-index case
      clean: make is_git_repository a public function
      resolve_gitlink_ref: ignore non-repository paths
      t6300: use test_atom for some un-modern tests
      tag: do not show ambiguous tag names as "tags/foo"
      transport: drop support for git-over-rsync
      give "nbuf" strbuf a more meaningful name
      checkout-index: simplify "-z" option parsing
      checkout-index: handle "--no-prefix" option
      checkout-index: handle "--no-index" option
      checkout-index: disallow "--no-stage" option
      apply, ls-files: simplify "-z" parsing
      fmt_ident: refactor strictness checks
      test-path-utils: use xsnprintf in favor of strcpy
      rerere: replace strcpy with xsnprintf
      checkout: reorder check_filename conditional
      check_filename: tighten dwim-wildcard ambiguity
      get_sha1: don't die() on bogus search strings
      http-push: stop using name_path
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks
      git-config: better document default behavior for `--include`
      ref-filter: use string_list_split over strbuf_split
      reflog_expire_cfg: NUL-terminate pattern field
      add helpers for detecting size_t overflow
      tree-diff: catch integer overflow in combine_diff_path allocation
      diff: clarify textconv interface
      harden REALLOC_ARRAY and xcalloc against size_t overflow
      add helpers for allocating flex-array structs
      argv-array: add detach function
      convert manual allocations to argv_array
      convert trivial cases to ALLOC_ARRAY
      use xmallocz to avoid size arithmetic
      convert trivial cases to FLEX_ARRAY macros
      use st_add and st_mult for allocation size computation
      prepare_{git,shell}_cmd: use argv_array
      write_untracked_extension: use FLEX_ALLOC helper
      fast-import: simplify allocation in start_packfile
      fetch-pack: simplify add_sought_entry
      test-path-utils: fix normalize_path_copy output buffer size
      sequencer: simplify memory allocation of get_message
      git-compat-util: drop mempcpy compat code
      transport_anonymize_url: use xstrfmt
      diff_populate_gitlink: use a strbuf
      convert ewah/bitmap code to use xmalloc
      ewah: convert to REALLOC_ARRAY, etc
      merge-one-file: use empty blob for add/add base
      merge-tree: drop generate_common strategy
      xdiff: drop XDL_EMIT_COMMON
      t5313: test bounds-checks of corrupted/malicious pack/idx files
      nth_packed_object_offset: bounds-check extended offset
      use_pack: handle signed off_t overflow
      write_or_die: handle EPIPE in async threads
      fetch-pack: ignore SIGPIPE in sideband demuxer
      test_must_fail: report number of unexpected signal
      t5504: handle expected output from SIGPIPE death
      compat/mingw: brown paper bag fix for 50a6c8e
      t9700: fix test for perl older than 5.14

Johannes Schindelin (47):
      commit: allow editing the commit message even in shared repos
      Handle more file writes correctly in shared repos
      Refactor skipping DOS drive prefixes
      compat/basename: make basename() conform to POSIX
      compat/basename.c: provide a dirname() compatibility function
      t0060: verify that basename() and dirname() work as expected
      config.mak.uname: support MSys2
      config.mak.uname: supporting 64-bit MSys2
      fetch: release pack files before garbage-collecting
      am: release pack files before garbage-collecting
      merge: release pack files before garbage-collecting
      receive-pack: release pack files before garbage-collecting
      pull: allow interactive rebase with --rebase=interactive
      remote: handle the config setting branch.*.rebase=interactive
      completion: add missing branch.*.rebase values
      nedmalloc: allow compiling with MSys2's compiler
      compat/mingw: support MSys2-based MinGW build
      compat/winansi: support compiling with MSys2
      t0060: loosen overly strict expectations
      mingw: avoid redefining S_* constants
      mingw: avoid warnings when casting HANDLEs to int
      mingw: squash another warning about a cast
      mingw: uglify (a, 0) definitions to shut up warnings
      mingw: let's use gettext with MSYS2
      mingw: do not trust MSYS2's MinGW gettext.sh
      Git.pm: stop assuming that absolute paths start with a slash
      mingw: prepare the TMPDIR environment variable for shell scripts
      mingw: let lstat() fail with errno == ENOTDIR when appropriate
      merge-file: let conflict markers match end-of-line style of the context
      merge-file: ensure that conflict sections match eol style
      mingw: fix t5601-clone.sh
      mingw: accomodate t0060-path-utils for MSYS2
      mingw: disable mkfifo-based tests
      tests: turn off git-daemon tests if FIFOs are not available
      mingw: skip test in t1508 that fails due to path conversion
      mingw: fix t9700's assumption about directory separators
      mingw: work around pwd issues in the tests
      mingw: mark t9100's test cases with appropriate prereqs
      mingw: avoid illegal filename in t9118
      mingw: handle the missing POSIXPERM prereq in t9124
      mingw: skip a test in t9130 that cannot pass on Windows
      mingw: do not bother to test funny file names
      test-lib: limit the output of the yes utility
      gitignore: ignore generated test-fake-ssh executable
      t5505: 'remote add x y' should work when url.y.insteadOf = x
      git config: report when trying to modify a non-existing repo config
      Mark win32's pthread_exit() as NORETURN

Johannes Sixt (3):
      t/t5100: no need to use 'echo' command substitutions for globbing
      mingw: avoid linking to the C library's isalpha()
      t0001: fix GIT_* environment variable check under --valgrind

John Keeping (3):
      completion: add missing git-rebase options
      t8005: avoid grep on non-ASCII data
      t9200: avoid grep on non-ASCII data

Jon Griffiths (3):
      credential-cache--daemon: refactor check_socket_directory
      credential-cache--daemon: disallow relative socket path
      credential-cache--daemon: change to the socket dir on startup

Jonathan Nieder (1):
      submodule.c: write "Fetching submodule <foo>" to stderr

Junio C Hamano (43):
      First batch for post 2.7 cycle
      strbuf: miniscule style fix
      strbuf: make strbuf_getline_crlf() global
      strbuf: introduce strbuf_getline_{lf,nul}()
      mktree: there are only two possible line terminations
      check-attr: there are only two possible line terminations
      check-ignore: there are only two possible line terminations
      update-index: there are only two possible line terminations
      checkout-index: there are only two possible line terminations
      strbuf: give strbuf_getline() to the "most text friendly" variant
      hash-object: read --stdin-paths with strbuf_getline()
      revision: read --stdin with strbuf_getline()
      rev-parse: read parseopt spec with strbuf_getline()
      ident.c: read /etc/mailname with strbuf_getline()
      remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
      clone/sha1_file: read info/alternates with strbuf_getline()
      transport-helper: read helper response with strbuf_getline()
      cat-file: read batch stream with strbuf_getline()
      column: read lines with strbuf_getline()
      send-pack: read list of refs with strbuf_getline()
      grep: read -f file with strbuf_getline()
      test-sha1-array: read command stream with strbuf_getline()
      test-lib: clarify and tighten SANITY
      Second batch for 2.8 cycle
      Third batch for 2.8 cycle
      git: remove an early return from save_env_before_alias()
      git: protect against unbalanced calls to {save,restore}_env()
      git: simplify environment save/restore logic
      Fourth batch for 2.8.cycle
      Getting closer to 2.7.1
      restore_env(): free the saved environment variable once we are done
      Fifth batch for 2.8 cycle
      Git 2.7.1
      Sixth batch for the 2.8 cycle
      pager: lose a separate argv[]
      pager: factor out a helper to prepare a child process to run the pager
      am -i: fix "v"iew
      Start preparing for 2.7.2
      Seventh batch for the 2.8 cycle
      Git 2.7.2
      Eighth batch for 2.8
      Git 2.8-rc0
      Git 2.8-rc1

Karsten Blees (1):
      mingw: factor out Windows specific environment setup

Karthik Nayak (10):
      ref-filter: bump 'used_atom' and related code to the top
      ref-filter: introduce struct used_atom
      ref-filter: introduce parsing functions for each valid atom
      ref-filter: introduce color_atom_parser()
      ref-filter: introduce parse_align_position()
      ref-filter: introduce align_atom_parser()
      ref-filter: align: introduce long-form syntax
      ref-filter: introduce remote_ref_atom_parser()
      ref-filter: introduce contents_atom_parser()
      ref-filter: introduce objectname_atom_parser()

Kazutoshi Satoda (2):
      git-svn: enable "svn.pathnameencoding" on dcommit
      git-svn: apply "svn.pathnameencoding" before URL encoding

Knut Franke (2):
      http: allow selection of proxy authentication method
      http: use credential API to handle proxy authentication

Lars Schneider (8):
      travis-ci: run previously failed tests first, then slowest to fastest
      travis-ci: explicity use container-based infrastructure
      convert: treat an empty string for clean/smudge filters as "cat"
      t: do not hide Git's exit code in tests using 'nul_to_q'
      rename git_config_from_buf to git_config_from_mem
      config: add 'origin_type' to config_source struct
      config: add '--show-origin' option to print the origin of a config value
      add DEVELOPER makefile knob to check for acknowledged warnings

Lars Vogel (1):
      git-add doc: do not say working directory when you mean working tree

Martin Amdisen (1):
      templates/hooks: fix minor typo in the sample update-hook

Matt McCutchen (1):
      Documentation/git-clean.txt: don't mention deletion of .git/modules/*

Matthew Kraai (1):
      Documentation: remove unnecessary backslashes

Matthieu Moy (7):
      Documentation/git-push: document that 'simple' is the default
      README: use markdown syntax
      README.md: add hyperlinks on filenames
      README.md: move the link to git-scm.com up
      README.md: don't call git stupid in the title
      README.md: move down historical explanation about the name
      push: remove "push.default is unset" warning message

Michael J Gruber (3):
      t9100: fix breakage when SHELL_PATH is not /bin/sh
      tests: rename work-tree tests to *work-tree*
      t/lib-httpd: load mod_unixd

Mike Hommey (1):
      notes: allow treeish expressions as notes ref

Nguyễn Thái Ngọc Duy (25):
      blame: remove obsolete comment
      add and use a convenience macro ce_intent_to_add()
      Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
      git.c: make it clear save_env() is for alias handling only
      setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
      git.c: make sure we do not leak GIT_* to alias scripts
      grep: make it clear i-t-a entries are ignored
      dir.c: clean the entire struct in clear_exclude_list()
      Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"
      worktree.c: fix indentation
      diff-no-index: do not take a redundant prefix argument
      diff: make -O and --output work in subdirectory
      worktree: stop supporting moving worktrees manually
      rev-parse: take prefix into account in --git-common-dir
      dir.c: fix match_pathname()
      dir.c: support tracing exclude
      dir.c: support marking some patterns already matched
      dir.c: don't exclude whole dir prematurely
      worktree: fix "add -B"
      worktree add -B: do the checkout test before update branch
      sha1_file.c: mark strings for translation
      builtin/checkout.c: mark strings for translation
      builtin/clone.c: mark strings for translation
      ref-filter.c: mark strings for translation
      trailer.c: mark strings for translation

Pat Thoyts (1):
      t0008: avoid absolute path

Patrick Steinhardt (18):
      push: add '--delete' flag to synopsis
      push: add '-d' as shorthand for '--delete'
      config: introduce set_or_die wrappers
      branch: report errors in tracking branch setup
      branch: die on config error when unsetting upstream
      branch: die on config error when editing branch description
      submodule: die on config error when linking modules
      submodule--helper: die on config error when cloning module
      remote: die on config error when setting URL
      remote: die on config error when setting/adding branches
      remote: die on config error when manipulating remotes
      clone: die on config error in cmd_clone
      init-db: die on config errors when initializing empty repo
      sequencer: die on config error when saving replay opts
      compat: die when unable to set core.precomposeunicode
      config: rename git_config_set to git_config_set_gently
      config: rename git_config_set_or_die to git_config_set
      xdiff/xmerge: fix memory leak in xdl_merge

Paul Wagland (2):
      completion: complete show-branch "--date-order"
      completion: update completion arguments for stash

Rob Mayoff (1):
      contrib/subtree: unwrap tag refs

Romain Picard (1):
      git-p4.py: add support for filetype change

SZEDER Gábor (2):
      t6050-replace: make failing editor test more robust
      completion: fix mis-indentation in _git_stash()

Sebastian Schuberth (3):
      docs: clarify that passing --depth to git-clone implies --single-branch
      docs: say "commits" in the --depth option wording for git-clone
      docs: clarify that --depth for git-fetch works with newly initialized repos

Shawn O. Pearce (1):
      remote-curl: include curl_errorstr on SSL setup failures

Stefan Beller (9):
      xread: poll on non blocking fds
      strbuf: add strbuf_read_once to read without blocking
      sigchain: add command to pop all common signals
      run-command: add an asynchronous parallel child processor
      fetch_populated_submodules: use new parallel job processing
      submodules: allow parallel fetching, add tests and documentation
      submodule helper list: respect correct path prefix
      submodule: try harder to fetch needed sha1 by direct fetching sha1
      run-command: do not pass child process data into callbacks

Stephen P. Smith (4):
      user-manual: remove temporary branch entry from todo list
      glossary: define the term shallow clone
      user-manual: add section documenting shallow clones
      user-manual: add addition gitweb information

Thomas Ackermann (1):
      documentation: fix some typos

Thomas Braun (1):
      completion: complete "diff --word-diff-regex="

Thomas Gummerer (11):
      t7810: correct --no-index test
      builtin/grep: add grep.fallbackToNoIndex config
      ls-remote: document --quiet option
      ls-remote: document --refs option
      ls-remote: fix synopsis
      ls-remote: use parse-options api
      ls-remote: add support for showing symrefs
      remote: use parse_config_key
      remote: simplify remote_is_configured()
      remote: actually check if remote exits
      remote: use remote_is_configured() for add and rename

Tobias Klauser (2):
      trailer: allow to write to files other than stdout
      interpret-trailers: add option for in-place editing

Torsten Bögershausen (9):
      ls-files: add eol diagnostics
      t0027: add tests for get_stream_filter()
      convert.c: remove unused parameter 'path'
      convert.c: remove input_crlf_action()
      convert.c: use text_eol_is_crlf()
      convert.c: refactor crlf_action
      convert.c: simplify text_stat
      convert.c: correct attr_action()
      config.mak.uname: use clang for Mac OS X 10.6

Victor Leschuk (3):
      grep: allow threading even on a single-core machine
      grep: slight refactoring to the code that disables threading
      grep: add --threads=<num> option and grep.threads configuration

Will Palmer (2):
      test for '!' handling in rev-parse's named commits
      object name: introduce '^{/!-<negative pattern>}' notation

brian m. carlson (1):
      http: add option to try authentication without username

Øyvind A. Holm (1):
      gitweb: squelch "uninitialized value" warning

마누엘 (1):
      mingw: try to delete target directory before renaming

^ permalink raw reply	[relevance 1%]

* [ANNOUNCE] Git v2.8.0-rc0
@ 2016-02-26 23:41  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-02-26 23:41 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

An early preview release Git v2.8.0-rc0 is now available for
testing at the usual places.  It is comprised of 436 non-merge
commits since v2.7.0, contributed by 58 people, 19 of which are
new faces.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.8.0-rc0' tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.7.0 are as follows.
Welcome to the Git development community!

  마누엘, Andrew Wheeler, Changwoo Ryu, Christoph Egger,
  Dan Aloni, Dave Ware, David A. Wheeler, Dickson Wong, Felipe
  Gonçalves Assis, GyuYong Jung, Jon Griffiths, Kazutoshi Satoda,
  Lars Vogel, Martin Amdisen, Matthew Kraai, Paul Wagland, Rob
  Mayoff, Romain Picard, and Victor Leschuk.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

  Alexander Kuleshov, Alex Henrie, brian m. carlson, Christian
  Couder, David A. Greene, David Turner, Dennis Kaarsemaker,
  Edmundo Carmona Antoranz, Elia Pinto, Eric Wong, Jacob Keller,
  Jeff King, Johannes Schindelin, Johannes Sixt, John Keeping,
  Jonathan Nieder, Junio C Hamano, Karsten Blees, Karthik Nayak,
  Knut Franke, Lars Schneider, Matthieu Moy, Matt McCutchen,
  Michael J Gruber, Mike Hommey, Nguyễn Thái Ngọc Duy,
  Øyvind A. Holm, Patrick Steinhardt, Pat Thoyts, Sebastian
  Schuberth, Shawn O. Pearce, Stefan Beller, Stephen P. Smith,
  SZEDER Gábor, Thomas Braun, Thomas Gummerer, Tobias Klauser,
  Torsten Bögershausen, and Will Palmer.

----------------------------------------------------------------

Git 2.8 Release Notes (draft)
=============================

Backward compatibility note
---------------------------

The rsync:// transport has been removed.


Updates since v2.7
------------------

UI, Workflows & Features

 * It turns out "git clone" over rsync transport has been broken when
   the source repository has packed references for a long time, and
   nobody noticed nor complained about it.

 * "branch --delete" has "branch -d" but "push --delete" does not.

 * "git blame" learned to produce the progress eye-candy when it takes
   too much time before emitting the first line of the result.

 * "git grep" can now be configured (or told from the command line)
   how many threads to use when searching in the working tree files.

 * Some "git notes" operations, e.g. "git log --notes=<note>", should
   be able to read notes from any tree-ish that is shaped like a notes
   tree, but the notes infrastructure required that the argument must
   be a ref under refs/notes/.  Loosen it to require a valid ref only
   when the operation would update the notes (in which case we must
   have a place to store the updated notes tree, iow, a ref).

 * "git grep" by default does not fall back to its "--no-index"
   behaviour outside a directory under Git's control (otherwise the
   user may by mistake end up running a huge recursive search); with a
   new configuration (set in $HOME/.gitconfig--by definition this
   cannot be set in the config file per project), this safety can be
   disabled.

 * "git pull --rebase" has been extended to allow invoking
   "rebase -i".

 * "git p4" learned to cope with the type of a file getting changed.

 * "git format-patch" learned to notice format.outputDirectory
   configuration variable.  This allows "-o <dir>" option to be
   omitted on the command line if you always use the same directory in
   your workflow.

 * "interpret-trailers" has been taught to optionally update a file in
   place, instead of always writing the result to the standard output.

 * Many commands that read files that are expected to contain text
   that is generated (or can be edited) by the end user to control
   their behaviour (e.g. "git grep -f <filename>") have been updated
   to be more tolerant to lines that are terminated with CRLF (they
   used to treat such a line to contain payload that ends with CR,
   which is usually not what the users expect).

 * "git notes merge" used to limit the source of the merged notes tree
   to somewhere under refs/notes/ hierarchy, which was too limiting
   when inventing a workflow to exchange notes with remote
   repositories using remote-tracking notes trees (located in e.g.
   refs/remote-notes/ or somesuch).

 * "git ls-files" learned a new "--eol" option to help diagnose
   end-of-line problems.

 * "ls-remote" learned an option to show which branch the remote
   repository advertises as its primary by pointing its HEAD at.

 * New http.proxyAuthMethod configuration variable can be used to
   specify what authentication method to use, as a way to work around
   proxies that do not give error response expected by libcurl when
   CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
   has been taught to use credential API to store the authentication
   material in user's keyrings.

 * Update the untracked cache subsystem and change its primary UI from
   "git update-index" to "git config".

 * There were a few "now I am doing this thing" progress messages in
   the TCP connection code that can be triggered by setting a verbose
   option internally in the code, but "git fetch -v" and friends never
   passed the verbose option down to that codepath.

 * Clean/smudge filters defined in a configuration file of lower
   precedence can now be overridden to be a pass-through no-op by
   setting the variable to an empty string.

 * A new "<branch>^{/!-<pattern>}" notation can be used to name a
   commit that is reachable from <branch> that does not match the
   given <pattern>.

 * The "user.useConfigOnly" configuration variable can be used to
   force the user to always set user.email & user.name configuration
   variables, serving as a reminder for those who work on multiple
   projects and do not want to put these in their $HOME/.gitconfig.

 * "git fetch" and friends that make network connections can now be
   told to only use ipv4 (or ipv6).

 * Some authentication methods do not need username or password, but
   libcurl needs some hint that it needs to perform authentication.
   Supplying an empty username and password string is a valid way to
   do so, but you can set the http.[<url>.]emptyAuth configuration
   variable to achieve the same, if you find it cleaner.

 * You can now set http.[<url>.]pinnedpubkey to specify the pinned
   public key when building with recent enough versions of libcURL.

 * The configuration system has been taught to phrase where it found a
   bad configuration variable in a better way in its error messages.
   "git config" learnt a new "--show-origin" option to indicate where
   the values come from.

 * The "credential-cache" daemon process used to run in whatever
   directory it happened to start in, but this made umount(2)ing the
   filesystem that houses the repository harder; now the process
   chdir()s to the directory that house its own socket on startup.

 * When "git submodule update" did not result in fetching the commit
   object in the submodule that is referenced by the superproject, the
   command learned to retry another fetch, specifically asking for
   that commit that may not be connected to the refs it usually
   fetches.

 * "git merge-recursive" learned "--no-renames" option to disable its
   rename detection logic.

 * Across the transition at around Git version 2.0, the user used to
   get a pretty loud warning when running "git push" without setting
   push.default configuration variable.  We no longer warn, given that
   the transition is over long time ago.

 * README has been renamed to README.md and its contents got tweaked
   slightly to make it easier on the eyes.


Performance, Internal Implementation, Development Support etc.

 * Add a framework to spawn a group of processes in parallel, and use
   it to run "git fetch --recurse-submodules" in parallel.

 * A slight update to the Makefile to mark "phoney" targets
   as such correctly.

 * In-core storage of the reverse index for .pack files (which lets
   you go from a pack offset to an object name) has been streamlined.

 * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
   $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
   handling by overwriting GIT_WORK_TREE environment variable to
   affect subprocesses when set_git_work_tree() gets called, which
   resulted in a rather unpleasant regression to "clone" and "init".
   Try to address the same issue by always restoring the environment
   and respawning the real underlying command when handling alias.

 * The low-level code that is used to create symbolic references has
   been updated to share more code with the code that deals with
   normal references.

 * strbuf_getline() and friends have been redefined to make it easier
   to identify which callsite of (new) strbuf_getline_lf() should
   allow and silently ignore carriage-return at the end of the line to
   help users on DOSsy systems.

 * "git shortlog" used to accumulate various pieces of information
   regardless of what was asked to be shown in the final output.  It
   has been optimized by noticing what need not to be collected
   (e.g. there is no need to collect the log messages when showing
   only the number of changes).

 * "git checkout $branch" (and other operations that share the same
   underlying machinery) has been optimized.

 * Automated tests in Travis CI environment has been optimized by
   persisting runtime statistics of previous "prove" run, executing
   tests that take longer before other ones; this reduces the total
   wallclock time.

 * Test scripts have been updated to remove assumptions that are not
   portable between Git for POSIX and Git for Windows, or to skip ones
   with expectations that are not satisfiable on Git for Windows.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in test-path-utils that are already safe has
   been rewritten to avoid false wanings.

 * Some calls to strcpy(3) triggers a false warning from static
   analysers that are less intelligent than humans, and reducing the
   number of these false hits helps us notice real issues.  A few
   calls to strcpy(3) in "git rerere" that are already safe has been
   rewritten to avoid false wanings.

 * The "name_path" API was an attempt to reduce the need to construct
   the full path out of a series of path components while walking a
   tree hierarchy, but over time made less efficient because the path
   needs to be flattened, e.g. to be compared with another path that
   is already flat.  The API has been removed and its users have been
   rewritten to simplify the overall code complexity.

 * Help those who debug http(s) part of the system.
   (merge 0054045 sp/remote-curl-ssl-strerror later to maint).

 * The internal API to interact with "remote.*" configuration
   variables has been streamlined.

 * The ref-filter's format-parsing code has been refactored, in
   preparation for "branch --format" and friends.

 * Traditionally, the tests that try commands that work on the
   contents in the working tree were named with "worktree" in their
   filenames, but with the recent addition of "git worktree"
   subcommand, whose tests are also named similarly, it has become
   harder to tell them apart.  The traditional tests have been renamed
   to use "work-tree" instead in an attempt to differentiate them.
   (merge 5549029 mg/work-tree-tests later to maint).

 * Many codepaths forget to check return value from git_config_set();
   the function is made to die() to make sure we do not proceed when
   setting a configuration variable failed.
   (merge 3d18064 ps/config-error later to maint).

 * Handling of errors while writing into our internal asynchronous
   process has been made more robust, which reduces flakiness in our
   tests.
   (merge 43f3afc jk/epipe-in-async later to maint).

 * There is a new DEVELOPER knob that enables many compiler warning
   options in the Makefile.


Also contains various documentation updates and code clean-ups.


Fixes since v2.7
----------------

Unless otherwise noted, all the fixes since v2.7 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * An earlier change in 2.5.x-era broke users' hooks and aliases by
   exporting GIT_WORK_TREE to point at the root of the working tree,
   interfering when they tried to use a different working tree without
   setting GIT_WORK_TREE environment themselves.

 * The "exclude_list" structure has the usual "alloc, nr" pair of
   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
   array.

 * Paths that have been told the index about with "add -N" are not
   quite yet in the index, but a few commands behaved as if they
   already are in a harmful way.

 * "git send-email" was confused by escaped quotes stored in the alias
   files saved by "mutt", which has been corrected.

 * A few unportable C construct have been spotted by clang compiler
   and have been fixed.

 * The documentation has been updated to hint the connection between
   the '--signoff' option and DCO.

 * "git reflog" incorrectly assumed that all objects that used to be
   at the tip of a ref must be commits, which caused it to segfault.

 * The ignore mechanism saw a few regressions around untracked file
   listing and sparse checkout selection areas in 2.7.0; the change
   that is responsible for the regression has been reverted.

 * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
   done.  This however did not work well if the repository is set to
   be shared with core.sharedRepository and the umask of the previous
   user is tighter.  They have been made to work better by calling
   unlink(2) and retrying after fopen(3) fails with EPERM.

 * Asking gitweb for a nonexistent commit left a warning in the server
   log.

   Somebody may want to follow this up with an additional test, perhaps?
   IIRC, we do test that no Perl warnings are given to the server log,
   so this should have been caught if our test coverage were good.

 * "git rebase", unlike all other callers of "gc --auto", did not
   ignore the exit code from "gc --auto".

 * Many codepaths that run "gc --auto" before exiting kept packfiles
   mapped and left the file descriptors to them open, which was not
   friendly to systems that cannot remove files that are open.  They
   now close the packs before doing so.

 * A recent optimization to filter-branch in v2.7.0 introduced a
   regression when --prune-empty filter is used, which has been
   corrected.

 * The description for SANITY prerequisite the test suite uses has
   been clarified both in the comment and in the implementation.

 * "git tag" started listing a tag "foo" as "tags/foo" when a branch
   named "foo" exists in the same repository; remove this unnecessary
   disambiguation, which is a regression introduced in v2.7.0.

 * The way "git svn" uses auth parameter was broken by Subversion
   1.9.0 and later.

 * The "split" subcommand of "git subtree" (in contrib/) incorrectly
   skipped merges when it shouldn't, which was corrected.

 * A few options of "git diff" did not work well when the command was
   run from a subdirectory.

 * The command line completion learned a handful of additional options
   and command specific syntax.

 * dirname() emulation has been added, as Msys2 lacks it.

 * The underlying machinery used by "ls-files -o" and other commands
   have been taught not to create empty submodule ref cache for a
   directory that is not a submodule.  This removes a ton of wasted
   CPU cycles.

 * "git worktree" had a broken code that attempted to auto-fix
   possible inconsistency that results from end-users moving a
   worktree to different places without telling Git (the original
   repository needs to maintain backpointers to its worktrees, but
   "mv" run by end-users who are not familiar with that fact will
   obviously not adjust them), which actually made things worse
   when triggered.

 * The low-level merge machinery has been taught to use CRLF line
   termination when inserting conflict markers to merged contents that
   are themselves CRLF line-terminated.

 * "git push --force-with-lease" has been taught to report if the push
   needed to force (or fast-forwarded).

 * The emulated "yes" command used in our test scripts has been
   tweaked not to spend too much time generating unnecessary output
   that is not used, to help those who test on Windows where it would
   not stop until it fills the pipe buffer due to lack of SIGPIPE.

 * The documentation for "git clean" has been corrected; it mentioned
   that .git/modules/* are removed by giving two "-f", which has never
   been the case.

 * The vimdiff backend for "git mergetool" has been tweaked to arrange
   and number buffers in the order that would match the expectation of
   majority of people who read left to right, then top down and assign
   buffers 1 2 3 4 "mentally" to local base remote merge windows based
   on that order.

 * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
   rev, i.e. the object named by the the pathname with wildcard
   characters in a tree object.
   (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint).

 * "git rev-parse --git-common-dir" used in the worktree feature
   misbehaved when run from a subdirectory.
   (merge 17f1365 nd/git-common-dir-fix later to maint).

 * Another try to add support to the ignore mechanism that lets you
   say "this is excluded" and then later say "oh, no, this part (that
   is a subset of the previous part) is not excluded".

 * "git worktree add -B <branchname>" did not work.

 * The "v(iew)" subcommand of the interactive "git am -i" command was
   broken in 2.6.0 timeframe when the command was rewritten in C.
   (merge 708b8cc jc/am-i-v-fix later to maint).

 * "git merge-tree" used to mishandle "both sides added" conflict with
   its own "create a fake ancestor file that has the common parts of
   what both sides have added and do a 3-way merge" logic; this has
   been updated to use the usual "3-way merge with an empty blob as
   the fake common ancestor file" approach used in the rest of the
   system.
   (merge 907681e jk/no-diff-emit-common later to maint).

 * The memory ownership rule of fill_textconv() API, which was a bit
   tricky, has been documented a bit better.
   (merge a64e6a4 jk/more-comments-on-textconv later to maint).

 * Update various codepaths to avoid manually-counted malloc().
   (merge 08c95df jk/tighten-alloc later to maint).

 * The documentation did not clearly state that the 'simple' mode is
   now the default for "git push" when push.default configuration is
   not set.
   (merge f6b1fb3 mm/push-simple-doc later to maint).

 * Recent versions of GNU grep are pickier when their input contains
   arbitrary binary data, which some of our tests uses.  Rewrite the
   tests to sidestep the problem.
   (merge 3b1442d jk/grep-binary-workaround-in-test later to maint).

 * A helper function "git submodule" uses since v2.7.0 to list the
   modules that match the pathspec argument given to its subcommands
   (e.g. "submodule add <repo> <path>") has been fixed.
   (merge 2b56bb7 sb/submodule-module-list-fix later to maint).

 * "git config section.var value" to set a value in per-repository
   configuration file failed when it was run outside any repository,
   but didn't say the reason correctly.
   (merge 638fa62 js/config-set-in-non-repository later to maint).

 * Other minor clean-ups and documentation updates
   (merge f459823 ak/extract-argv0-last-dir-sep later to maint).
   (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint).
   (merge 4867f11 ps/plug-xdl-merge-leak later to maint).
   (merge 4938686 dt/initial-ref-xn-commit-doc later to maint).
   (merge 9537f21 ma/update-hooks-sample-typofix later to maint).

----------------------------------------------------------------

Changes since v2.7.0 are as follows:

Alex Henrie (1):
      stripspace: call U+0020 a "space" instead of a "blank"

Alexander Kuleshov (3):
      format-patch: introduce format.outputDirectory configuration
      exec_cmd.c: use find_last_dir_sep() for code simplification
      git.c: simplify stripping extension of a file in handle_builtin()

Andrew Wheeler (1):
      push: fix ref status reporting for --force-with-lease

Changwoo Ryu (1):
      l10n: ko.po: Add Korean translation

Christian Couder (11):
      dir: free untracked cache when removing it
      update-index: use enum for untracked cache options
      update-index: add --test-untracked-cache
      update-index: add untracked cache notifications
      update-index: move 'uc' var declaration
      dir: add {new,add}_untracked_cache()
      dir: add remove_untracked_cache()
      dir: simplify untracked cache "ident" field
      config: add core.untrackedCache
      test-dump-untracked-cache: don't modify the untracked cache
      t7063: add tests for core.untrackedCache

Christoph Egger (1):
      http: implement public key pinning

Dan Aloni (1):
      ident: add user.useConfigOnly boolean for when ident shouldn't be guessed

Dave Ware (1):
      contrib/subtree: fix "subtree split" skipped-merge bug

David A. Greene (1):
      contrib/subtree: Make testing easier

David A. Wheeler (1):
      Expand documentation describing --signoff

David Turner (3):
      do_compare_entry: use already-computed path
      unpack-trees: fix accidentally quadratic behavior
      refs: document transaction semantics

Dennis Kaarsemaker (1):
      reflog-walk: don't segfault on non-commit sha1's in the reflog

Dickson Wong (1):
      mergetool: reorder vim/gvim buffers in three-way diffs

Edmundo Carmona Antoranz (1):
      blame: add support for --[no-]progress option

Elia Pinto (92):
      Makefile: add missing phony target
      contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
      contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
      contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
      git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
      t/lib-httpd.sh: use the $( ... ) construct for command substitution
      test-sha1.sh: use the $( ... ) construct for command substitution
      unimplemented.sh: use the $( ... ) construct for command substitution
      t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
      t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
      t/t1410-reflog.sh: use the $( ... ) construct for command substitution
      t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
      t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
      t/t1700-split-index.sh: use the $( ... ) construct for command substitution
      t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
      t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
      t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
      t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
      t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
      t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
      t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
      t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
      t/t3600-rm.sh: use the $( ... ) construct for command substitution
      t/t3700-add.sh: use the $( ... ) construct for command substitution
      t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
      t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
      t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
      t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
      t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
      t/t5304-prune.sh: use the $( ... ) construct for command substitution
      t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
      t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
      t/t5505-remote.sh: use the $( ... ) construct for command substitution
      t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
      t/t5510-fetch.sh: use the $( ... ) construct for command substitution
      t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
      t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
      t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
      t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
      t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
      t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
      t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
      t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
      t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
      t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
      t/t5601-clone.sh: use the $( ... ) construct for command substitution
      t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
      t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
      t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
      t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
      t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
      t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
      t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
      t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
      t/t7001-mv.sh: use the $( ... ) construct for command substitution
      t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
      t/t7004-tag.sh: use the $( ... ) construct for command substitution
      t/t7006-pager.sh: use the $( ... ) construct for command substitution
      t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
      t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
      t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
      t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
      t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
      t/t7700-repack.sh: use the $( ... ) construct for command substitution
      t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
      t/t9001-send-email.sh: use the $( ... ) construct for command substitution
      t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
      t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
      t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
      t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
      t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
      t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
      t9300-fast-import.sh: use the $( ... ) construct for command substitution
      t9350-fast-export.sh: use the $( ... ) construct for command substitution
      t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
      t9901-git-web--browse.sh: use the $( ... ) construct for command substitution

Eric Wong (8):
      git-send-email: do not double-escape quotes from mutt
      for-each-ref: document `creatordate` and `creator` fields
      git-svn: fix auth parameter handling on SVN 1.9.0+
      pass transport verbosity down to git_connect
      connect & http: support -4 and -6 switches for remote operations
      t5570: add tests for "git {clone,fetch,pull} -v"
      git-svn: hoist out utf8 prep from t9129 to lib-git-svn
      tests: remove no-op full-svn-test target

Felipe Gonçalves Assis (7):
      merge-recursive: option to disable renames
      merge-recursive: more consistent interface
      merge-strategies.txt: fix typo
      merge-recursive: find-renames resets threshold
      t3034: add rename threshold tests
      t3034: test option to disable renames
      t3034: test deprecated interface

GyuYong Jung (1):
      git-cvsserver.perl: fix typo

Jacob Keller (1):
      notes: allow merging from arbitrary references

Jeff King (74):
      pack-revindex: drop hash table
      pack-revindex: store entries directly in packed_git
      create_symref: modernize variable names
      create_symref: use existing ref-lock code
      create_symref: write reflog while holding lock
      run-command: don't warn on SIGPIPE deaths
      avoid shifting signed integers 31 bits
      bswap: add NO_UNALIGNED_LOADS define
      checkout,clone: check return value of create_symref
      lock_ref_sha1_basic: always fill old_oid while holding lock
      lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
      rebase: ignore failures from "gc --auto"
      shortlog: match both "Author:" and "author" on stdin
      shortlog: use strbufs to read from stdin
      shortlog: replace hand-parsing of author with pretty-printer
      shortlog: optimize "--summary" mode
      shortlog: optimize out useless "<none>" normalization
      shortlog: optimize out useless string list
      shortlog: don't warn on empty author
      filter-branch: resolve $commit^{tree} in no-index case
      clean: make is_git_repository a public function
      resolve_gitlink_ref: ignore non-repository paths
      t6300: use test_atom for some un-modern tests
      tag: do not show ambiguous tag names as "tags/foo"
      transport: drop support for git-over-rsync
      give "nbuf" strbuf a more meaningful name
      checkout-index: simplify "-z" option parsing
      checkout-index: handle "--no-prefix" option
      checkout-index: handle "--no-index" option
      checkout-index: disallow "--no-stage" option
      apply, ls-files: simplify "-z" parsing
      fmt_ident: refactor strictness checks
      test-path-utils: use xsnprintf in favor of strcpy
      rerere: replace strcpy with xsnprintf
      checkout: reorder check_filename conditional
      check_filename: tighten dwim-wildcard ambiguity
      get_sha1: don't die() on bogus search strings
      http-push: stop using name_path
      show_object_with_name: simplify by using path_name()
      list-objects: convert name_path to a strbuf
      list-objects: drop name_path entirely
      list-objects: pass full pathname to callbacks
      git-config: better document default behavior for `--include`
      ref-filter: use string_list_split over strbuf_split
      reflog_expire_cfg: NUL-terminate pattern field
      add helpers for detecting size_t overflow
      tree-diff: catch integer overflow in combine_diff_path allocation
      diff: clarify textconv interface
      harden REALLOC_ARRAY and xcalloc against size_t overflow
      add helpers for allocating flex-array structs
      argv-array: add detach function
      convert manual allocations to argv_array
      convert trivial cases to ALLOC_ARRAY
      use xmallocz to avoid size arithmetic
      convert trivial cases to FLEX_ARRAY macros
      use st_add and st_mult for allocation size computation
      prepare_{git,shell}_cmd: use argv_array
      write_untracked_extension: use FLEX_ALLOC helper
      fast-import: simplify allocation in start_packfile
      fetch-pack: simplify add_sought_entry
      test-path-utils: fix normalize_path_copy output buffer size
      sequencer: simplify memory allocation of get_message
      git-compat-util: drop mempcpy compat code
      transport_anonymize_url: use xstrfmt
      diff_populate_gitlink: use a strbuf
      convert ewah/bitmap code to use xmalloc
      ewah: convert to REALLOC_ARRAY, etc
      merge-one-file: use empty blob for add/add base
      merge-tree: drop generate_common strategy
      xdiff: drop XDL_EMIT_COMMON
      write_or_die: handle EPIPE in async threads
      fetch-pack: ignore SIGPIPE in sideband demuxer
      test_must_fail: report number of unexpected signal
      t5504: handle expected output from SIGPIPE death

Johannes Schindelin (46):
      commit: allow editing the commit message even in shared repos
      Handle more file writes correctly in shared repos
      Refactor skipping DOS drive prefixes
      compat/basename: make basename() conform to POSIX
      compat/basename.c: provide a dirname() compatibility function
      t0060: verify that basename() and dirname() work as expected
      config.mak.uname: support MSys2
      config.mak.uname: supporting 64-bit MSys2
      fetch: release pack files before garbage-collecting
      am: release pack files before garbage-collecting
      merge: release pack files before garbage-collecting
      receive-pack: release pack files before garbage-collecting
      pull: allow interactive rebase with --rebase=interactive
      remote: handle the config setting branch.*.rebase=interactive
      completion: add missing branch.*.rebase values
      nedmalloc: allow compiling with MSys2's compiler
      compat/mingw: support MSys2-based MinGW build
      compat/winansi: support compiling with MSys2
      t0060: loosen overly strict expectations
      mingw: avoid redefining S_* constants
      mingw: avoid warnings when casting HANDLEs to int
      mingw: squash another warning about a cast
      mingw: uglify (a, 0) definitions to shut up warnings
      mingw: let's use gettext with MSYS2
      mingw: do not trust MSYS2's MinGW gettext.sh
      Git.pm: stop assuming that absolute paths start with a slash
      mingw: prepare the TMPDIR environment variable for shell scripts
      mingw: let lstat() fail with errno == ENOTDIR when appropriate
      merge-file: let conflict markers match end-of-line style of the context
      merge-file: ensure that conflict sections match eol style
      mingw: fix t5601-clone.sh
      mingw: accomodate t0060-path-utils for MSYS2
      mingw: disable mkfifo-based tests
      tests: turn off git-daemon tests if FIFOs are not available
      mingw: skip test in t1508 that fails due to path conversion
      mingw: fix t9700's assumption about directory separators
      mingw: work around pwd issues in the tests
      mingw: mark t9100's test cases with appropriate prereqs
      mingw: avoid illegal filename in t9118
      mingw: handle the missing POSIXPERM prereq in t9124
      mingw: skip a test in t9130 that cannot pass on Windows
      mingw: do not bother to test funny file names
      test-lib: limit the output of the yes utility
      gitignore: ignore generated test-fake-ssh executable
      t5505: 'remote add x y' should work when url.y.insteadOf = x
      git config: report when trying to modify a non-existing repo config

Johannes Sixt (2):
      t/t5100: no need to use 'echo' command substitutions for globbing
      mingw: avoid linking to the C library's isalpha()

John Keeping (3):
      completion: add missing git-rebase options
      t8005: avoid grep on non-ASCII data
      t9200: avoid grep on non-ASCII data

Jon Griffiths (3):
      credential-cache--daemon: refactor check_socket_directory
      credential-cache--daemon: disallow relative socket path
      credential-cache--daemon: change to the socket dir on startup

Jonathan Nieder (1):
      submodule.c: write "Fetching submodule <foo>" to stderr

Junio C Hamano (42):
      First batch for post 2.7 cycle
      strbuf: miniscule style fix
      strbuf: make strbuf_getline_crlf() global
      strbuf: introduce strbuf_getline_{lf,nul}()
      mktree: there are only two possible line terminations
      check-attr: there are only two possible line terminations
      check-ignore: there are only two possible line terminations
      update-index: there are only two possible line terminations
      checkout-index: there are only two possible line terminations
      strbuf: give strbuf_getline() to the "most text friendly" variant
      hash-object: read --stdin-paths with strbuf_getline()
      revision: read --stdin with strbuf_getline()
      rev-parse: read parseopt spec with strbuf_getline()
      ident.c: read /etc/mailname with strbuf_getline()
      remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
      clone/sha1_file: read info/alternates with strbuf_getline()
      transport-helper: read helper response with strbuf_getline()
      cat-file: read batch stream with strbuf_getline()
      column: read lines with strbuf_getline()
      send-pack: read list of refs with strbuf_getline()
      grep: read -f file with strbuf_getline()
      test-sha1-array: read command stream with strbuf_getline()
      test-lib: clarify and tighten SANITY
      Second batch for 2.8 cycle
      Third batch for 2.8 cycle
      git: remove an early return from save_env_before_alias()
      git: protect against unbalanced calls to {save,restore}_env()
      git: simplify environment save/restore logic
      Fourth batch for 2.8.cycle
      Getting closer to 2.7.1
      restore_env(): free the saved environment variable once we are done
      Fifth batch for 2.8 cycle
      Git 2.7.1
      Sixth batch for the 2.8 cycle
      pager: lose a separate argv[]
      pager: factor out a helper to prepare a child process to run the pager
      am -i: fix "v"iew
      Start preparing for 2.7.2
      Seventh batch for the 2.8 cycle
      Git 2.7.2
      Eighth batch for 2.8
      Git 2.8-rc0

Karsten Blees (1):
      mingw: factor out Windows specific environment setup

Karthik Nayak (10):
      ref-filter: bump 'used_atom' and related code to the top
      ref-filter: introduce struct used_atom
      ref-filter: introduce parsing functions for each valid atom
      ref-filter: introduce color_atom_parser()
      ref-filter: introduce parse_align_position()
      ref-filter: introduce align_atom_parser()
      ref-filter: align: introduce long-form syntax
      ref-filter: introduce remote_ref_atom_parser()
      ref-filter: introduce contents_atom_parser()
      ref-filter: introduce objectname_atom_parser()

Kazutoshi Satoda (2):
      git-svn: enable "svn.pathnameencoding" on dcommit
      git-svn: apply "svn.pathnameencoding" before URL encoding

Knut Franke (2):
      http: allow selection of proxy authentication method
      http: use credential API to handle proxy authentication

Lars Schneider (8):
      travis-ci: run previously failed tests first, then slowest to fastest
      travis-ci: explicity use container-based infrastructure
      convert: treat an empty string for clean/smudge filters as "cat"
      t: do not hide Git's exit code in tests using 'nul_to_q'
      rename git_config_from_buf to git_config_from_mem
      config: add 'origin_type' to config_source struct
      config: add '--show-origin' option to print the origin of a config value
      add DEVELOPER makefile knob to check for acknowledged warnings

Lars Vogel (1):
      git-add doc: do not say working directory when you mean working tree

Martin Amdisen (1):
      templates/hooks: fix minor typo in the sample update-hook

Matt McCutchen (1):
      Documentation/git-clean.txt: don't mention deletion of .git/modules/*

Matthew Kraai (1):
      Documentation: remove unnecessary backslashes

Matthieu Moy (7):
      Documentation/git-push: document that 'simple' is the default
      README: use markdown syntax
      README.md: add hyperlinks on filenames
      README.md: move the link to git-scm.com up
      README.md: don't call git stupid in the title
      README.md: move down historical explanation about the name
      push: remove "push.default is unset" warning message

Michael J Gruber (2):
      t9100: fix breakage when SHELL_PATH is not /bin/sh
      tests: rename work-tree tests to *work-tree*

Mike Hommey (1):
      notes: allow treeish expressions as notes ref

Nguyễn Thái Ngọc Duy (20):
      blame: remove obsolete comment
      add and use a convenience macro ce_intent_to_add()
      Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
      git.c: make it clear save_env() is for alias handling only
      setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
      git.c: make sure we do not leak GIT_* to alias scripts
      grep: make it clear i-t-a entries are ignored
      dir.c: clean the entire struct in clear_exclude_list()
      Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"
      worktree.c: fix indentation
      diff-no-index: do not take a redundant prefix argument
      diff: make -O and --output work in subdirectory
      worktree: stop supporting moving worktrees manually
      rev-parse: take prefix into account in --git-common-dir
      dir.c: fix match_pathname()
      dir.c: support tracing exclude
      dir.c: support marking some patterns already matched
      dir.c: don't exclude whole dir prematurely
      worktree: fix "add -B"
      worktree add -B: do the checkout test before update branch

Pat Thoyts (1):
      t0008: avoid absolute path

Patrick Steinhardt (18):
      push: add '--delete' flag to synopsis
      push: add '-d' as shorthand for '--delete'
      config: introduce set_or_die wrappers
      branch: report errors in tracking branch setup
      branch: die on config error when unsetting upstream
      branch: die on config error when editing branch description
      submodule: die on config error when linking modules
      submodule--helper: die on config error when cloning module
      remote: die on config error when setting URL
      remote: die on config error when setting/adding branches
      remote: die on config error when manipulating remotes
      clone: die on config error in cmd_clone
      init-db: die on config errors when initializing empty repo
      sequencer: die on config error when saving replay opts
      compat: die when unable to set core.precomposeunicode
      config: rename git_config_set to git_config_set_gently
      config: rename git_config_set_or_die to git_config_set
      xdiff/xmerge: fix memory leak in xdl_merge

Paul Wagland (2):
      completion: complete show-branch "--date-order"
      completion: update completion arguments for stash

Rob Mayoff (1):
      contrib/subtree: unwrap tag refs

Romain Picard (1):
      git-p4.py: add support for filetype change

SZEDER Gábor (2):
      t6050-replace: make failing editor test more robust
      completion: fix mis-indentation in _git_stash()

Sebastian Schuberth (3):
      docs: clarify that passing --depth to git-clone implies --single-branch
      docs: say "commits" in the --depth option wording for git-clone
      docs: clarify that --depth for git-fetch works with newly initialized repos

Shawn O. Pearce (1):
      remote-curl: include curl_errorstr on SSL setup failures

Stefan Beller (8):
      xread: poll on non blocking fds
      strbuf: add strbuf_read_once to read without blocking
      sigchain: add command to pop all common signals
      run-command: add an asynchronous parallel child processor
      fetch_populated_submodules: use new parallel job processing
      submodules: allow parallel fetching, add tests and documentation
      submodule helper list: respect correct path prefix
      submodule: try harder to fetch needed sha1 by direct fetching sha1

Stephen P. Smith (4):
      user-manual: remove temporary branch entry from todo list
      glossary: define the term shallow clone
      user-manual: add section documenting shallow clones
      user-manual: add addition gitweb information

Thomas Braun (1):
      completion: complete "diff --word-diff-regex="

Thomas Gummerer (11):
      t7810: correct --no-index test
      builtin/grep: add grep.fallbackToNoIndex config
      ls-remote: document --quiet option
      ls-remote: document --refs option
      ls-remote: fix synopsis
      ls-remote: use parse-options api
      ls-remote: add support for showing symrefs
      remote: use parse_config_key
      remote: simplify remote_is_configured()
      remote: actually check if remote exits
      remote: use remote_is_configured() for add and rename

Tobias Klauser (2):
      trailer: allow to write to files other than stdout
      interpret-trailers: add option for in-place editing

Torsten Bögershausen (8):
      ls-files: add eol diagnostics
      t0027: add tests for get_stream_filter()
      convert.c: remove unused parameter 'path'
      convert.c: remove input_crlf_action()
      convert.c: use text_eol_is_crlf()
      convert.c: refactor crlf_action
      convert.c: simplify text_stat
      convert.c: correct attr_action()

Victor Leschuk (3):
      grep: allow threading even on a single-core machine
      grep: slight refactoring to the code that disables threading
      grep: add --threads=<num> option and grep.threads configuration

Will Palmer (2):
      test for '!' handling in rev-parse's named commits
      object name: introduce '^{/!-<negative pattern>}' notation

brian m. carlson (1):
      http: add option to try authentication without username

Øyvind A. Holm (1):
      gitweb: squelch "uninitialized value" warning

마누엘 (1):
      mingw: try to delete target directory before renaming

^ permalink raw reply	[relevance 1%]

* [PATCH v2 1/5] README: use markdown syntax
  2016-02-25  8:37  4% ` [PATCH v2 " Matthieu Moy
@ 2016-02-25  8:37 13%   ` Matthieu Moy
  0 siblings, 0 replies; 200+ results
From: Matthieu Moy @ 2016-02-25  8:37 UTC (permalink / raw)
  To: gitster; +Cc: git, peff, Johannes.Schindelin, Matthieu Moy

This allows repository browsers like GitHub to display the content of
the file nicely formatted.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 README => README.md | 7 ++-----
 t/t7001-mv.sh       | 2 +-
 2 files changed, 3 insertions(+), 6 deletions(-)
 rename README => README.md (93%)

diff --git a/README b/README.md
similarity index 93%
rename from README
rename to README.md
index 1083735..600779c 100644
--- a/README
+++ b/README.md
@@ -1,8 +1,5 @@
-////////////////////////////////////////////////////////////////
-
-	Git - the stupid content tracker
-
-////////////////////////////////////////////////////////////////
+Git - the stupid content tracker
+================================
 
 "git" can mean anything, depending on your mood.
 
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 51dd2b4..4008fae 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -102,7 +102,7 @@ test_expect_success \
 
 test_expect_success \
     'adding another file' \
-    'cp "$TEST_DIRECTORY"/../README path0/README &&
+    'cp "$TEST_DIRECTORY"/../README.md path0/README &&
      git add path0/README &&
      git commit -m add2 -a'
 
-- 
2.7.2.334.g35ed2ae.dirty

^ permalink raw reply related	[relevance 13%]

* [PATCH v2 0/5] Make README more pleasant to read
  2016-02-23 17:40  5% [RFC/PATCH 0/5] Make README more pleasant to read Matthieu Moy
  2016-02-23 17:40 13% ` [PATCH 1/5] README: use markdown syntax Matthieu Moy
  2016-02-24 10:22  0% ` [RFC/PATCH 0/5] Make README more pleasant to read Jeff King
@ 2016-02-25  8:37  4% ` Matthieu Moy
  2016-02-25  8:37 13%   ` [PATCH v2 1/5] README: use markdown syntax Matthieu Moy
  2 siblings, 1 reply; 200+ results
From: Matthieu Moy @ 2016-02-25  8:37 UTC (permalink / raw)
  To: gitster; +Cc: git, peff, Johannes.Schindelin, Matthieu Moy

Minor tweaks after discussion on v1 (for those who missed it, this
series makes README render nicely on GitHub and tries to present
important information early).

The result is here:

  https://github.com/moy/git/tree/git-readme#readme

Changes since v1:

* Visible on the rendered page: resurect "the stupid content tracker"
  at the bottom ("He described the tool as "the stupid content
  tracker" and the name as (depending on your mood)") as suggested by
  Junio. I first disagreed, but that's part of the explanation why Git
  is called Git, so why not.

* Visible only in the source: change

  # title

  to

  title
  =====

  (I chose the first because it was more easy to type, but for someone
  not familiar with markdown, the second makes it more obvious that
  its' a title)

I kept the patch introducing explicit links on filenames. I do not
care deeply about it.

Matthieu Moy (5):
  README: use markdown syntax
  README.md: add hyperlinks on filenames
  README.md: move the link to git-scm.com up
  README.md: don't call git stupid in the title
  README.md: move down historical explanation about the name

 README => README.md | 56 +++++++++++++++++++++++++++++------------------------
 t/t7001-mv.sh       |  2 +-
 2 files changed, 32 insertions(+), 26 deletions(-)
 rename README => README.md (65%)

-- 
2.7.2.334.g35ed2ae.dirty

^ permalink raw reply	[relevance 4%]

* Re: [RFC/PATCH 0/5] Make README more pleasant to read
  2016-02-24 13:37  0%   ` Matthieu Moy
@ 2016-02-25  6:14  0%     ` Jeff King
  0 siblings, 0 replies; 200+ results
From: Jeff King @ 2016-02-25  6:14 UTC (permalink / raw)
  To: Matthieu Moy; +Cc: git, emma.westby

On Wed, Feb 24, 2016 at 02:37:05PM +0100, Matthieu Moy wrote:

> Jeff King <peff@peff.net> writes:
> 
> > On Tue, Feb 23, 2016 at 06:40:24PM +0100, Matthieu Moy wrote:
> >
> >>  README => README.md | 54 ++++++++++++++++++++++++++++-------------------------
> >>  t/t7001-mv.sh       |  2 +-
> >
> > I do not overly care, but I wonder if it would be nice to keep README as
> > a symlink.
> 
> I can add it if people want to see it, but we already have so many files
> at the root, I'd rather avoid adding duplicates through symlinks.

That's reasonable. I thought it might appease the "I use `less README`
to view the README" crowd, but it is probably not that hard to find the
`.md` variant.

-Peff

^ permalink raw reply	[relevance 0%]

* Re: [RFC/PATCH 0/5] Make README more pleasant to read
  2016-02-24 10:22  0% ` [RFC/PATCH 0/5] Make README more pleasant to read Jeff King
@ 2016-02-24 13:37  0%   ` Matthieu Moy
  2016-02-25  6:14  0%     ` Jeff King
  0 siblings, 1 reply; 200+ results
From: Matthieu Moy @ 2016-02-24 13:37 UTC (permalink / raw)
  To: Jeff King; +Cc: git, emma.westby

Jeff King <peff@peff.net> writes:

> On Tue, Feb 23, 2016 at 06:40:24PM +0100, Matthieu Moy wrote:
>
>>  README => README.md | 54 ++++++++++++++++++++++++++++-------------------------
>>  t/t7001-mv.sh       |  2 +-
>
> I do not overly care, but I wonder if it would be nice to keep README as
> a symlink.

I can add it if people want to see it, but we already have so many files
at the root, I'd rather avoid adding duplicates through symlinks.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply	[relevance 0%]

* Re: [RFC/PATCH 0/5] Make README more pleasant to read
  2016-02-23 17:40  5% [RFC/PATCH 0/5] Make README more pleasant to read Matthieu Moy
  2016-02-23 17:40 13% ` [PATCH 1/5] README: use markdown syntax Matthieu Moy
@ 2016-02-24 10:22  0% ` Jeff King
  2016-02-24 13:37  0%   ` Matthieu Moy
  2016-02-25  8:37  4% ` [PATCH v2 " Matthieu Moy
  2 siblings, 1 reply; 200+ results
From: Jeff King @ 2016-02-24 10:22 UTC (permalink / raw)
  To: Matthieu Moy; +Cc: git, emma.westby

On Tue, Feb 23, 2016 at 06:40:24PM +0100, Matthieu Moy wrote:

> This patch series was inspired by a discussion I had with Emma Jane
> after Git Merge last year. It tries both to make the README file less
> agressive and generally more pleasant to read.
> 
> To get a quick overview, compare the old one:
> 
>   https://github.com/git/git#readme
> 
> and my proposal:
> 
>   https://github.com/moy/git/tree/git-readme#readme
> 
> Matthieu Moy (5):
>   README: use markdown syntax
>   README.md: add hyperlinks on filenames
>   README.md: move the link to git-scm.com up
>   README.md: don't call git stupid in the title
>   README.md: move down historical explanation about the name

Thanks for working on this. I think the end product is much nicer on the
web, with very little downside for local viewing.

I'm especially happy about the final patch. I don't look at Git's README
often, but I always cringe when I see that intro paragraph and think
that it's some people's first introduction to what git is.

>  README => README.md | 54 ++++++++++++++++++++++++++++-------------------------
>  t/t7001-mv.sh       |  2 +-

I do not overly care, but I wonder if it would be nice to keep README as
a symlink. I don't think that complicates things for people checking out
on Windows (we already have RelNotes as a symlink, and IIRC they just
get a file with the link contents. Not helpful, but not harmful to them
either).

-Peff

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/5] README: use markdown syntax
  2016-02-23 17:40 13% ` [PATCH 1/5] README: use markdown syntax Matthieu Moy
@ 2016-02-23 19:07  0%   ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-02-23 19:07 UTC (permalink / raw)
  To: Matthieu Moy; +Cc: git, emma.westby

Matthieu Moy <Matthieu.Moy@imag.fr> writes:

> This allows repository browsers like GitHub to display the content of
> the file nicely formatted.
>
> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
> ---

To be honest, I have the most problem with this step in the whole
series.

Markdown when rendered may be easier to read, but plain text is even
easier, and it somehow feels backward to cater to those who browse
at GitHub sacrificing those who use "less" in the source tree.

>  README => README.md | 6 +-----
>  t/t7001-mv.sh       | 2 +-
>  2 files changed, 2 insertions(+), 6 deletions(-)
>  rename README => README.md (93%)
>
> diff --git a/README b/README.md
> similarity index 93%
> rename from README
> rename to README.md
> index 1083735..907eb3b 100644
> --- a/README
> +++ b/README.md
> @@ -1,8 +1,4 @@
> -////////////////////////////////////////////////////////////////
> -
> -	Git - the stupid content tracker
> -
> -////////////////////////////////////////////////////////////////
> +# Git - the stupid content tracker
>  
>  "git" can mean anything, depending on your mood.
>  
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index 51dd2b4..4008fae 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -102,7 +102,7 @@ test_expect_success \
>  
>  test_expect_success \
>      'adding another file' \
> -    'cp "$TEST_DIRECTORY"/../README path0/README &&
> +    'cp "$TEST_DIRECTORY"/../README.md path0/README &&
>       git add path0/README &&
>       git commit -m add2 -a'

^ permalink raw reply	[relevance 0%]

* [RFC/PATCH 0/5] Make README more pleasant to read
@ 2016-02-23 17:40  5% Matthieu Moy
  2016-02-23 17:40 13% ` [PATCH 1/5] README: use markdown syntax Matthieu Moy
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Matthieu Moy @ 2016-02-23 17:40 UTC (permalink / raw)
  To: git; +Cc: emma.westby, Matthieu Moy

This patch series was inspired by a discussion I had with Emma Jane
after Git Merge last year. It tries both to make the README file less
agressive and generally more pleasant to read.

To get a quick overview, compare the old one:

  https://github.com/git/git#readme

and my proposal:

  https://github.com/moy/git/tree/git-readme#readme

Matthieu Moy (5):
  README: use markdown syntax
  README.md: add hyperlinks on filenames
  README.md: move the link to git-scm.com up
  README.md: don't call git stupid in the title
  README.md: move down historical explanation about the name

 README => README.md | 54 ++++++++++++++++++++++++++++-------------------------
 t/t7001-mv.sh       |  2 +-
 2 files changed, 30 insertions(+), 26 deletions(-)
 rename README => README.md (67%)

-- 
2.7.2.334.g35ed2ae.dirty

^ permalink raw reply	[relevance 5%]

* [PATCH 1/5] README: use markdown syntax
  2016-02-23 17:40  5% [RFC/PATCH 0/5] Make README more pleasant to read Matthieu Moy
@ 2016-02-23 17:40 13% ` Matthieu Moy
  2016-02-23 19:07  0%   ` Junio C Hamano
  2016-02-24 10:22  0% ` [RFC/PATCH 0/5] Make README more pleasant to read Jeff King
  2016-02-25  8:37  4% ` [PATCH v2 " Matthieu Moy
  2 siblings, 1 reply; 200+ results
From: Matthieu Moy @ 2016-02-23 17:40 UTC (permalink / raw)
  To: git; +Cc: emma.westby, Matthieu Moy

This allows repository browsers like GitHub to display the content of
the file nicely formatted.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 README => README.md | 6 +-----
 t/t7001-mv.sh       | 2 +-
 2 files changed, 2 insertions(+), 6 deletions(-)
 rename README => README.md (93%)

diff --git a/README b/README.md
similarity index 93%
rename from README
rename to README.md
index 1083735..907eb3b 100644
--- a/README
+++ b/README.md
@@ -1,8 +1,4 @@
-////////////////////////////////////////////////////////////////
-
-	Git - the stupid content tracker
-
-////////////////////////////////////////////////////////////////
+# Git - the stupid content tracker
 
 "git" can mean anything, depending on your mood.
 
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 51dd2b4..4008fae 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -102,7 +102,7 @@ test_expect_success \
 
 test_expect_success \
     'adding another file' \
-    'cp "$TEST_DIRECTORY"/../README path0/README &&
+    'cp "$TEST_DIRECTORY"/../README.md path0/README &&
      git add path0/README &&
      git commit -m add2 -a'
 
-- 
2.7.2.334.g35ed2ae.dirty

^ permalink raw reply related	[relevance 13%]

* What's cooking in git.git (Jan 2016, #05; Tue, 26)
@ 2016-01-27  0:27  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-01-27  0:27 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

The tip of 'master' now has a few batches of topics merged, some of
which should later be merged to 'maint'.  There are a few topics
that are v2.7.0 regression fixes still cooking outside 'master',
which also need to be merged to 'maint' for the maintenance release.

Quite a many topics have been merged to 'next', all of them feel
quite solid.  Hopefully more to follow in the rest of the week.

A big thank-you to Elia Pinto for resurrecting a long-stalled http
proxy-auth topic.

You can find the changes described here in the integration branches of the
repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* ak/format-patch-odir-config (2016-01-13) 1 commit
  (merged to 'next' on 2016-01-20 at 97c699b)
 + format-patch: introduce format.outputDirectory configuration

 "git format-patch" learned to notice format.outputDirectory
 configuration variable.  This allows "-o <dir>" option to be
 omitted on the command line if you always use the same directory in
 your workflow.


* ep/shell-command-substitution-style (2016-01-12) 92 commits
  (merged to 'next' on 2016-01-20 at ae1b1d8)
 + t9901-git-web--browse.sh: use the $( ... ) construct for command substitution
 + t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
 + t9350-fast-export.sh: use the $( ... ) construct for command substitution
 + t9300-fast-import.sh: use the $( ... ) construct for command substitution
 + t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
 + t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
 + t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
 + t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
 + t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
 + t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
 + t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
 + t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
 + t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
 + t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
 + t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
 + t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
 + t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
 + t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
 + t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
 + t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
 + t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
 + t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
 + t/t9001-send-email.sh: use the $( ... ) construct for command substitution
 + t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
 + t/t7700-repack.sh: use the $( ... ) construct for command substitution
 + t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
 + t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 + t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 + t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
 + t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
 + t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
 + t/t7006-pager.sh: use the $( ... ) construct for command substitution
 + t/t7004-tag.sh: use the $( ... ) construct for command substitution
 + t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
 + t/t7001-mv.sh: use the $( ... ) construct for command substitution
 + t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
 + t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
 + t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
 + t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
 + t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
 + t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
 + t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
 + t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
 + t/t5601-clone.sh: use the $( ... ) construct for command substitution
 + t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
 + t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
 + t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
 + t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
 + t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
 + t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
 + t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
 + t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
 + t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
 + t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
 + t/t5510-fetch.sh: use the $( ... ) construct for command substitution
 + t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
 + t/t5505-remote.sh: use the $( ... ) construct for command substitution
 + t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
 + t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
 + t/t5304-prune.sh: use the $( ... ) construct for command substitution
 + t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
 + t/t5100: no need to use 'echo' command substitutions for globbing
 + t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
 + t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
 + t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
 + t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
 + t/t3700-add.sh: use the $( ... ) construct for command substitution
 + t/t3600-rm.sh: use the $( ... ) construct for command substitution
 + t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
 + t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
 + t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
 + t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
 + t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
 + t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
 + t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
 + t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
 + t/t1700-split-index.sh: use the $( ... ) construct for command substitution
 + t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
 + t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
 + t/t1410-reflog.sh: use the $( ... ) construct for command substitution
 + t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
 + t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
 + unimplemented.sh: use the $( ... ) construct for command substitution
 + test-sha1.sh: use the $( ... ) construct for command substitution
 + t/lib-httpd.sh: use the $( ... ) construct for command substitution
 + git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
 + contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution

 A shell script style update to change `command substitution` into
 $(command substitution).  Coverts contrib/ and much of the t/
 directory contents.


* jk/ok-to-fail-gc-auto-in-rebase (2016-01-13) 1 commit
  (merged to 'next' on 2016-01-20 at c9a8e82)
 + rebase: ignore failures from "gc --auto"

 "git rebase", unlike all other callers of "gc --auto", did not
 ignore the exit code from "gc --auto".


* jk/symbolic-ref (2016-01-13) 6 commits
  (merged to 'next' on 2016-01-20 at 30b5408)
 + lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
 + lock_ref_sha1_basic: always fill old_oid while holding lock
 + checkout,clone: check return value of create_symref
 + create_symref: write reflog while holding lock
 + create_symref: use existing ref-lock code
 + create_symref: modernize variable names

 The low-level code that is used to create symbolic references has
 been updated to share more code with the code that deals with
 normal references.


* js/close-packs-before-gc (2016-01-13) 4 commits
  (merged to 'next' on 2016-01-20 at 16cf87b)
 + receive-pack: release pack files before garbage-collecting
 + merge: release pack files before garbage-collecting
 + am: release pack files before garbage-collecting
 + fetch: release pack files before garbage-collecting

 Many codepaths that run "gc --auto" before exiting kept packfiles
 mapped and left the file descriptors to them open, which was not
 friendly to systems that cannot remove files that are open.  They
 now close the packs before doing so.


* js/pull-rebase-i (2016-01-13) 3 commits
  (merged to 'next' on 2016-01-20 at a0c5440)
 + completion: add missing branch.*.rebase values
 + remote: handle the config setting branch.*.rebase=interactive
 + pull: allow interactive rebase with --rebase=interactive

 "git pull --rebase" has been extended to allow invoking
 "rebase -i".


* rm/subtree-unwrap-tags (2015-11-24) 1 commit
  (merged to 'next' on 2016-01-20 at 6373d95)
 + contrib/subtree: unwrap tag refs

 "git subtree" (in contrib/) records the tag object name in the
 commit log message when a subtree is added using a tag, without
 peeling it down to the underlying commit.  The tag needs to be
 peeled when "git subtree split" wants to work on the commit, but
 the command forgot to do so.


* rp/p4-filetype-change (2016-01-13) 1 commit
  (merged to 'next' on 2016-01-20 at 7b5954b)
 + git-p4.py: add support for filetype change

 "git p4" learned to cope with the type of a file getting changed.

--------------------------------------------------
[New Topics]

* lv/add-doc-working-tree (2016-01-21) 1 commit
  (merged to 'next' on 2016-01-26 at c5b1ab1)
 + git-add doc: do not say working directory when you mean working tree

 Will merge to 'master'.


* mk/asciidoctor-bq-workaround (2016-01-20) 1 commit
  (merged to 'next' on 2016-01-26 at 19a742a)
 + Documentation: remove unnecessary backslashes

 Will merge to 'master'.


* nd/diff-with-path-params (2016-01-21) 2 commits
  (merged to 'next' on 2016-01-26 at b29a363)
 + diff: make -O and --output work in subdirectory
 + diff-no-index: do not take a redundant prefix argument

 A few options of "git diff" did not work well when the command was
 run from a subdirectory.

 Will merge to 'master'.


* tb/complete-word-diff-regex (2016-01-20) 1 commit
  (merged to 'next' on 2016-01-26 at a5beecc)
 + completion: complete "diff --word-diff-regex="

 Will merge to 'master'.


* tg/ls-remote-symref (2016-01-19) 5 commits
  (merged to 'next' on 2016-01-26 at e466ee2)
 + ls-remote: add support for showing symrefs
 + ls-remote: use parse-options api
 + ls-remote: fix synopsis
 + ls-remote: document --refs option
 + ls-remote: document --quiet option

 Teach "ls-remote" an option to show which branch the remote
 repository advertises as its primary by pointing its HEAD at.

 Will merge to 'master'.


* jk/ref-cache-non-repository-optim (2016-01-25) 2 commits
  (merged to 'next' on 2016-01-26 at 09057bc)
 + resolve_gitlink_ref: ignore non-repository paths
 + clean: make is_git_repository a public function

 Teach the underlying machinery used by "ls-files -o" and other
 commands not to create empty submodule ref cache for a directory
 that is not a submodule.  This removes a ton of wasted CPU cycles.

 Will merge to 'master'.


* jk/completion-rebase (2016-01-25) 1 commit
  (merged to 'next' on 2016-01-26 at def3e0b)
 + completion: add missing git-rebase options

 Will merge to 'master'.


* jk/list-tag-2.7-regression (2016-01-26) 2 commits
  (merged to 'next' on 2016-01-26 at fb9ccee)
 + tag: do not show ambiguous tag names as "tags/foo"
 + t6300: use test_atom for some un-modern tests

 "git tag" started listing a tag "foo" as "tags/foo" when a branch
 named "foo" exists in the same repository; remove this unnecessary
 disambiguation, which is a regression introduced in v2.7.0.

 Will merge to 'master'.


* pw/completion-show-branch (2016-01-25) 1 commit
  (merged to 'next' on 2016-01-26 at d0d7735)
 + completion: complete show-branch "--date-order"

 Will merge to 'master'.


* js/mingw-tests (2016-01-26) 20 commits
 - mingw: skip a test in t9130 that cannot pass on Windows
 - mingw: do not bother to test funny file names
 - mingw: handle the missing POSIXPERM prereq in t9124
 - mingw: avoid illegal filename in t9118
 - mingw: mark t9100's test cases with appropriate prereqs
 - Avoid absolute path in t0008
 - mingw: work around pwd issues in the tests
 - mingw: fix t9700's assumption about directory separators
 - mingw: skip test in t1508 that fails due to path conversion
 - tests: turn off git-daemon tests if FIFOs are not available
 - mingw: disable mkfifo-based tests
 - mingw: accomodate t0060-path-utils for MSYS2
 - mingw: fix t5601-clone.sh
 - mingw: let lstat() fail with errno == ENOTDIR when appropriate
 - mingw: try to delete target directory before renaming
 - mingw: prepare the TMPDIR environment variable for shell scripts
 - mingw: factor out Windows specific environment setup
 - Git.pm: stop assuming that absolute paths start with a slash
 - mingw: do not trust MSYS2's MinGW gettext.sh
 - mingw: let's use gettext with MSYS2
 (this branch uses js/msys2.)

 Updates test scripts to remove assumptions that are not portable
 between Git for POSIX and Git for Windows, or to skip ones with
 expectations that are not satisfiable on Git for Windows.

 Looks mostly done, but I had to tweak a few things, so
 Waiting for re-test.


* js/xmerge-maker-eol (2016-01-26) 2 commits
 - merge-file: ensure that conflict sections match eol style
 - merge-file: let conflict markers match end-of-line style of the context

 The low-level merge machinery has been taught to use CRLF line
 termination when inserting conflict markers to merged contents that
 are themselves CRLF line-terminated.

 Will merge to 'next'.


* nd/clear-gitenv-upon-use-of-alias (2016-01-26) 3 commits
 - git: simplify environment save/restore logic
 - git: protect against unbalanced calls to {save,restore}_env()
 - git: remove an early return from save_env_before_alias()

 The automatic typo correction applied to an alias was broken
 with a recent change already in 'master'.

 Waiting for a response.
 This is my attempt to clarify an original from Duy by splitting it
 into a minimal fix and clean-up.


* pw/completion-stash (2016-01-26) 1 commit
  (merged to 'next' on 2016-01-26 at e41153c)
 + completion: update completion arguments for stash

 Will merge to 'master'.

--------------------------------------------------
[Stalled]

* mg/httpd-tests-update-for-apache-2.4 (2015-04-08) 2 commits
 - t/lib-git-svn: check same httpd module dirs as lib-httpd
 - t/lib-httpd: load mod_unixd

 This is the first two commits in a three-patch series $gmane/266962

 Becoming tired of waiting for a reroll.
 with updated log message ($gmane/268061).
 Will discard.


* jc/diff-b-m (2015-02-23) 5 commits
 . WIPWIP
 . WIP: diff-b-m
 - diffcore-rename: allow easier debugging
 - diffcore-rename.c: add locate_rename_src()
 - diffcore-break: allow debugging

 "git diff -B -M" produced incorrect patch when the postimage of a
 completely rewritten file is similar to the preimage of a removed
 file; such a resulting file must not be expressed as a rename from
 other place.

 The fix in this patch is broken, unfortunately.
 Will discard.

--------------------------------------------------
[Cooking]

* kf/http-proxy-auth-methods (2016-01-26) 2 commits
 - http: use credential API to handle proxy authentication
 - http: allow selection of proxy authentication method

 New http.proxyAuthMethod configuration variable can be used to
 specify what authentication method to use, as a way to work around
 proxies that do not give error response expected by libcurl when
 CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
 has been taught to use credential API to store the authentication
 material in user's keyrings.

 Will merge to 'next'.


* dg/subtree-rebase-test (2016-01-19) 1 commit
 - contrib/subtree: Add a test for subtree rebase that loses commits

 Reviewed up to v5.
 Will be rerolled.
 ($gmane/284426)


* jk/shortlog (2016-01-19) 7 commits
  (merged to 'next' on 2016-01-22 at f1c688c)
 + shortlog: don't warn on empty author
 + shortlog: optimize out useless string list
 + shortlog: optimize out useless "<none>" normalization
 + shortlog: optimize "--summary" mode
 + shortlog: replace hand-parsing of author with pretty-printer
 + shortlog: use strbufs to read from stdin
 + shortlog: match both "Author:" and "author" on stdin

 "git shortlog" used to accumulate various pieces of information
 regardless of what was asked to be shown in the final output.  It
 has been optimized by noticing what need not to be collected
 (e.g. there is no need to collect the log messages when showing
 only the number of changes).

 Will merge to 'master'.


* jc/peace-with-crlf (2016-01-15) 12 commits
  (merged to 'next' on 2016-01-26 at 08724bc)
 + test-sha1-array: read command stream with strbuf_getline()
 + grep: read -f file with strbuf_getline()
 + send-pack: read list of refs with strbuf_getline()
 + column: read lines with strbuf_getline()
 + cat-file: read batch stream with strbuf_getline()
 + transport-helper: read helper response with strbuf_getline()
 + clone/sha1_file: read info/alternates with strbuf_getline()
 + remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
 + ident.c: read /etc/mailname with strbuf_getline()
 + rev-parse: read parseopt spec with strbuf_getline()
 + revision: read --stdin with strbuf_getline()
 + hash-object: read --stdin-paths with strbuf_getline()
 (this branch uses jc/strbuf-getline.)

 Teach codepaths that communicate with users by reading text files
 to be more lenient to editors that write CRLF-terminated lines.
 Note that this is only about communication with Git, like feeding
 list of object names from the standard input instead of from the
 command line, and does not involve files in the working tree.

 Will merge to 'master'.


* dg/subtree-test (2016-01-19) 1 commit
  (merged to 'next' on 2016-01-26 at 81f1356)
 + contrib/subtree: Make testing easier

 Will merge to 'master'.


* jk/filter-branch-no-index (2016-01-19) 1 commit
  (merged to 'next' on 2016-01-22 at 312aa2c)
 + filter-branch: resolve $commit^{tree} in no-index case

 A recent optimization to filter-branch in v2.7.0 introduced a
 regression when --prune-empty filter is used, which has been
 corrected.

 Will merge to 'master'.


* jk/sanity (2016-01-19) 1 commit
  (merged to 'next' on 2016-01-22 at 612cc5f)
 + test-lib: clarify and tighten SANITY

 The description for SANITY prerequisite the test suite uses has
 been clarified both in the comment and in the implementation.

 Will merge to 'master'.


* ls/travis-prove-order (2016-01-26) 2 commits
  (merged to 'next' on 2016-01-26 at d8e2a4a)
 + travis-ci: explicity use container-based infrastructure
 + travis-ci: run previously failed tests first, then slowest to fastest

 By persisting runtime statistics of previous "prove" run, execute
 tests that take longer before other ones, to reduce the total
 wallclock time when running with Travis CI.

 Will merge to 'master'.


* nd/do-not-move-worktree-manually (2016-01-22) 2 commits
  (merged to 'next' on 2016-01-26 at c539221)
 + worktree: stop supporting moving worktrees manually
 + worktree.c: fix indentation

 "git worktree" had a broken code that attempted to auto-fix
 possible inconsistency that results from end-users moving a
 worktree to different places without telling Git (the original
 repository needs to maintain backpointers to its worktrees, but
 "mv" run by end-users who are not familiar with that fact will
 obviously not adjust them), which actually made things worse
 when triggered.

 Will merge to 'master'.


* sb/submodule-init (2016-01-25) 2 commits
 - submodule: port init from shell to C
 - submodule: port resolve_relative_url from shell to C
 (this branch uses sb/submodule-parallel-update.)

 Major part of "git submodule init" has been ported to C.

 Will have to wait for 'sb/submodule-parallel-update'.


* js/msys2 (2016-01-15) 9 commits
  (merged to 'next' on 2016-01-22 at 8bab6ab)
 + mingw: uglify (a, 0) definitions to shut up warnings
 + mingw: squash another warning about a cast
 + mingw: avoid warnings when casting HANDLEs to int
 + mingw: avoid redefining S_* constants
 + compat/winansi: support compiling with MSys2
 + compat/mingw: support MSys2-based MinGW build
 + nedmalloc: allow compiling with MSys2's compiler
 + config.mak.uname: supporting 64-bit MSys2
 + config.mak.uname: support MSys2
 (this branch is used by js/mingw-tests.)

 Beginning of the upstreaming process of Git for Windows effort.

 Will merge to 'master'.


* tk/interpret-trailers-in-place (2016-01-14) 2 commits
  (merged to 'next' on 2016-01-22 at 5db0cf8)
 + interpret-trailers: add option for in-place editing
 + trailer: allow to write to files other than stdout

 "interpret-trailers" has been taught to optionally update a file in
 place, instead of always writing the result to the standard output.

 Will merge to 'master'.


* js/dirname-basename (2016-01-25) 6 commits
  (merged to 'next' on 2016-01-26 at b16b2b8)
 + mingw: avoid linking to the C library's isalpha()
  (merged to 'next' on 2016-01-20 at d198512)
 + t0060: loosen overly strict expectations
  (merged to 'next' on 2016-01-12 at c3c970a)
 + t0060: verify that basename() and dirname() work as expected
 + compat/basename.c: provide a dirname() compatibility function
 + compat/basename: make basename() conform to POSIX
 + Refactor skipping DOS drive prefixes

 dirname() emulation has been added, as Msys2 lacks it.

 Will merge to 'master'.


* wp/sha1-name-negative-match (2016-01-13) 2 commits
 - object name: introduce '^{/!-<negative pattern>}' notation
 - test for '!' handling in rev-parse's named commits

 Introduce "<branch>^{/!-<pattern>}" notation to name a commit
 reachable from <branch> that does not match the given <pattern>.

 A questionable corner case where commit has no message remains.

 Waiting for review.
 ($gmane/283971)


* jk/notes-merge-from-anywhere (2016-01-17) 1 commit
  (merged to 'next' on 2016-01-26 at c60ac66)
 + notes: allow merging from arbitrary references

 "git notes merge" used to limit the source of the merged notes tree
 to somewhere under refs/notes/ hierarchy, which was too limiting
 when inventing a workflow to exchange notes with remote
 repositories using remote-tracking notes trees (located in e.g.
 refs/remote-notes/ or somesuch).

 Will merge to 'master'.


* dt/unpack-compare-entry-optim (2016-01-22) 2 commits
  (merged to 'next' on 2016-01-26 at 110e053)
 + unpack-trees: fix accidentally quadratic behavior
  (merged to 'next' on 2016-01-20 at 180dccf)
 + do_compare_entry: use already-computed path

 "git checkout $branch" (and other operations that share the same
 underlying machinery) has been optimized.

 Will merge to 'master'.


* cc/untracked (2016-01-25) 11 commits
 - t7063: add tests for core.untrackedCache
 - test-dump-untracked-cache: don't modify the untracked cache
 - config: add core.untrackedCache
 - dir: simplify untracked cache "ident" field
 - dir: add remove_untracked_cache()
 - dir: add {new,add}_untracked_cache()
 - update-index: move 'uc' var declaration
 - update-index: add untracked cache notifications
 - update-index: add --test-untracked-cache
 - update-index: use enum for untracked cache options
 - dir: free untracked cache when removing it

 Update the untracked cache subsystem and change its primary UI from
 "git update-index" to "git config".

 Will merge to 'next'.


* dt/refs-backend-lmdb (2016-01-12) 22 commits
 . DONTMERGE: compilation fix
 . refs: tests for lmdb backend
 . refs: add LMDB refs backend
 . svn: learn ref-storage argument
 . refs: allow ref backend to be set for clone
 . clone: use child_process for recursive checkouts
 . refs: check submodules ref storage config
 . init: allow alternate backends to be set for new repos
 . refs: always handle non-normal refs in files backend
 . refs: resolve symbolic refs first
 . refs: allow log-only updates
 . refs: move duplicate check to common code
 . refs: make lock generic
 . refs: add method to rename refs
 . refs: add methods to init refs db
 . refs: add method for delete_refs
 . refs: add method for initial ref transaction commit
 . refs: add methods for reflog
 . refs: add do_for_each_per_worktree_ref
 . refs: add methods for the ref iterators
 . refs: add methods for misc ref operations
 . refs: add a backend method structure with transaction functions

 Building on top of a few refs-backend preparatory series, LMDB
 based refs backend has been plugged into the system.

 Rerolled, but left out of 'pu' for now due to conflicts.


* dw/subtree-split-do-not-drop-merge (2016-01-20) 1 commit
  (merged to 'next' on 2016-01-26 at 3cfefef)
 + contrib/subtree: fix "subtree split" skipped-merge bug

 The "split" subcommand of "git subtree" (in contrib/) incorrectly
 skipped merges when it shouldn't, which was corrected.

 Will merge to 'master'.


* kn/ref-filter-atom-parsing (2016-01-05) 15 commits
 . ref-filter: introduce objectname_atom_parser()
 . ref-filter: introduce contents_atom_parser()
 . ref-filter: introduce remote_ref_atom_parser()
 . ref-filter: align: introduce long-form syntax
 . ref-filter: convert variable 'width' to an unsigned int
 . ref-filter: introduce parse_align_position()
 . ref-filter: introduce align_atom_parser()
 . ref-filter: introduce color_atom_parser()
 . ref-filter: skip deref specifier in match_atom_name()
 . ref-fitler: bump match_atom() name to the top
 . ref-filter: introduce parsing functions for each valid atom
 . ref-filter: introduce struct used_atom
 . ref-filter: bump 'used_atom' and related code to the top
 . ref-filter: use strbuf_split_str_omit_term()
 . strbuf: introduce strbuf_split_str_omit_term()

 Refactoring of ref-filter's format-parsing code, in preparation
 for "branch --format" and friends.

 Ejected as this will need to be rerolled on top of regression fix
 for "git tag" that started sharing the internal machinery with
 ref-filter that happened in v2.7.0.

 Needs reroll.
 ($gmane/284776).


* dk/gc-more-wo-pack (2016-01-13) 4 commits
 - gc: clean garbage .bitmap files from pack dir
 - t5304: ensure non-garbage files are not deleted
 - t5304: test .bitmap garbage files
 - prepare_packed_git(): find more garbage

 Follow-on to dk/gc-idx-wo-pack topic, to clean up stale
 .bitmap and .keep files.

 Waiting for a reroll.
 ($gmane/284368).


* tb/ls-files-eol (2016-01-18) 1 commit
  (merged to 'next' on 2016-01-26 at bc9246f)
 + ls-files: add eol diagnostics

 Add options to ls-files to help diagnose end-of-line problems.

 Will merge to 'master'.


* ec/annotate-deleted (2015-11-20) 1 commit
 - annotate: skip checking working tree if a revision is provided

 Usability fix for annotate-specific "<file> <rev>" syntax with deleted
 files.

 Waiting for review.


* sb/submodule-parallel-update (2016-01-12) 8 commits
 - clone: allow an explicit argument for parallel submodule clones
 - submodule update: expose parallelism to the user
 - git submodule update: have a dedicated helper for cloning
 - fetching submodules: respect `submodule.fetchJobs` config option
 - submodule-config: introduce parse_generic_submodule_config
 - submodule-config: remove name_and_item_from_var
 - submodule-config: drop check against NULL
 - submodule-config: keep update strategy around
 (this branch is used by sb/submodule-init.)

 Builds on top of the "fetch --recurse-submodules" work to introduce
 parallel downloading into multiple submodules for "submodule update".

 Needs review.


* jc/strbuf-getline (2016-01-15) 9 commits
  (merged to 'next' on 2016-01-22 at 8c4e051)
 + strbuf: give strbuf_getline() to the "most text friendly" variant
 + checkout-index: there are only two possible line terminations
 + update-index: there are only two possible line terminations
 + check-ignore: there are only two possible line terminations
 + check-attr: there are only two possible line terminations
 + mktree: there are only two possible line terminations
 + strbuf: introduce strbuf_getline_{lf,nul}()
 + strbuf: make strbuf_getline_crlf() global
 + strbuf: miniscule style fix
 (this branch is used by jc/peace-with-crlf.)

 The preliminary clean-up for jc/peace-with-crlf topic.

 Will merge to 'master'.


* js/am-3-merge-recursive-direct (2015-10-12) 2 commits
 - am: make a direct call to merge_recursive
 - merge_recursive_options: introduce the "gently" flag

 The merge_recursive_generic() function has been made a bit safer to
 call from inside a process.  "git am -3" was taught to make a direct
 call to the function when falling back to three-way merge.

 Being able to make a direct call would be good in general, but as a
 performance thing, the change needs to be backed up by numbers.

 Needs review.

 I haven't gone through the "gently" change with fine toothed comb;
 I can see that the change avoids calling die(), but I haven't made
 sure that the program states (e.g. what's in the in-core index) are
 adjusted sensibly when it returns to the caller instead of dying,
 or the codepaths that used to die() are free of resource leaks.
 The original code certainly did not care the program states at the
 point of dying exactly because it knew it is going to exit, but now
 they have to care, and they need to be audited.


* ad/cygwin-wants-rename (2015-08-07) 1 commit
 - config.mak.uname: Cygwin needs OBJECT_CREATION_USES_RENAMES

 Will hold.
 ($gmane/275680).


* jc/rerere-multi (2016-01-21) 7 commits
 - rerere: do use multiple variants
 - t4200: rerere a merge with two identical conflicts
 - rerere: allow multiple variants to exist
 - rerere: delay the recording of preimage
 - rerere: handle leftover rr-cache/$ID directory and postimage files
 - rerere: scan $GIT_DIR/rr-cache/$ID when instantiating a rerere_id
 - rerere: split conflict ID further

 "git rerere" can encounter two or more files with the same conflict
 signature that have to be resolved in different ways, but there was
 no way to record these separate resolutions.

 Needs further work on forget/gc.


* jc/merge-drop-old-syntax (2015-04-29) 1 commit
 - merge: drop 'git merge <message> HEAD <commit>' syntax

 Stop supporting "git merge <message> HEAD <commit>" syntax that has
 been deprecated since October 2007.  It has been reported that
 git-gui still uses the deprecated syntax, which needs to be fixed
 before this final step can proceed.
 ($gmane/282594)

--------------------------------------------------
[Discarded]

* bb/merge-marker-crlf (2015-11-24) 1 commit
 . merge-file: consider core.crlf when writing merge markers

 Resurrected as 'js/xmerge-maker-eol'.


* sg/sh-require-clean-orphan (2015-11-24) 2 commits
 . sh-setup: make require_clean_work_tree() work on orphan branches
 . Add tests for git-sh-setup's require_clean_work_tree()

 Allow users of git-sh-setup to handle orphan branch state.
 ($gmane/284488)

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Jan 2016, #04; Wed, 20)
@ 2016-01-20 23:33  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-01-20 23:33 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

The tip of 'master' now has second batch of topics merged, some of
which should later be merged to 'maint'.  There are a few topics
that are v2.7.0 regression fixes still cooking outside 'master',
which also need to be merged to 'maint' for the maintenance release.

You can find the changes described here in the integration branches of the
repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* dk/reflog-walk-with-non-commit (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at 5f7b10e)
 + reflog-walk: don't segfault on non-commit sha1's in the reflog

 "git reflog" incorrectly assumed that all objects that used to be
 at the tip of a ref must be commits, which caused it to segfault.


* dw/signoff-doc (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at 1b08b48)
 + Expand documentation describing --signoff

 The documentation has been updated to hint the connection between
 the '--signoff' option and DCO.


* ew/for-each-ref-doc (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at e5c4e75)
 + for-each-ref: document `creatordate` and `creator` fields


* ew/send-email-mutt-alias-fix (2016-01-04) 1 commit
  (merged to 'next' on 2016-01-12 at 84d1329)
 + git-send-email: do not double-escape quotes from mutt

 "git send-email" was confused by escaped quotes stored in the alias
 files saved by "mutt", which has been corrected.


* ho/gitweb-squelch-undef-warning (2016-01-12) 1 commit
  (merged to 'next' on 2016-01-12 at ef4fc5f)
 + gitweb: squelch "uninitialized value" warning

 Asking gitweb for a nonexistent commit left a warning in the server
 log.

 Somebody may want to follow this up with a new test, perhaps?
 IIRC, we do test that no Perl warnings are given to the server log,
 so this should have been caught if our test coverage were good.


* jk/clang-pedantic (2016-01-04) 2 commits
  (merged to 'next' on 2016-01-12 at b5be271)
 + bswap: add NO_UNALIGNED_LOADS define
 + avoid shifting signed integers 31 bits

 A few unportable C construct have been spotted by clang compiler
 and have been fixed.


* jk/pack-revindex (2015-12-21) 2 commits
  (merged to 'next' on 2016-01-12 at 2e39a16)
 + pack-revindex: store entries directly in packed_git
 + pack-revindex: drop hash table

 In-core storage of the reverse index for .pack files (which lets
 you go from a pack offset to an object name) has been streamlined.


* js/fopen-harder (2016-01-11) 2 commits
  (merged to 'next' on 2016-01-12 at c6ef194)
 + Handle more file writes correctly in shared repos
 + commit: allow editing the commit message even in shared repos

 Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
 (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
 done.  This however did not work well if the repository is set to
 be shared with core.sharedRepository and the umask of the previous
 user is tighter.  They have been made to work better by calling
 unlink(2) and retrying after fopen(3) fails with EPERM.


* mh/notes-allow-reading-treeish (2016-01-12) 1 commit
  (merged to 'next' on 2016-01-12 at 7aa311f)
 + notes: allow treeish expressions as notes ref

 Originally merged to 'next' on 2015-10-23

 Some "git notes" operations, e.g. "git log --notes=<note>", should
 be able to read notes from any tree-ish that is shaped like a notes
 tree, but the notes infrastructure required that the argument must
 be a ref under refs/notes/.  Loosen it to require a valid ref only
 when the operation would update the notes (in which case we must
 have a place to store the updated notes tree, iow, a ref).


* nd/clear-gitenv-upon-use-of-alias (2015-12-29) 5 commits
  (merged to 'next' on 2016-01-12 at 696b1f5)
 + run-command: don't warn on SIGPIPE deaths
 + git.c: make sure we do not leak GIT_* to alias scripts
 + setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
 + git.c: make it clear save_env() is for alias handling only
 + Merge branch 'nd/stop-setenv-work-tree' into nd/clear-gitenv-upon-use-of-alias

 d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
 $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
 handling by overwriting GIT_WORK_TREE environment variable to
 affect subprocesses when set_git_work_tree() gets called, which
 resulted in a rather unpleasant regression to "clone" and "init".
 Try to address the same issue by always restoring the environment
 and respawning the real underlying command when handling alias.


* nd/dir-exclude-cleanup (2015-12-28) 1 commit
  (merged to 'next' on 2016-01-12 at e6584c9)
 + dir.c: clean the entire struct in clear_exclude_list()

 The "exclude_list" structure has the usual "alloc, nr" pair of
 fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
 to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
 array.


* nd/exclusion-regression-fix (2016-01-08) 1 commit
  (merged to 'next' on 2016-01-12 at 0eb98a5)
 + Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"

 The ignore mechanism saw a few regressions around untracked file
 listing and sparse checkout selection areas in 2.7.0; the change
 that is responsible for the regression has been reverted.


* nd/ita-cleanup (2015-12-28) 3 commits
  (merged to 'next' on 2016-01-12 at 008a6e3)
 + grep: make it clear i-t-a entries are ignored
 + add and use a convenience macro ce_intent_to_add()
 + blame: remove obsolete comment

 Paths that have been told the index about with "add -N" are not
 quite yet in the index, but a few commands behaved as if they
 already are in a harmful way.


* sg/t6050-failing-editor-test-fix (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at dc08a19)
 + t6050-replace: make failing editor test more robust


* ss/clone-depth-single-doc (2016-01-08) 3 commits
  (merged to 'next' on 2016-01-12 at 16ded8c)
 + docs: clarify that --depth for git-fetch works with newly initialized repos
 + docs: say "commits" in the --depth option wording for git-clone
 + docs: clarify that passing --depth to git-clone implies --single-branch

 Documentation for "git fetch --depth" has been updated for clarity.


* ss/user-manual (2015-12-30) 4 commits
  (merged to 'next' on 2016-01-12 at c7f0328)
 + user-manual: add addition gitweb information
 + user-manual: add section documenting shallow clones
 + glossary: define the term shallow clone
 + user-manual: remove temporary branch entry from todo list

 Drop a few old "todo" items by deciding that the change one of them
 suggests is not such a good idea, and doing the change the other
 one suggested to do.


* tg/grep-no-index-fallback (2016-01-12) 2 commits
  (merged to 'next' on 2016-01-12 at 8960bdd)
 + builtin/grep: add grep.fallbackToNoIndex config
 + t7810: correct --no-index test

 "git grep" by default does not fall back to its "--no-index"
 behaviour outside a directory under Git's control (otherwise the
 user may by mistake end up running a huge recursive search); with a
 new configuration (set in $HOME/.gitconfig--by definition this
 cannot be set in the config file per project), this safety can be
 disabled.

--------------------------------------------------
[New Topics]

* dg/subtree-rebase-test (2016-01-19) 1 commit
 - contrib/subtree: Add a test for subtree rebase that loses commits

 Reviewed up to v5.
 Will be rerolled.
 ($gmane/284426)


* jk/shortlog (2016-01-19) 7 commits
 - shortlog: don't warn on empty author
 - shortlog: optimize out useless string list
 - shortlog: optimize out useless "<none>" normalization
 - shortlog: optimize "--summary" mode
 - shortlog: replace hand-parsing of author with pretty-printer
 - shortlog: use strbufs to read from stdin
 - shortlog: match both "Author:" and "author" on stdin

 "git shortlog" used to accumulate various pieces of information
 regardless of what was asked to be shown in the final output.  It
 has been optimized by noticing what need not to be collected
 (e.g. there is no need to collect the log messages when showing
 only the number of changes).

 Will merge to 'next'.


* jc/peace-with-crlf (2016-01-15) 12 commits
 - test-sha1-array: read command stream with strbuf_getline()
 - grep: read -f file with strbuf_getline()
 - send-pack: read list of refs with strbuf_getline()
 - column: read lines with strbuf_getline()
 - cat-file: read batch stream with strbuf_getline()
 - transport-helper: read helper response with strbuf_getline()
 - clone/sha1_file: read info/alternates with strbuf_getline()
 - remote.c: read $GIT_DIR/remotes/* with strbuf_getline()
 - ident.c: read /etc/mailname with strbuf_getline()
 - rev-parse: read parseopt spec with strbuf_getline()
 - revision: read --stdin with strbuf_getline()
 - hash-object: read --stdin-paths with strbuf_getline()
 (this branch uses jc/strbuf-getline.)

 Teach codepaths that communicate with users by reading text files
 to be more lenient to editors that write CRLF-terminated lines.
 Note that this is only about communication with Git, like feeding
 list of object names from the standard input instead of from the
 command line, and does not involve files in the working tree.

 Will merge to 'next'.


* dg/subtree-test (2016-01-19) 1 commit
 - contrib/subtree: Make testing easier

 Needs review.
 ($gmane/284277)


* jk/filter-branch-no-index (2016-01-19) 1 commit
 - filter-branch: resolve $commit^{tree} in no-index case

 A recent optimization to filter-branch in v2.7.0 introduced a
 regression when --prune-empty filter is used, which has been
 corrected.

 Will merge to 'next'.


* jk/sanity (2016-01-19) 1 commit
 - test-lib: clarify and tighten SANITY

 The description for SANITY prerequisite the test suite uses has
 been clarified both in the comment and in the implementation.

 Will merge to 'next'.


* ls/travis-prove-order (2016-01-19) 1 commit
 - travis-ci: run previously failed tests first, then slowest to fastest

 By persisting runtime statistics of previous "prove" run, execute
 tests that take longer before other ones, to reduce the total
 wallclock time when running with Travis CI.

 Waiting for a reroll.
 ($gmane/284431)


* nd/do-not-move-worktree-manually (2016-01-19) 2 commits
 - worktree: stop supporting moving worktrees manually
 - worktree.c: fix indentation

 "git worktree" had a broken code that attempted to auto-fix
 possible inconsistency that results from end-users moving a
 worktree to different places without telling Git (the original
 repository needs to maintain backpointers to its worktrees, but
 "mv" run by end-users who are not familiar with that fact will
 obviously not adjust them), which actually made things worse
 when triggered.

 Will merge to 'next'.


* sb/submodule-init (2016-01-20) 2 commits
 - submodule: port init from shell to C
 - submodule: port resolve_relative_url from shell to C
 (this branch uses sb/submodule-parallel-update.)

 Needs review.
 ($gmane/284419)

--------------------------------------------------
[Stalled]

* kf/http-proxy-auth-methods (2015-11-04) 3 commits
 . SQUASH???
 . http: use credential API to handle proxy authentication
 . http: allow selection of proxy authentication method

 New http.proxyAuthMethod configuration variable can be used to
 specify what authentication method to use, as a way to work around
 proxies that do not give error response expected by libcurl when
 CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
 has been taught to use credential API to store the authentication
 material in user's keyrings.

 I ejected this from pu for the moment, as it conflicts with the
 pt/http-socks-proxy topic. That is now in master, so it can
 be re-rolled on top.

 Anybody wants to help rerolling this?  Otherwise will discard.


* mg/httpd-tests-update-for-apache-2.4 (2015-04-08) 2 commits
 - t/lib-git-svn: check same httpd module dirs as lib-httpd
 - t/lib-httpd: load mod_unixd

 This is the first two commits in a three-patch series $gmane/266962

 Becoming tired of waiting for a reroll.
 with updated log message ($gmane/268061).
 Will discard.


* jc/diff-b-m (2015-02-23) 5 commits
 . WIPWIP
 . WIP: diff-b-m
 - diffcore-rename: allow easier debugging
 - diffcore-rename.c: add locate_rename_src()
 - diffcore-break: allow debugging

 "git diff -B -M" produced incorrect patch when the postimage of a
 completely rewritten file is similar to the preimage of a removed
 file; such a resulting file must not be expressed as a rename from
 other place.

 The fix in this patch is broken, unfortunately.
 Will discard.

--------------------------------------------------
[Cooking]

* js/pull-rebase-i (2016-01-13) 3 commits
  (merged to 'next' on 2016-01-20 at a0c5440)
 + completion: add missing branch.*.rebase values
 + remote: handle the config setting branch.*.rebase=interactive
 + pull: allow interactive rebase with --rebase=interactive

 "git pull --rebase" has been extended to allow invoking
 "rebase -i".

 Will merge to 'master'.


* jk/ok-to-fail-gc-auto-in-rebase (2016-01-13) 1 commit
  (merged to 'next' on 2016-01-20 at c9a8e82)
 + rebase: ignore failures from "gc --auto"

 "git rebase", unlike all other callers of "gc --auto", did not
 ignore the exit code from "gc --auto".

 Will merge to 'master'.


* js/close-packs-before-gc (2016-01-13) 4 commits
  (merged to 'next' on 2016-01-20 at 16cf87b)
 + receive-pack: release pack files before garbage-collecting
 + merge: release pack files before garbage-collecting
 + am: release pack files before garbage-collecting
 + fetch: release pack files before garbage-collecting

 Many codepaths that run "gc --auto" before exiting kept packfiles
 mapped and left the file descriptors to them open, which was not
 friendly to systems that cannot remove files that are open.  They
 now close the packs before doing so.

 Will merge to 'master'.


* js/msys2 (2016-01-15) 9 commits
 - mingw: uglify (a, 0) definitions to shut up warnings
 - mingw: squash another warning about a cast
 - mingw: avoid warnings when casting HANDLEs to int
 - mingw: avoid redefining S_* constants
 - compat/winansi: support compiling with MSys2
 - compat/mingw: support MSys2-based MinGW build
 - nedmalloc: allow compiling with MSys2's compiler
 - config.mak.uname: supporting 64-bit MSys2
 - config.mak.uname: support MSys2

 Beginning of the upstreaming process of Git for Windows effort.

 Will merge to 'next'.


* rp/p4-filetype-change (2016-01-13) 1 commit
  (merged to 'next' on 2016-01-20 at 7b5954b)
 + git-p4.py: add support for filetype change

 Will merge to 'master'.


* tk/interpret-trailers-in-place (2016-01-14) 2 commits
 - interpret-trailers: add option for in-place editing
 - trailer: allow to write to files other than stdout

 "interpret-trailers" has been taught to optionally update a file in
 place, instead of always writing the result to the standard output.

 Will merge to 'next'.


* js/dirname-basename (2016-01-15) 5 commits
  (merged to 'next' on 2016-01-20 at d198512)
 + t0060: loosen overly strict expectations
  (merged to 'next' on 2016-01-12 at c3c970a)
 + t0060: verify that basename() and dirname() work as expected
 + compat/basename.c: provide a dirname() compatibility function
 + compat/basename: make basename() conform to POSIX
 + Refactor skipping DOS drive prefixes

 dirname() emulation has been added, as Msys2 lacks it.

 Will merge to 'master'.


* wp/sha1-name-negative-match (2016-01-13) 2 commits
 - object name: introduce '^{/!-<negative pattern>}' notation
 - test for '!' handling in rev-parse's named commits

 Introduce "<branch>^{/!-<pattern>}" notation to name a commit
 reachable from <branch> that does not match the given <pattern>.

 A questionable corner case where commit has no message remains.

 Waiting for review.
 ($gmane/283971)


* ak/format-patch-odir-config (2016-01-13) 1 commit
  (merged to 'next' on 2016-01-20 at 97c699b)
 + format-patch: introduce format.outputDirectory configuration

 Allow "-o <dir>" option to be omitted on the command line of "git
 format-patch" if you always use the same directory in your
 workflow.

 Will merge to 'master'.


* jk/notes-merge-from-anywhere (2016-01-17) 1 commit
 - notes: allow merging from arbitrary references

 "git notes merge" used to limit the source of the merged notes tree
 to somewhere under refs/notes/ hierarchy, which was too limiting
 when inventing a workflow to exchange notes with remote
 repositories using remote-tracking notes trees (located in e.g.
 refs/remote-notes/ or somesuch).

 Will merge to 'next'.


* dt/unpack-compare-entry-optim (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-20 at 180dccf)
 + do_compare_entry: use already-computed path

 Will merge to 'master'.


* jk/symbolic-ref (2016-01-13) 6 commits
  (merged to 'next' on 2016-01-20 at 30b5408)
 + lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
 + lock_ref_sha1_basic: always fill old_oid while holding lock
 + checkout,clone: check return value of create_symref
 + create_symref: write reflog while holding lock
 + create_symref: use existing ref-lock code
 + create_symref: modernize variable names

 The low-level code that is used to create symbolic references has
 been updated to share more code with the code that deals with
 normal references.

 Will merge to 'master'.


* ep/shell-command-substitution-style (2016-01-12) 92 commits
  (merged to 'next' on 2016-01-20 at ae1b1d8)
 + t9901-git-web--browse.sh: use the $( ... ) construct for command substitution
 + t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
 + t9350-fast-export.sh: use the $( ... ) construct for command substitution
 + t9300-fast-import.sh: use the $( ... ) construct for command substitution
 + t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
 + t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
 + t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
 + t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
 + t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
 + t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
 + t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
 + t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
 + t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
 + t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
 + t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
 + t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
 + t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
 + t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
 + t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
 + t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
 + t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
 + t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
 + t/t9001-send-email.sh: use the $( ... ) construct for command substitution
 + t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
 + t/t7700-repack.sh: use the $( ... ) construct for command substitution
 + t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
 + t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 + t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 + t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
 + t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
 + t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
 + t/t7006-pager.sh: use the $( ... ) construct for command substitution
 + t/t7004-tag.sh: use the $( ... ) construct for command substitution
 + t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
 + t/t7001-mv.sh: use the $( ... ) construct for command substitution
 + t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
 + t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
 + t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
 + t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
 + t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
 + t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
 + t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
 + t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
 + t/t5601-clone.sh: use the $( ... ) construct for command substitution
 + t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
 + t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
 + t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
 + t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
 + t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
 + t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
 + t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
 + t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
 + t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
 + t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
 + t/t5510-fetch.sh: use the $( ... ) construct for command substitution
 + t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
 + t/t5505-remote.sh: use the $( ... ) construct for command substitution
 + t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
 + t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
 + t/t5304-prune.sh: use the $( ... ) construct for command substitution
 + t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
 + t/t5100: no need to use 'echo' command substitutions for globbing
 + t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
 + t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
 + t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
 + t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
 + t/t3700-add.sh: use the $( ... ) construct for command substitution
 + t/t3600-rm.sh: use the $( ... ) construct for command substitution
 + t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
 + t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
 + t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
 + t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
 + t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
 + t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
 + t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
 + t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
 + t/t1700-split-index.sh: use the $( ... ) construct for command substitution
 + t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
 + t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
 + t/t1410-reflog.sh: use the $( ... ) construct for command substitution
 + t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
 + t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
 + unimplemented.sh: use the $( ... ) construct for command substitution
 + test-sha1.sh: use the $( ... ) construct for command substitution
 + t/lib-httpd.sh: use the $( ... ) construct for command substitution
 + git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
 + contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
 + contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution

 A shell script style update to change `command substitution` into
 $(command substitution).  Coverts contrib/ and much of the t/
 directory contents.

 Will merge to 'master'.


* cc/untracked (2016-01-20) 11 commits
 - t7063: add tests for core.untrackedCache
 - test-dump-untracked-cache: don't modify the untracked cache
 - config: add core.untrackedCache
 - dir: simplify untracked cache "ident" field
 - dir: add remove_untracked_cache()
 - dir: add {new,add}_untracked_cache()
 - update-index: move 'uc' var declaration
 - update-index: add untracked cache notifications
 - update-index: add --test-untracked-cache
 - update-index: use enum for untracked cache options
 - dir: free untracked cache when removing it

 Update the untracked cache subsystem and change its primary UI from
 "git update-index" to "git config".

 Will merge to 'next'.


* dt/refs-backend-lmdb (2016-01-12) 22 commits
 . DONTMERGE: compilation fix
 . refs: tests for lmdb backend
 . refs: add LMDB refs backend
 . svn: learn ref-storage argument
 . refs: allow ref backend to be set for clone
 . clone: use child_process for recursive checkouts
 . refs: check submodules ref storage config
 . init: allow alternate backends to be set for new repos
 . refs: always handle non-normal refs in files backend
 . refs: resolve symbolic refs first
 . refs: allow log-only updates
 . refs: move duplicate check to common code
 . refs: make lock generic
 . refs: add method to rename refs
 . refs: add methods to init refs db
 . refs: add method for delete_refs
 . refs: add method for initial ref transaction commit
 . refs: add methods for reflog
 . refs: add do_for_each_per_worktree_ref
 . refs: add methods for the ref iterators
 . refs: add methods for misc ref operations
 . refs: add a backend method structure with transaction functions

 Building on top of a few refs-backend preparatory series, LMDB
 based refs backend has been plugged into the system.

 Rerolled, but left out of 'pu' for now due to conflicts.


* dw/subtree-split-do-not-drop-merge (2016-01-20) 1 commit
 - contrib/subtree: fix "subtree split" skipped-merge bug

 The "split" subcommand of "git subtree" (in contrib/) incorrectly
 skipped merges when it shouldn't, which was corrected.

 Will merge to 'next'.


* kn/ref-filter-atom-parsing (2016-01-05) 15 commits
 - ref-filter: introduce objectname_atom_parser()
 - ref-filter: introduce contents_atom_parser()
 - ref-filter: introduce remote_ref_atom_parser()
 - ref-filter: align: introduce long-form syntax
 - ref-filter: convert variable 'width' to an unsigned int
 - ref-filter: introduce parse_align_position()
 - ref-filter: introduce align_atom_parser()
 - ref-filter: introduce color_atom_parser()
 - ref-filter: skip deref specifier in match_atom_name()
 - ref-fitler: bump match_atom() name to the top
 - ref-filter: introduce parsing functions for each valid atom
 - ref-filter: introduce struct used_atom
 - ref-filter: bump 'used_atom' and related code to the top
 - ref-filter: use strbuf_split_str_omit_term()
 - strbuf: introduce strbuf_split_str_omit_term()

 Refactoring of ref-filter's format-parsing code, in preparation
 for "branch --format" and friends.

 This replaces (for now) kn/for-each-ref-remainder, which will be built
 on top.

 Still being discussed and worked on.


* bb/merge-marker-crlf (2015-11-24) 1 commit
 - merge-file: consider core.crlf when writing merge markers

 Write out merge markers using system end-of-line convention.

 Waiting for a re-roll to handle gitattributes.
 ($gmane/281701)


* dk/gc-more-wo-pack (2016-01-13) 4 commits
 - gc: clean garbage .bitmap files from pack dir
 - t5304: ensure non-garbage files are not deleted
 - t5304: test .bitmap garbage files
 - prepare_packed_git(): find more garbage

 Follow-on to dk/gc-idx-wo-pack topic, to clean up stale
 .bitmap and .keep files.

 Waiting for a reroll.
 ($gmane/284368).


* rm/subtree-unwrap-tags (2015-11-24) 1 commit
  (merged to 'next' on 2016-01-20 at 6373d95)
 + contrib/subtree: unwrap tag refs

 "git subtree" (in contrib/) records the tag object name in the
 commit log message when a subtree is added using a tag, without
 peeling it down to the underlying commit.  The tag needs to be
 peeled when "git subtree split" wants to work on the commit, but
 the command forgot to do so.

 Will merge to 'master'.


* sg/sh-require-clean-orphan (2015-11-24) 2 commits
 - sh-setup: make require_clean_work_tree() work on orphan branches
 - Add tests for git-sh-setup's require_clean_work_tree()

 Allow users of git-sh-setup to handle orphan branch state.

 This series takes the conservative route of requiring scripts to opt
 into the looser behavior, at the expense of carrying around a new
 option-flag forever. I'm not sure if we need to do so.

 Needs review.


* tb/ls-files-eol (2016-01-18) 1 commit
 - ls-files: add eol diagnostics

 Add options to ls-files to help diagnose end-of-line problems.

 Will merge to 'next'.


* ec/annotate-deleted (2015-11-20) 1 commit
 - annotate: skip checking working tree if a revision is provided

 Usability fix for annotate-specific "<file> <rev>" syntax with deleted
 files.

 Waiting for review.


* sb/submodule-parallel-update (2016-01-12) 8 commits
 - clone: allow an explicit argument for parallel submodule clones
 - submodule update: expose parallelism to the user
 - git submodule update: have a dedicated helper for cloning
 - fetching submodules: respect `submodule.fetchJobs` config option
 - submodule-config: introduce parse_generic_submodule_config
 - submodule-config: remove name_and_item_from_var
 - submodule-config: drop check against NULL
 - submodule-config: keep update strategy around
 (this branch is used by sb/submodule-init.)

 Builds on top of the "fetch --recurse-submodules" work to introduce
 parallel downloading into multiple submodules for "submodule update".

 Needs review.


* jc/strbuf-getline (2016-01-15) 9 commits
 - strbuf: give strbuf_getline() to the "most text friendly" variant
 - checkout-index: there are only two possible line terminations
 - update-index: there are only two possible line terminations
 - check-ignore: there are only two possible line terminations
 - check-attr: there are only two possible line terminations
 - mktree: there are only two possible line terminations
 - strbuf: introduce strbuf_getline_{lf,nul}()
 - strbuf: make strbuf_getline_crlf() global
 - strbuf: miniscule style fix
 (this branch is used by jc/peace-with-crlf.)

 The preliminary clean-up for jc/peace-with-crlf topic.

 Will merge to 'next'.


* js/am-3-merge-recursive-direct (2015-10-12) 2 commits
 - am: make a direct call to merge_recursive
 - merge_recursive_options: introduce the "gently" flag

 The merge_recursive_generic() function has been made a bit safer to
 call from inside a process.  "git am -3" was taught to make a direct
 call to the function when falling back to three-way merge.

 Being able to make a direct call would be good in general, but as a
 performance thing, the change needs to be backed up by numbers.

 Needs review.

 I haven't gone through the "gently" change with fine toothed comb;
 I can see that the change avoids calling die(), but I haven't made
 sure that the program states (e.g. what's in the in-core index) are
 adjusted sensibly when it returns to the caller instead of dying,
 or the codepaths that used to die() are free of resource leaks.
 The original code certainly did not care the program states at the
 point of dying exactly because it knew it is going to exit, but now
 they have to care, and they need to be audited.


* ad/cygwin-wants-rename (2015-08-07) 1 commit
 - config.mak.uname: Cygwin needs OBJECT_CREATION_USES_RENAMES

 Will hold.
 ($gmane/275680).


* jc/rerere-multi (2015-09-14) 7 commits
 - rerere: do use multiple variants
 - t4200: rerere a merge with two identical conflicts
 - rerere: allow multiple variants to exist
 - rerere: delay the recording of preimage
 - rerere: handle leftover rr-cache/$ID directory and postimage files
 - rerere: scan $GIT_DIR/rr-cache/$ID when instantiating a rerere_id
 - rerere: split conflict ID further

 "git rerere" can encounter two or more files with the same conflict
 signature that have to be resolved in different ways, but there was
 no way to record these separate resolutions.

 Needs review.


* jc/merge-drop-old-syntax (2015-04-29) 1 commit
 - merge: drop 'git merge <message> HEAD <commit>' syntax

 Stop supporting "git merge <message> HEAD <commit>" syntax that has
 been deprecated since October 2007.  It has been reported that
 git-gui still uses the deprecated syntax, which needs to be fixed
 before this final step can proceed.
 ($gmane/282594)

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Jan 2016, #03; Wed, 13)
@ 2016-01-13 22:23  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-01-13 22:23 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

The tip of 'next' has been rewound.  A handful of topics have
graduated to 'master'.  A few topics that are fixes to 2.7.0 started
cooking in 'next'.

You can find the changes described here in the integration branches of the
repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* ea/blame-progress (2015-12-16) 1 commit
  (merged to 'next' on 2015-12-22 at f8e8643)
 + blame: add support for --[no-]progress option

 Originally merged to 'next' on 2015-12-22

 "git blame" learned to produce the progress eye-candy when it takes
 too much time before emitting the first line of the result.


* ep/make-phoney (2015-12-16) 1 commit
  (merged to 'next' on 2015-12-22 at 27c7593)
 + Makefile: add missing phony target

 Originally merged to 'next' on 2015-12-22

 A slight update to the Makefile.


* nd/stop-setenv-work-tree (2015-12-22) 1 commit
  (merged to 'next' on 2015-12-22 at 6d7bb0c)
 + Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
 (this branch is used by nd/clear-gitenv-upon-use-of-alias.)

 Originally merged to 'next' on 2015-12-22

 An earlier change in 2.5.x-era broke users' hooks and aliases by
 exporting GIT_WORK_TREE to point at the root of the working tree,
 interfering when they tried to use a different working tree without
 setting GIT_WORK_TREE environment themselves.


* ps/push-delete-option (2015-12-16) 2 commits
  (merged to 'next' on 2015-12-22 at d83cc1d)
 + push: add '-d' as shorthand for '--delete'
 + push: add '--delete' flag to synopsis

 Originally merged to 'next' on 2015-12-22

 "branch --delete" has "branch -d" but "push --delete" does not.


* sb/submodule-parallel-fetch (2015-12-16) 7 commits
  (merged to 'next' on 2015-12-22 at 44e84ff)
 + submodules: allow parallel fetching, add tests and documentation
 + fetch_populated_submodules: use new parallel job processing
 + run-command: add an asynchronous parallel child processor
 + sigchain: add command to pop all common signals
 + strbuf: add strbuf_read_once to read without blocking
 + xread: poll on non blocking fds
 + submodule.c: write "Fetching submodule <foo>" to stderr
 (this branch is used by sb/submodule-parallel-update.)

 Originally merged to 'next' on 2015-12-22

 Add a framework to spawn a group of processes in parallel, and use
 it to run "git fetch --recurse-submodules" in parallel.

 Rerolled and this seems to be a lot cleaner.  The merge of the
 earlier one to 'next' has been reverted.


* vl/grep-configurable-threads (2015-12-16) 3 commits
  (merged to 'next' on 2015-12-22 at 8954705)
 + grep: add --threads=<num> option and grep.threads configuration
 + grep: slight refactoring to the code that disables threading
 + grep: allow threading even on a single-core machine

 Originally merged to 'next' on 2015-12-22

 "git grep" can now be configured (or told from the command line)
 how many threads to use when searching in the working tree files.

--------------------------------------------------
[New Topics]

* ho/gitweb-squelch-undef-warning (2016-01-12) 1 commit
  (merged to 'next' on 2016-01-12 at ef4fc5f)
 + gitweb: squelch "uninitialized value" warning

 Asking gitweb for a nonexistent commit left a warning in the server
 log.

 Somebody may want to follow this up with a new test, perhaps?
 IIRC, we do test that no Perl warnings are given to the server log,
 so this should have been caught if our test coverage were good.

 Will merge to 'master'.


* tg/grep-no-index-fallback (2016-01-12) 2 commits
  (merged to 'next' on 2016-01-12 at 8960bdd)
 + builtin/grep: add grep.fallbackToNoIndex config
 + t7810: correct --no-index test

 "git grep" by default does not fall back to its --no-index
 behaviour outside a directory under Git's control (otherwise the
 user may by mistake end up running a huge recursive search); with a
 new configuration (set in $HOME/.gitconfig--by definition this
 cannot be set in the config file per project), this safety can be
 disabled.

 Will merge to 'master'.


* js/pull-rebase-i (2016-01-13) 3 commits
 - completion: add missing branch.*.rebase values
 - remote: handle the config setting branch.*.rebase=interactive
 - pull: allow interactive rebase with --rebase=interactive

 "git pull --rebase" has been extended to allow invoking
 "rebase -i".

 Will merge to 'next'.


* jk/ok-to-fail-gc-auto-in-rebase (2016-01-13) 1 commit
 - rebase: ignore failures from "gc --auto"

 "git rebase", unlike all other callers of "gc --auto", did not
 ignore the exit code from "gc --auto".

 Will merge to 'next'.


* js/close-packs-before-gc (2016-01-13) 4 commits
 - receive-pack: release pack files before garbage-collecting
 - merge: release pack files before garbage-collecting
 - am: release pack files before garbage-collecting
 - fetch: release pack files before garbage-collecting

 Many codepaths that run "gc --auto" before exiting kept packfiles
 mapped and left the file descriptors to them open, which was not
 friendly to systems that cannot remove files that are open.  They
 now close the packs before doing so.

 Will merge to 'next'.


* js/msys2 (2016-01-13) 5 commits
 - compat/winansi: support compiling with MSys2
 - compat/mingw: support MSys2-based MinGW build
 - nedmalloc: allow compiling with MSys2's compiler
 - config.mak.uname: supporting 64-bit MSys2
 - config.mak.uname: support MSys2

 Beginning of the upstreaming process of Git for Windows effort.

 Waiting for review.
 ($gmane/283975).


* rp/p4-filetype-change (2016-01-13) 1 commit
 - git-p4.py: add support for filetype change

 Will merge to 'next'.


* tk/interpret-trailers-in-place (2016-01-13) 2 commits
 - interpret-trailers: add option for in-place editing
 - trailer: use fprintf instead of printf

 "interpret-trailers" has been taught to optionally update a file in
 place, instead of always writing the result to the standard output.

 Test may need to be updated to ensure a failing rewrite does not
 clobber the original input.

 Waiting for review.
 ($gmane/283959).

--------------------------------------------------
[Stalled]

* kf/http-proxy-auth-methods (2015-11-04) 3 commits
 . SQUASH???
 . http: use credential API to handle proxy authentication
 . http: allow selection of proxy authentication method

 New http.proxyAuthMethod configuration variable can be used to
 specify what authentication method to use, as a way to work around
 proxies that do not give error response expected by libcurl when
 CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
 has been taught to use credential API to store the authentication
 material in user's keyrings.

 I ejected this from pu for the moment, as it conflicts with the
 pt/http-socks-proxy topic. That is now in master, so it can
 be re-rolled on top.

 Anybody wants to help rerolling this?  Otherwise will discard.


* mg/httpd-tests-update-for-apache-2.4 (2015-04-08) 2 commits
 - t/lib-git-svn: check same httpd module dirs as lib-httpd
 - t/lib-httpd: load mod_unixd

 This is the first two commits in a three-patch series $gmane/266962

 Becoming tired of waiting for a reroll.
 with updated log message ($gmane/268061).
 Will discard.


* jc/diff-b-m (2015-02-23) 5 commits
 . WIPWIP
 . WIP: diff-b-m
 - diffcore-rename: allow easier debugging
 - diffcore-rename.c: add locate_rename_src()
 - diffcore-break: allow debugging

 "git diff -B -M" produced incorrect patch when the postimage of a
 completely rewritten file is similar to the preimage of a removed
 file; such a resulting file must not be expressed as a rename from
 other place.

 The fix in this patch is broken, unfortunately.
 Will discard.

--------------------------------------------------
[Cooking]

* dw/signoff-doc (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at 1b08b48)
 + Expand documentation describing --signoff

 The documentation has been updated to hint the connection between
 the '--signoff' option and DCO.

 Will merge to 'master'.


* ew/for-each-ref-doc (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at e5c4e75)
 + for-each-ref: document `creatordate` and `creator` fields

 Will merge to 'master'.


* sg/t6050-failing-editor-test-fix (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at dc08a19)
 + t6050-replace: make failing editor test more robust

 Will merge to 'master'.


* js/dirname-basename (2016-01-12) 4 commits
  (merged to 'next' on 2016-01-12 at c3c970a)
 + t0060: verify that basename() and dirname() work as expected
 + compat/basename.c: provide a dirname() compatibility function
 + compat/basename: make basename() conform to POSIX
 + Refactor skipping DOS drive prefixes

 dirname() emulation has been added, as Msys2 lacks it.

 The test needs to be loosened to allow implementation defined
 behaviour; currently it fails on Macs.

 Waiting for an update.
 ($gmane/283968).


* js/fopen-harder (2016-01-11) 2 commits
  (merged to 'next' on 2016-01-12 at c6ef194)
 + Handle more file writes correctly in shared repos
 + commit: allow editing the commit message even in shared repos

 Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
 (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
 done.  This however did not work well if the repository is set to
 be shared with core.sharedRepository and the umask of the previous
 user is tighter.  Make them work better by calling unlink(2) and
 retrying after fopen(3) fails with EPERM.

 Will merge to 'master'.


* nd/exclusion-regression-fix (2016-01-08) 1 commit
  (merged to 'next' on 2016-01-12 at 0eb98a5)
 + Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"

 The ignore mechanism saw a few regressions around untracked file
 listing and sparse checkout selection areas in 2.7.0; the change
 that is responsible for the regression has been reverted.

 Will merge to 'master'.


* ss/clone-depth-single-doc (2016-01-08) 3 commits
  (merged to 'next' on 2016-01-12 at 16ded8c)
 + docs: clarify that --depth for git-fetch works with newly initialized repos
 + docs: say "commits" in the --depth option wording for git-clone
 + docs: clarify that passing --depth to git-clone implies --single-branch

 Updates documents to clarify "git fetch --depth".

 Will merge to 'master'.


* wp/sha1-name-negative-match (2016-01-13) 2 commits
 - object name: introduce '^{/!-<negative pattern>}' notation
 - test for '!' handling in rev-parse's named commits

 Introduce "<branch>^{/!-<pattern>}" notation to name a commit
 reachable from <branch> that does not match the given <pattern>.

 A questionable corner case where commit has no message remains.

 Waiting for review.
 ($gmane/283971)


* ak/format-patch-odir-config (2016-01-13) 1 commit
 - format-patch: introduce format.outputDirectory configuration

 Allow "-o <dir>" option to be omitted on the command line of "git
 format-patch" if you always use the same directory in your
 workflow.

 Will merge to 'next'.


* jk/notes-merge-from-anywhere (2015-12-29) 1 commit
 - notes: allow merging from arbitrary references

 "git notes merge" used to limit the source of the merged notes tree
 to somewhere under refs/notes/ hierarchy, which was too limiting
 when inventing a workflow to exchange notes with remote
 repositories using remote-tracking notes trees (located in e.g.
 refs/remote-notes/ or somesuch).

 Needs review.


* dk/reflog-walk-with-non-commit (2016-01-05) 1 commit
  (merged to 'next' on 2016-01-12 at 5f7b10e)
 + reflog-walk: don't segfault on non-commit sha1's in the reflog

 "git reflog" incorrectly assumed that all objects that used to be
 at the tip of a ref must be commits, which caused it to segfault.

 Will merge to 'master'.


* ew/send-email-mutt-alias-fix (2016-01-04) 1 commit
  (merged to 'next' on 2016-01-12 at 84d1329)
 + git-send-email: do not double-escape quotes from mutt

 "git send-email" was confused by escaped quotes stored in the alias
 files saved by "mutt".

 Will merge to 'master'.


* jk/clang-pedantic (2016-01-04) 2 commits
  (merged to 'next' on 2016-01-12 at b5be271)
 + bswap: add NO_UNALIGNED_LOADS define
 + avoid shifting signed integers 31 bits

 A few unportable C construct have been spotted by clang compiler
 and have been fixed.

 Will merge to 'master'.


* dt/unpack-compare-entry-optim (2016-01-05) 1 commit
 - do_compare_entry: use already-computed path

 Will merge to 'next'.


* jk/pack-revindex (2015-12-21) 2 commits
  (merged to 'next' on 2016-01-12 at 2e39a16)
 + pack-revindex: store entries directly in packed_git
 + pack-revindex: drop hash table

 Will merge to 'master'.


* jk/symbolic-ref (2016-01-13) 6 commits
 - lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
 - lock_ref_sha1_basic: always fill old_oid while holding lock
 - checkout,clone: check return value of create_symref
 - create_symref: write reflog while holding lock
 - create_symref: use existing ref-lock code
 - create_symref: modernize variable names

 The low-level code that is used to create symbolic references has
 been updated to share more code with the code that deals with
 normal references.

 Will merge to 'next'.


* ep/shell-command-substitution-style (2016-01-12) 92 commits
 - t9901-git-web--browse.sh: use the $( ... ) construct for command substitution
 - t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
 - t9350-fast-export.sh: use the $( ... ) construct for command substitution
 - t9300-fast-import.sh: use the $( ... ) construct for command substitution
 - t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
 - t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
 - t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
 - t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
 - t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
 - t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
 - t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
 - t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
 - t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
 - t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
 - t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
 - t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
 - t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
 - t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
 - t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
 - t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
 - t9101-git-svn-props.sh: use the $( ... ) construct for command substitution
 - t9100-git-svn-basic.sh: use the $( ... ) construct for command substitution
 - t/t9001-send-email.sh: use the $( ... ) construct for command substitution
 - t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
 - t/t7700-repack.sh: use the $( ... ) construct for command substitution
 - t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
 - t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 - t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 - t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
 - t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
 - t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
 - t/t7006-pager.sh: use the $( ... ) construct for command substitution
 - t/t7004-tag.sh: use the $( ... ) construct for command substitution
 - t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
 - t/t7001-mv.sh: use the $( ... ) construct for command substitution
 - t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
 - t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
 - t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
 - t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
 - t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
 - t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
 - t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
 - t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
 - t/t5601-clone.sh: use the $( ... ) construct for command substitution
 - t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
 - t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
 - t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
 - t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
 - t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
 - t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
 - t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
 - t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
 - t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
 - t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
 - t/t5510-fetch.sh: use the $( ... ) construct for command substitution
 - t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
 - t/t5505-remote.sh: use the $( ... ) construct for command substitution
 - t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
 - t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
 - t/t5304-prune.sh: use the $( ... ) construct for command substitution
 - t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
 - t/t5100: no need to use 'echo' command substitutions for globbing
 - t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
 - t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
 - t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
 - t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
 - t/t3700-add.sh: use the $( ... ) construct for command substitution
 - t/t3600-rm.sh: use the $( ... ) construct for command substitution
 - t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
 - t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
 - t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
 - t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
 - t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
 - t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
 - t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
 - t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
 - t/t1700-split-index.sh: use the $( ... ) construct for command substitution
 - t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
 - t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
 - t/t1410-reflog.sh: use the $( ... ) construct for command substitution
 - t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
 - t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
 - unimplemented.sh: use the $( ... ) construct for command substitution
 - test-sha1.sh: use the $( ... ) construct for command substitution
 - t/lib-httpd.sh: use the $( ... ) construct for command substitution
 - git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
 - contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution

 A shell script style update to change `command substitution` into
 $(command substitution).  Coverts contrib/ and much of the t/
 directory contents.

 Will merge to 'next'.


* nd/dir-exclude-cleanup (2015-12-28) 1 commit
  (merged to 'next' on 2016-01-12 at e6584c9)
 + dir.c: clean the entire struct in clear_exclude_list()

 The "exclude_list" structure has the usual "alloc, nr" pair of
 fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
 to reset 'alloc' to 0 when it cleared 'nr' and discarded the
 managed array.

 Will merge to 'master'.


* ss/user-manual (2015-12-30) 4 commits
  (merged to 'next' on 2016-01-12 at c7f0328)
 + user-manual: add addition gitweb information
 + user-manual: add section documenting shallow clones
 + glossary: define the term shallow clone
 + user-manual: remove temporary branch entry from todo list

 Drop a few old "todo" items by deciding that the change one of them
 suggests is not such a good idea, and doing the change the other
 one suggested to do.

 Will merge to 'master'.


* nd/ita-cleanup (2015-12-28) 3 commits
  (merged to 'next' on 2016-01-12 at 008a6e3)
 + grep: make it clear i-t-a entries are ignored
 + add and use a convenience macro ce_intent_to_add()
 + blame: remove obsolete comment

 Paths that have been told the index about with "add -N" are not
 quite yet in the index, but a few commands behaved as if they
 already are in a harmful way.

 Here are only the obviously correct bits; some other changes were
 in the posted series, but not quite ready to be queued here.

 Will merge to 'master'.


* cc/untracked (2015-12-29) 10 commits
 - t7063: add tests for core.untrackedCache
 - config: add core.untrackedCache
 - dir: simplify untracked cache "ident" field
 - dir: add remove_untracked_cache()
 - dir: add {new,add}_untracked_cache()
 - update-index: move 'uc' var declaration
 - update-index: add untracked cache notifications
 - update-index: add --test-untracked-cache
 - update-index: use enum for untracked cache options
 - dir: free untracked cache when removing it

 Update the untracked cache subsystem and change its primary UI from
 "git update-index" to "git config".

 Still being discussed and worked on.
 $gmane/283080


* dt/refs-backend-lmdb (2016-01-12) 22 commits
 . DONTMERGE: compilation fix
 . refs: tests for lmdb backend
 . refs: add LMDB refs backend
 . svn: learn ref-storage argument
 . refs: allow ref backend to be set for clone
 . clone: use child_process for recursive checkouts
 . refs: check submodules ref storage config
 . init: allow alternate backends to be set for new repos
 . refs: always handle non-normal refs in files backend
 . refs: resolve symbolic refs first
 . refs: allow log-only updates
 . refs: move duplicate check to common code
 . refs: make lock generic
 . refs: add method to rename refs
 . refs: add methods to init refs db
 . refs: add method for delete_refs
 . refs: add method for initial ref transaction commit
 . refs: add methods for reflog
 . refs: add do_for_each_per_worktree_ref
 . refs: add methods for the ref iterators
 . refs: add methods for misc ref operations
 . refs: add a backend method structure with transaction functions

 Building on top of a few refs-backend preparatory series, LMDB
 based refs backend has been plugged into the system.

 Rerolled, but left out of 'pu' for now due to conflicts.


* dw/subtree-split-do-not-drop-merge (2015-12-10) 1 commit
 - contrib/subtree: fix "subtree split" skipped-merge bug

 The "split" subcommand of "git subtree" (in contrib/) incorrectly
 skipped merges when it shouldn't, which was corrected.

 Still being worked on.
 ($gmane/283874)


* nd/clear-gitenv-upon-use-of-alias (2015-12-29) 5 commits
  (merged to 'next' on 2016-01-12 at 696b1f5)
 + run-command: don't warn on SIGPIPE deaths
 + git.c: make sure we do not leak GIT_* to alias scripts
 + setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
 + git.c: make it clear save_env() is for alias handling only
 + Merge branch 'nd/stop-setenv-work-tree' into nd/clear-gitenv-upon-use-of-alias

 d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
 $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
 handling by overwriting GIT_WORK_TREE environment variable to
 affect subprocesses when set_git_work_tree() gets called, which
 resulted in a rather unpleasant regression to "clone" and "init".
 Try to address the same issue by always restoring the environment
 and respawning the real underlying command when handling alias.

 Will merge to 'master'.


* kn/ref-filter-atom-parsing (2016-01-05) 15 commits
 - ref-filter: introduce objectname_atom_parser()
 - ref-filter: introduce contents_atom_parser()
 - ref-filter: introduce remote_ref_atom_parser()
 - ref-filter: align: introduce long-form syntax
 - ref-filter: convert variable 'width' to an unsigned int
 - ref-filter: introduce parse_align_position()
 - ref-filter: introduce align_atom_parser()
 - ref-filter: introduce color_atom_parser()
 - ref-filter: skip deref specifier in match_atom_name()
 - ref-fitler: bump match_atom() name to the top
 - ref-filter: introduce parsing functions for each valid atom
 - ref-filter: introduce struct used_atom
 - ref-filter: bump 'used_atom' and related code to the top
 - ref-filter: use strbuf_split_str_omit_term()
 - strbuf: introduce strbuf_split_str_omit_term()

 Refactoring of ref-filter's format-parsing code, in preparation
 for "branch --format" and friends.

 This replaces (for now) kn/for-each-ref-remainder, which will be built
 on top.

 Still being discussed and worked on.


* bb/merge-marker-crlf (2015-11-24) 1 commit
 - merge-file: consider core.crlf when writing merge markers

 Write out merge markers using system end-of-line convention.

 Waiting for a re-roll to handle gitattributes.
 ($gmane/281701)


* dk/gc-more-wo-pack (2016-01-13) 4 commits
 - gc: clean garbage .bitmap files from pack dir
 - t5304: ensure non-garbage files are not deleted
 - t5304: test .bitmap garbage files
 - prepare_packed_git(): find more garbage

 Follow-on to dk/gc-idx-wo-pack topic, to clean up stale
 .bitmap and .keep files.

 Waiting for review.


* rm/subtree-unwrap-tags (2015-11-24) 1 commit
 - contrib/subtree: unwrap tag refs

 "git subtree" (in contrib/) records the tag object name in the
 commit log message when a subtree is added using a tag, without
 peeling it down to the underlying commit.  The tag needs to be
 peeled when "git subtree split" wants to work on the commit, but
 the command forgot to do so.

 Will merge to 'next'.


* sg/sh-require-clean-orphan (2015-11-24) 2 commits
 - sh-setup: make require_clean_work_tree() work on orphan branches
 - Add tests for git-sh-setup's require_clean_work_tree()

 Allow users of git-sh-setup to handle orphan branch state.

 This series takes the conservative route of requiring scripts to opt
 into the looser behavior, at the expense of carrying around a new
 option-flag forever. I'm not sure if we need to do so.

 Needs review.


* tb/ls-files-eol (2016-01-07) 1 commit
 - ls-files: add eol diagnostics

 Add options to ls-files to help diagnose end-of-line problems.

 Will merge to 'next'.


* ec/annotate-deleted (2015-11-20) 1 commit
 - annotate: skip checking working tree if a revision is provided

 Usability fix for annotate-specific "<file> <rev>" syntax with deleted
 files.

 Waiting for review.


* sb/submodule-parallel-update (2016-01-12) 8 commits
 - clone: allow an explicit argument for parallel submodule clones
 - submodule update: expose parallelism to the user
 - git submodule update: have a dedicated helper for cloning
 - fetching submodules: respect `submodule.fetchJobs` config option
 - submodule-config: introduce parse_generic_submodule_config
 - submodule-config: remove name_and_item_from_var
 - submodule-config: drop check against NULL
 - submodule-config: keep update strategy around

 Builds on top of the "fetch --recurse-submodules" work to introduce
 parallel downloading into multiple submodules for "submodule update".

 Needs review.


* jc/strbuf-gets (2015-12-16) 17 commits
 - test-sha1-array: read command stream with strbuf_getline_crlf()
 - grep: read -f file with strbuf_getline_crlf()
 - send-pack: read list of refs with strbuf_getline_crlf()
 - column: read lines with strbuf_getline_crlf()
 - cat-file: read batch stream with strbuf_getline_crlf()
 - transport-helper: read helper response with strbuf_getline_crlf()
 - clone/sha1_file: read info/alternates with strbuf_getline_crlf()
 - remote.c: read $GIT_DIR/remotes/* with strbuf_getline_crlf()
 - ident.c: read /etc/mailname with strbuf_getline_crlf()
 - rev-parse: read parseopt spec with strbuf_getline_crlf()
 - revision: read --stdin with strbuf_getline_crlf()
 - hash-object: read --stdin-paths with strbuf_getline_crlf()
 - mktree: read textual tree representation with strbuf_getline_crlf()
 - update-index: read list of paths with strbuf_getline_crlf() under --stdin
 - update-index: read --index-info with strbuf_getline_crlf()
 - check-attr, check-ignore, checkout-index: read paths with strbuf_getline_crlf()
 - strbuf: make strbuf_getline_crlf() global

 Teach codepaths that communicate with users by reading text files
 to be more lenient to editors that write CRLF-terminated lines.
 Note that this is only about communication with Git, like feeding
 list of object names from the standard input instead of from the
 command line, and does not involve files in the working tree.

 Will be rerolled.


* mh/notes-allow-reading-treeish (2016-01-12) 1 commit
  (merged to 'next' on 2016-01-12 at 7aa311f)
 + notes: allow treeish expressions as notes ref

 Originally merged to 'next' on 2015-10-23

 Some "git notes" operations, e.g. "git log --notes=<note>", should
 be able to read notes from any tree-ish that is shaped like a notes
 tree, but the notes infrastructure required that the argument must
 be a ref under refs/notes/.  Loosen it to require a valid ref only
 when the operation would update the notes (in which case we must
 have a place to store the updated notes tree, iow, a ref).

 Will merge to 'master'.


* js/am-3-merge-recursive-direct (2015-10-12) 2 commits
 - am: make a direct call to merge_recursive
 - merge_recursive_options: introduce the "gently" flag

 The merge_recursive_generic() function has been made a bit safer to
 call from inside a process.  "git am -3" was taught to make a direct
 call to the function when falling back to three-way merge.

 Being able to make a direct call would be good in general, but as a
 performance thing, we would want to see it backed up by numbers.

 I haven't gone through the "gently" change with fine toothed comb;
 I can see that the change avoids calling die(), but I haven't made
 sure that the program states (e.g. what's in the in-core index) are
 adjusted sensibly when it returns to the caller instead of dying,
 or the codepaths that used to die() are free of resource leaks.
 The original code certainly did not care the program states at the
 point of dying exactly because it knew it is going to exit, but now
 they have to care, and they need to be audited.


* ad/cygwin-wants-rename (2015-08-07) 1 commit
 - config.mak.uname: Cygwin needs OBJECT_CREATION_USES_RENAMES

 Will hold.
 ($gmane/275680).


* jc/rerere-multi (2015-09-14) 7 commits
 - rerere: do use multiple variants
 - t4200: rerere a merge with two identical conflicts
 - rerere: allow multiple variants to exist
 - rerere: delay the recording of preimage
 - rerere: handle leftover rr-cache/$ID directory and postimage files
 - rerere: scan $GIT_DIR/rr-cache/$ID when instantiating a rerere_id
 - rerere: split conflict ID further

 "git rerere" can encounter two or more files with the same conflict
 signature that have to be resolved in different ways, but there was
 no way to record these separate resolutions.

 Needs review.


* jc/merge-drop-old-syntax (2015-04-29) 1 commit
 - merge: drop 'git merge <message> HEAD <commit>' syntax

 Stop supporting "git merge <message> HEAD <commit>" syntax that has
 been deprecated since October 2007.  It has been reported that
 git-gui still uses the deprecated syntax, which needs to be fixed
 before this final step can proceed.
 ($gmane/282594)

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Jan 2016, #02; Mon, 11)
@ 2016-01-11 23:45  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2016-01-11 23:45 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

It's been a week or so since Git 2.7 was released.  I'll draw the
projected timeline for the next cycle (which I expect to be a
shorter and lightweight cycle), reorder 'next' and possibly eject a
few topics from it to give them a fresh slate to rebuild on, and
then start the 2.7.x maintenance track soonish, but none of these
has happened yet; I'm feeling behind X-<.

Big thanks to Stephen Smith for picking up a few topics from the
Stalled pile and reviving them.  And as always, thanks for the
regular reviewers (you know who you are) for helping the topics
move forward.

You can find the changes described here in the integration branches of the
repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[New Topics]

* dw/signoff-doc (2016-01-05) 1 commit
 - Expand documentation describing --signoff

 The documentation has been updated to hint the connection between
 the '--signoff' option and DCO.

 Will merge to 'next'.


* ew/for-each-ref-doc (2016-01-05) 1 commit
 - for-each-ref: document `creatordate` and `creator` fields

 Will merge to 'next'.


* sg/t6050-failing-editor-test-fix (2016-01-05) 1 commit
 - t6050-replace: make failing editor test more robust

 Will merge to 'next'.


* js/dirname-basename (2016-01-11) 4 commits
 - t0060: verify that basename() and dirname() work as expected
 - compat/basename.c: provide a dirname() compatibility function
 - compat/basename: make basename() conform to POSIX
 - Refactor skipping DOS drive prefixes

 dirname() emulation has been added, as Msys2 lacks it.

 Will merge to 'next', 'master', and then to 'maint'.

 The third-patch has an optional suggestion to make it easier to
 follow; I'm slightly in favor but lack of a reroll for it is not a
 showstopper, either.


* js/fopen-harder (2016-01-11) 2 commits
 - Handle more file writes correctly in shared repos
 - commit: allow editing the commit message even in shared repos

 Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
 (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
 done.  This however did not work well if the repository is set to
 be shared with core.sharedRepository and the umask of the previous
 user is tighter.  Make them work better by calling unlink(2) and
 retrying after fopen(3) fails with EPERM.

 Will merge to 'next'.


* nd/exclusion-regression-fix (2016-01-08) 1 commit
 - Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"

 The ignore mechanism saw a few regressions around untracked file
 listing and sparse checkout selection areas in 2.7.0; the change
 that is responsible for the regression has been reverted.

 Will merge to 'next' and then to 'master'.


* ss/clone-depth-single-doc (2016-01-08) 3 commits
 - docs: clarify that --depth for git-fetch works with newly initialized repos
 - docs: say "commits" in the --depth option wording for git-clone
 - docs: clarify that passing --depth to git-clone implies --single-branch

 Updates documents to clarify "git fetch --depth".

 Will merge to 'next'.

--------------------------------------------------
[Stalled]

* kf/http-proxy-auth-methods (2015-11-04) 3 commits
 . SQUASH???
 . http: use credential API to handle proxy authentication
 . http: allow selection of proxy authentication method

 New http.proxyAuthMethod configuration variable can be used to
 specify what authentication method to use, as a way to work around
 proxies that do not give error response expected by libcurl when
 CURLAUTH_ANY is used.  Also, the codepath for proxy authentication
 has been taught to use credential API to store the authentication
 material in user's keyrings.

 I ejected this from pu for the moment, as it conflicts with the
 pt/http-socks-proxy topic. That is now in master, so it can
 be re-rolled on top.

 Anybody wants to help rerolling this?  Otherwise will discard.


* mg/httpd-tests-update-for-apache-2.4 (2015-04-08) 2 commits
 - t/lib-git-svn: check same httpd module dirs as lib-httpd
 - t/lib-httpd: load mod_unixd

 This is the first two commits in a three-patch series $gmane/266962

 Becoming tired of waiting for a reroll.
 with updated log message ($gmane/268061).
 Will discard.


* jc/diff-b-m (2015-02-23) 5 commits
 . WIPWIP
 . WIP: diff-b-m
 - diffcore-rename: allow easier debugging
 - diffcore-rename.c: add locate_rename_src()
 - diffcore-break: allow debugging

 "git diff -B -M" produced incorrect patch when the postimage of a
 completely rewritten file is similar to the preimage of a removed
 file; such a resulting file must not be expressed as a rename from
 other place.

 The fix in this patch is broken, unfortunately.
 Will discard.

--------------------------------------------------
[Cooking]

* wp/sha1-name-negative-match (2016-01-11) 2 commits
 - object name: introduce '^{/!-<negative pattern>}' notation
 - test for '!' handling in rev-parse's named commits

 Introduce "<branch>^{/!-<pattern>}" notation to name a commit
 reachable from <branch> that does not match the given <pattern>.


* ak/format-patch-odir-config (2016-01-11) 1 commit
 . format-patch: introduce format.outputDirectory configuration

 Allow "-o <dir>" option to be omitted on the command line of "git
 format-patch" if you always use the same directory in your
 workflow.

 Left out of 'pu' for now as t4014 seems to break with this topic.


* jk/notes-merge-from-anywhere (2015-12-29) 1 commit
 - notes: allow merging from arbitrary references

 "git notes merge" used to limit the source of the merged notes tree
 to somewhere under refs/notes/ hierarchy, which was too limiting
 when inventing a workflow to exchange notes with remote
 repositories using remote-tracking notes trees (located in e.g.
 refs/remote-notes/ or somesuch).

 Needs review.


* dk/reflog-walk-with-non-commit (2016-01-05) 1 commit
 - reflog-walk: don't segfault on non-commit sha1's in the reflog

 "git reflog" incorrectly assumed that all objects that used to be
 at the tip of a ref must be commits, which caused it to segfault.

 Will merge to 'next'.


* ew/send-email-mutt-alias-fix (2016-01-04) 1 commit
 - git-send-email: do not double-escape quotes from mutt

 "git send-email" was confused by escaped quotes stored in the alias
 files saved by "mutt".

 Will merge to 'next'.


* jk/clang-pedantic (2016-01-04) 2 commits
 - bswap: add NO_UNALIGNED_LOADS define
 - avoid shifting signed integers 31 bits

 A few unportable C construct have been spotted by clang compiler
 and have been fixed.

 Will merge to 'next'.


* ea/blame-progress (2015-12-16) 1 commit
  (merged to 'next' on 2015-12-22 at f8e8643)
 + blame: add support for --[no-]progress option

 "git blame" learned to produce the progress eye-candy when it takes
 too much time before emitting the first line of the result.

 Will merge to 'master'.


* dt/unpack-compare-entry-optim (2016-01-05) 1 commit
 - do_compare_entry: use already-computed path

 Will merge to 'next'.


* jk/pack-revindex (2015-12-21) 2 commits
 - pack-revindex: store entries directly in packed_git
 - pack-revindex: drop hash table

 Will merge to 'next'.


* jk/symbolic-ref (2016-01-11) 5 commits
 - lock_ref_sha1_basic: handle REF_NODEREF with invalid refs
 - checkout,clone: check return value of create_symref
 - create_symref: write reflog while holding lock
 - create_symref: use existing ref-lock code
 - create_symref: modernize variable names

 The low-level code that is used to create symbolic references has
 been updated to share more code with the code that deals with
 normal references.

 Will merge to 'next'.


* nd/stop-setenv-work-tree (2015-12-22) 1 commit
  (merged to 'next' on 2015-12-22 at 6d7bb0c)
 + Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
 (this branch is used by nd/clear-gitenv-upon-use-of-alias.)

 An earlier change in 2.5.x-era broke users' hooks and aliases by
 exporting GIT_WORK_TREE to point at the root of the working tree,
 interfering when they tried to use a different working tree without
 setting GIT_WORK_TREE environment themselves.

 Will merge to 'master'.


* ep/update-command-substitution-style (2016-01-11) 70 commits
 - t/t9001-send-email.sh: use the $( ... ) construct for command substitution
 - t/t8003-blame-corner-cases.sh: use the $( ... ) construct for command substitution
 - t/t7700-repack.sh: use the $( ... ) construct for command substitution
 - t/t7602-merge-octopus-many.sh: use the $( ... ) construct for command substitution
 - t/t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 - t/t7504-commit-msg-hook.sh: use the $( ... ) construct for command substitution
 - t/t7408-submodule-reference.sh: use the $( ... ) construct for command substitution
 - t/t7406-submodule-update.sh: use the $( ... ) construct for command substitution
 - t/t7103-reset-bare.sh: use the $( ... ) construct for command substitution
 - t/t7006-pager.sh: use the $( ... ) construct for command substitution
 - t/t7004-tag.sh: use the $( ... ) construct for command substitution
 - t/t7003-filter-branch.sh: use the $( ... ) construct for command substitution
 - t/t7001-mv.sh: use the $( ... ) construct for command substitution
 - t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command substitution
 - t/t6032-merge-large-rename.sh: use the $( ... ) construct for command substitution
 - t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for command substitution
 - t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command substitution
 - t/t6001-rev-list-graft.sh: use the $( ... ) construct for command substitution
 - t/t5900-repo-selection.sh: use the $( ... ) construct for command substitution
 - t/t5710-info-alternate.sh: use the $( ... ) construct for command substitution
 - t/t5700-clone-reference.sh: use the $( ... ) construct for command substitution
 - t/t5601-clone.sh: use the $( ... ) construct for command substitution
 - t/t5570-git-daemon.sh: use the $( ... ) construct for command substitution
 - t/t5550-http-fetch-dumb.sh: use the $( ... ) construct for command substitution
 - t/t5538-push-shallow.sh: use the $( ... ) construct for command substitution
 - t/t5537-fetch-shallow.sh: use the $( ... ) construct for command substitution
 - t/t5532-fetch-proxy.sh: use the $( ... ) construct for command substitution
 - t/t5530-upload-pack-error.sh: use the $( ... ) construct for command substitution
 - t/t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
 - t/t5517-push-mirror.sh: use the $( ... ) construct for command substitution
 - t/t5516-fetch-push.sh: use the $( ... ) construct for command substitution
 - t/t5515-fetch-merge-logic.sh: use the $( ... ) construct for command substitution
 - t/t5510-fetch.sh: use the $( ... ) construct for command substitution
 - t/t5506-remote-groups.sh: use the $( ... ) construct for command substitution
 - t/t5505-remote.sh: use the $( ... ) construct for command substitution
 - t/t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
 - t/t5305-include-tag.sh: use the $( ... ) construct for command substitution
 - t/t5304-prune.sh: use the $( ... ) construct for command substitution
 - t/t5303-pack-corruption-resilience.sh: use the $( ... ) construct for command substitution
 - t/t5100: no need to use 'echo' command substitutions for globbing
 - t/t5302-pack-index.sh: use the $( ... ) construct for command substitution
 - t/t5301-sliding-window.sh: use the $( ... ) construct for command substitution
 - t/t5300-pack-object.sh: use the $( ... ) construct for command substitution
 - t/t5100-mailinfo.sh: use the $( ... ) construct for command substitution
 - t/t3700-add.sh: use the $( ... ) construct for command substitution
 - t/t3600-rm.sh: use the $( ... ) construct for command substitution
 - t/t3511-cherry-pick-x.sh: use the $( ... ) construct for command substitution
 - t/t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
 - t/t3210-pack-refs.sh: use the $( ... ) construct for command substitution
 - t/t3101-ls-tree-dirname.sh: use the $( ... ) construct for command substitution
 - t/t3100-ls-tree-restrict.sh: use the $( ... ) construct for command substitution
 - t/t3030-merge-recursive.sh: use the $( ... ) construct for command substitution
 - t/t2102-update-index-symlinks.sh: use the $( ... ) construct for command substitution
 - t/t2025-worktree-add.sh: use the $( ... ) construct for command substitution
 - t/t1700-split-index.sh: use the $( ... ) construct for command substitution
 - t/t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for command substitution
 - t/t1511-rev-parse-caret.sh: use the $( ... ) construct for command substitution
 - t/t1410-reflog.sh: use the $( ... ) construct for command substitution
 - t/t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
 - t/t1100-commit-tree-options.sh: use the $( ... ) construct for command substitution
 - unimplemented.sh: use the $( ... ) construct for command substitution
 - test-sha1.sh: use the $( ... ) construct for command substitution
 - t/lib-httpd.sh: use the $( ... ) construct for command substitution
 - git-gui/po/glossary/txt-to-pot.sh: use the $( ... ) construct for command substitution
 - contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-revert.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-repack.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-merge.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-fetch.sh: use the $( ... ) construct for command substitution
 - contrib/examples/git-commit.sh: use the $( ... ) construct for command substitution

 A shell script style update to change `command substitution` into
 $(command substitution).  Coverts contrib/ and much of the t/
 directory contents.

 Will merge to 'next'.


* nd/dir-exclude-cleanup (2015-12-28) 1 commit
 - dir.c: clean the entire struct in clear_exclude_list()

 The "exclude_list" structure has the usual "alloc, nr" pair of
 fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
 to reset 'alloc' to 0 when it cleared 'nr' and discarded the
 managed array.

 Will merge to 'next'.


* ss/user-manual (2015-12-30) 4 commits
 - user-manual: add addition gitweb information
 - user-manual: add section documenting shallow clones
 - glossary: define the term shallow clone
 - user-manual: remove temporary branch entry from todo list

 Drop a few old "todo" items by deciding that the change one of them
 suggests is not such a good idea, and doing the change the other
 one suggested to do.

 Will merge to 'next'.


* nd/ita-cleanup (2015-12-28) 3 commits
 - grep: make it clear i-t-a entries are ignored
 - add and use a convenience macro ce_intent_to_add()
 - blame: remove obsolete comment

 Paths that have been told the index about with "add -N" are not
 quite yet in the index, but a few commands behaved as if they
 already are in a harmful way.

 Here are only the obviously correct bits; some other changes were
 in the posted series, but not quite ready to be queued here.

 Will merge to 'next'.


* cc/untracked (2015-12-29) 10 commits
 - t7063: add tests for core.untrackedCache
 - config: add core.untrackedCache
 - dir: simplify untracked cache "ident" field
 - dir: add remove_untracked_cache()
 - dir: add {new,add}_untracked_cache()
 - update-index: move 'uc' var declaration
 - update-index: add untracked cache notifications
 - update-index: add --test-untracked-cache
 - update-index: use enum for untracked cache options
 - dir: free untracked cache when removing it

 Update the untracked cache subsystem and change its primary UI from
 "git update-index" to "git config".

 Still being discussed and worked on.
 $gmane/283080


* ep/make-phoney (2015-12-16) 1 commit
  (merged to 'next' on 2015-12-22 at 27c7593)
 + Makefile: add missing phony target

 A slight update to the Makefile.

 Will merge to 'master'.


* vl/grep-configurable-threads (2015-12-16) 3 commits
  (merged to 'next' on 2015-12-22 at 8954705)
 + grep: add --threads=<num> option and grep.threads configuration
 + grep: slight refactoring to the code that disables threading
 + grep: allow threading even on a single-core machine

 "git grep" can now be configured (or told from the command line)
 how many threads to use when searching in the working tree files.

 Will merge to 'master'.


* ps/push-delete-option (2015-12-16) 2 commits
  (merged to 'next' on 2015-12-22 at d83cc1d)
 + push: add '-d' as shorthand for '--delete'
 + push: add '--delete' flag to synopsis

 "branch --delete" has "branch -d" but "push --delete" does not.

 Will merge to 'master'.


* dt/refs-backend-lmdb (2015-12-04) 16 commits
 - refs: tests for lmdb backend
 - refs: add LMDB refs backend
 - refs: allow ref backend to be set for clone
 - init: allow alternate backends to be set for new repos
 - refs: always handle non-normal refs in files backend
 - refs: move duplicate check to common code
 - refs: make lock generic
 - refs: add method to rename refs
 - refs: add methods to init refs backend and db
 - refs: add method for delete_refs
 - refs: add method for initial ref transaction commit
 - refs: add methods for reflog
 - refs: add do_for_each_per_worktree_ref
 - refs: add methods for the ref iterators
 - refs: add methods for misc ref operations
 - refs: add a backend method structure with transaction functions

 Building on top of a few refs-backend preparatory series, LMDB
 based refs backend has been plugged into the system.

 Still being discussed and worked on.


* dw/subtree-split-do-not-drop-merge (2015-12-10) 1 commit
 - contrib/subtree: fix "subtree split" skipped-merge bug

 The "split" subcommand of "git subtree" (in contrib/) incorrectly
 skipped merges when it shouldn't, which was corrected.

 Waiting for review from 'subtree' folks.


* nd/clear-gitenv-upon-use-of-alias (2015-12-29) 5 commits
 - run-command: don't warn on SIGPIPE deaths
 - git.c: make sure we do not leak GIT_* to alias scripts
 - setup.c: re-fix d95138e (setup: set env $GIT_WORK_TREE when ..
 - git.c: make it clear save_env() is for alias handling only
 - Merge branch 'nd/stop-setenv-work-tree' into nd/clear-gitenv-upon-use-of-alias
 (this branch uses nd/stop-setenv-work-tree.)

 d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like
 $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias
 handling by overwriting GIT_WORK_TREE environment variable to
 affect subprocesses when set_git_work_tree() gets called, which
 resulted in a rather unpleasant regression to "clone" and "init".
 Try to address the same issue by always restoring the environment
 and respawning the real underlying command when handling alias.

 Will merge to 'next'.


* kn/ref-filter-atom-parsing (2016-01-05) 15 commits
 - ref-filter: introduce objectname_atom_parser()
 - ref-filter: introduce contents_atom_parser()
 - ref-filter: introduce remote_ref_atom_parser()
 - ref-filter: align: introduce long-form syntax
 - ref-filter: convert variable 'width' to an unsigned int
 - ref-filter: introduce parse_align_position()
 - ref-filter: introduce align_atom_parser()
 - ref-filter: introduce color_atom_parser()
 - ref-filter: skip deref specifier in match_atom_name()
 - ref-fitler: bump match_atom() name to the top
 - ref-filter: introduce parsing functions for each valid atom
 - ref-filter: introduce struct used_atom
 - ref-filter: bump 'used_atom' and related code to the top
 - ref-filter: use strbuf_split_str_omit_term()
 - strbuf: introduce strbuf_split_str_omit_term()

 Refactoring of ref-filter's format-parsing code, in preparation
 for "branch --format" and friends.

 This replaces (for now) kn/for-each-ref-remainder, which will be built
 on top.

 Still being discussed and worked on.


* bb/merge-marker-crlf (2015-11-24) 1 commit
 - merge-file: consider core.crlf when writing merge markers

 Write out merge markers using system end-of-line convention.

 Waiting for a re-roll to handle gitattributes.
 ($gmane/281701)


* dk/gc-more-wo-pack (2015-11-24) 3 commits
 - gc: Clean garbage .bitmap files from pack dir
 - t5304: Add test for .bitmap garbage files
 - prepare_packed_git(): find more garbage

 Follow-on to dk/gc-idx-wo-pack topic, to clean up stale
 .bitmap and .keep files.

 Waiting for review.


* ps/rebase-keep-empty (2015-11-24) 2 commits
 - rebase: fix preserving commits with --keep-empty
 - rebase: test broken behavior with --keep-empty

 Keep duplicate commits via rebase --keep-empty.

 Of dubious or negative value.
 Will discard.
 ($gmane/282107).


* rm/subtree-unwrap-tags (2015-11-24) 1 commit
 - contrib/subtree: unwrap tag refs

 Waiting for review from subtree folks.


* sg/sh-require-clean-orphan (2015-11-24) 2 commits
 - sh-setup: make require_clean_work_tree() work on orphan branches
 - Add tests for git-sh-setup's require_clean_work_tree()

 Allow users of git-sh-setup to handle orphan branch state.

 This series takes the conservative route of requiring scripts to opt
 into the looser behavior, at the expense of carrying around a new
 option-flag forever. I'm not sure if we need to do so.

 Needs review.


* tb/ls-files-eol (2016-01-07) 1 commit
 - ls-files: add eol diagnostics

 Add options to ls-files to help diagnose end-of-line problems.

 Needs review.


* ec/annotate-deleted (2015-11-20) 1 commit
 - annotate: skip checking working tree if a revision is provided

 Usability fix for annotate-specific "<file> <rev>" syntax with deleted
 files.

 Waiting for review.


* sb/submodule-parallel-fetch (2015-12-16) 7 commits
  (merged to 'next' on 2015-12-22 at 44e84ff)
 + submodules: allow parallel fetching, add tests and documentation
 + fetch_populated_submodules: use new parallel job processing
 + run-command: add an asynchronous parallel child processor
 + sigchain: add command to pop all common signals
 + strbuf: add strbuf_read_once to read without blocking
 + xread: poll on non blocking fds
 + submodule.c: write "Fetching submodule <foo>" to stderr
 (this branch is used by sb/submodule-parallel-update.)

 Add a framework to spawn a group of processes in parallel, and use
 it to run "git fetch --recurse-submodules" in parallel.

 Rerolled and this seems to be a lot cleaner.  The merge of the
 earlier one to 'next' has been reverted.

 Will merge to 'master'.


* sb/submodule-parallel-update (2015-12-16) 8 commits
 - clone: allow an explicit argument for parallel submodule clones
 - submodule update: expose parallelism to the user
 - git submodule update: have a dedicated helper for cloning
 - fetching submodules: respect `submodule.fetchJobs` config option
 - submodule-config: introduce parse_generic_submodule_config
 - submodule-config: remove name_and_item_from_var
 - submodule-config: drop check against NULL
 - submodule-config: keep update strategy around
 (this branch uses sb/submodule-parallel-fetch.)

 Builds on top of the "fetch --recurse-submodules" work to introduce
 parallel downloading into multiple submodules for "submodule update".

 Needs review.


* jc/strbuf-gets (2015-12-16) 17 commits
 - test-sha1-array: read command stream with strbuf_getline_crlf()
 - grep: read -f file with strbuf_getline_crlf()
 - send-pack: read list of refs with strbuf_getline_crlf()
 - column: read lines with strbuf_getline_crlf()
 - cat-file: read batch stream with strbuf_getline_crlf()
 - transport-helper: read helper response with strbuf_getline_crlf()
 - clone/sha1_file: read info/alternates with strbuf_getline_crlf()
 - remote.c: read $GIT_DIR/remotes/* with strbuf_getline_crlf()
 - ident.c: read /etc/mailname with strbuf_getline_crlf()
 - rev-parse: read parseopt spec with strbuf_getline_crlf()
 - revision: read --stdin with strbuf_getline_crlf()
 - hash-object: read --stdin-paths with strbuf_getline_crlf()
 - mktree: read textual tree representation with strbuf_getline_crlf()
 - update-index: read list of paths with strbuf_getline_crlf() under --stdin
 - update-index: read --index-info with strbuf_getline_crlf()
 - check-attr, check-ignore, checkout-index: read paths with strbuf_getline_crlf()
 - strbuf: make strbuf_getline_crlf() global

 Teach codepaths that communicate with users by reading text files
 to be more lenient to editors that write CRLF-terminated lines.
 Note that this is only about communication with Git, like feeding
 list of object names from the standard input instead of from the
 command line, and does not involve files in the working tree.

 Rerolled.
 Needs review.


* mh/notes-allow-reading-treeish (2015-10-08) 3 commits
  (merged to 'next' on 2015-10-23 at 8a697f0)
 + notes: allow treeish expressions as notes ref
 + Merge branch 'jk/notes-dwim-doc' into next
 + Merge branch 'jc/merge-drop-old-syntax' into next
 (this branch uses jc/merge-drop-old-syntax.)

 Some "git notes" operations, e.g. "git log --notes=<note>", should
 be able to read notes from any tree-ish that is shaped like a notes
 tree, but the notes infrastructure required that the argument must
 be a ref under refs/notes/.  Loosen it to require a valid ref only
 when the operation would update the notes (in which case we must
 have a place to store the updated notes tree, iow, a ref).

 As the patch was done on top of the 'drop old-syntax from merge',
 this has to wait until that other topic can graduate, unfortunately.
 It can be redone in a way that does not depend on that topic after
 this cycle, though.

 Will keep in 'next'.


* jc/mailinfo (2015-10-21) 1 commit
 - mailinfo: ignore in-body header that we do not care about

 Some people write arbitrary garbage at the beginning of a piece of
 e-mail (or after -- >8 -- scissors -- >8 -- line) in the commit log
 message and expect them to be discarded, even though "From:" and
 "Subject:" are the only documented in-body headers that you are
 supposed to have there.  Allow some garbage (specifically, what may
 look like RFC2822 headers like "MIME-Version: ...") to be there and
 ignore them.

 No comments after waiting for a long time.
 Will discard.


* js/am-3-merge-recursive-direct (2015-10-12) 2 commits
  (merged to 'next' on 2015-10-23 at dc631e5)
 + am: make a direct call to merge_recursive
 + merge_recursive_options: introduce the "gently" flag

 The merge_recursive_generic() function has been made a bit safer to
 call from inside a process.  "git am -3" was taught to make a direct
 call to the function when falling back to three-way merge.

 Being able to make a direct call would be good in general, but as a
 performance thing, we would want to see it backed up by numbers.

 I haven't gone through the "gently" change with fine toothed comb;
 I can see that the change avoids calling die(), but I haven't made
 sure that the program states (e.g. what's in the in-core index) are
 adjusted sensibly when it returns to the caller instead of dying,
 or the codepaths that used to die() are free of resource leaks.
 The original code certainly did not care the program states at the
 point of dying exactly because it knew it is going to exit, but now
 they have to care, and they need to be audited.

 Will keep in 'next'.


* sg/pretty-more-date-mode-format (2015-10-07) 1 commit
 - pretty: add format specifiers for short and raw date formats

 Introduce "%as" and "%aR" placeholders for "log --format" to show
 the author date in the short and raw formats.

 No comments after waiting for a long time.
 Will discard.


* jk/graph-format-padding (2015-09-14) 1 commit
 - pretty: pass graph width to pretty formatting for use in '%>|(N)'

 Redefine the way '%>|(N)' padding and the "--graph" option
 interacts.  It has been that the available columns to display the
 log message was measured from the edge of the area the graph ended,
 but with this it becomes the beginning of the entire output.

 I have a suspicion that 50% of the users would appreciate this
 change, and the remainder see this break their expectation.  If
 that is the case, we might need to introduce a similar but
 different alignment operator so that this new behaviour is
 available to those who want to use it, without negatively affecting
 existing uses.

 No comments after waiting for a long time.
 Will discard.
 ($gmane/278326)


* ad/cygwin-wants-rename (2015-08-07) 1 commit
 - config.mak.uname: Cygwin needs OBJECT_CREATION_USES_RENAMES

 Will hold.
 ($gmane/275680).


* jc/rerere-multi (2015-09-14) 7 commits
 - rerere: do use multiple variants
 - t4200: rerere a merge with two identical conflicts
 - rerere: allow multiple variants to exist
 - rerere: delay the recording of preimage
 - rerere: handle leftover rr-cache/$ID directory and postimage files
 - rerere: scan $GIT_DIR/rr-cache/$ID when instantiating a rerere_id
 - rerere: split conflict ID further

 "git rerere" can encounter two or more files with the same conflict
 signature that have to be resolved in different ways, but there was
 no way to record these separate resolutions.

 Needs review.


* jc/merge-drop-old-syntax (2015-04-29) 1 commit
  (merged to 'next' on 2015-10-07 at 50fed71)
 + merge: drop 'git merge <message> HEAD <commit>' syntax
 (this branch is used by mh/notes-allow-reading-treeish.)

 Originally merged to 'next' on 2015-05-28

 Stop supporting "git merge <message> HEAD <commit>" syntax that has
 been deprecated since October 2007.  It has been reported that
 git-gui still uses the deprecated syntax, which needs to be fixed
 before this final step can proceed.
 ($gmane/282594)

 Will keep in 'next'.

^ permalink raw reply	[relevance 1%]

* [PATCH 07/10] t/t7001-mv.sh: use the $( ... ) construct for command substitution
  2016-01-07 13:51  6% [PATCH 00/10] use the $( ... ) construct for command substitution Elia Pinto
@ 2016-01-07 13:51 18% ` Elia Pinto
  0 siblings, 0 replies; 200+ results
From: Elia Pinto @ 2016-01-07 13:51 UTC (permalink / raw)
  To: git; +Cc: Elia Pinto

The Git CodingGuidelines prefer the $(...) construct for command
substitution instead of using the backquotes `...`.

The backquoted form is the traditional method for command
substitution, and is supported by POSIX.  However, all but the
simplest uses become complicated quickly.  In particular, embedded
command substitutions and/or the use of double quotes require
careful escaping with the backslash character.

The patch was generated by:

for _f in $(find . -name "*.sh")
do
	perl -i -pe 'BEGIN{undef $/;} s/`(.+?)`/\$(\1)/smg'  "${_f}"
done

and then carefully proof-read.

Signed-off-by: Elia Pinto <gitter.spiros@gmail.com>
---
 t/t7001-mv.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 7b56081..51dd2b4 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -156,11 +156,11 @@ test_expect_success "Michael Cassar's test case" '
 	echo b > partA/outline.txt &&
 	echo c > papers/unsorted/_another &&
 	git add papers partA &&
-	T1=`git write-tree` &&
+	T1=$(git write-tree) &&
 
 	git mv papers/unsorted/Thesis.pdf papers/all-papers/moo-blah.pdf &&
 
-	T=`git write-tree` &&
+	T=$(git write-tree) &&
 	git ls-tree -r $T | verbose grep partA/outline.txt
 '
 
-- 
2.3.3.GIT

^ permalink raw reply related	[relevance 18%]

* [PATCH 00/10] use the $( ... ) construct for command substitution
@ 2016-01-07 13:51  6% Elia Pinto
  2016-01-07 13:51 18% ` [PATCH 07/10] t/t7001-mv.sh: " Elia Pinto
  0 siblings, 1 reply; 200+ results
From: Elia Pinto @ 2016-01-07 13:51 UTC (permalink / raw)
  To: git; +Cc: Elia Pinto

This patch series continues the changes introduced with the merge
6753d8a85d543253d95184ec2faad6dc197f248:

    Merge branch 'ep/shell-command-substitution'

    Adjust shell scripts to use $(cmd) instead of `cmd`.


This is the  sixth  series, the other will be sent separately.

Elia Pinto (10):
  t/t5900-repo-selection.sh: use the $( ... ) construct for command
    substitution
  t/t6001-rev-list-graft.sh: use the $( ... ) construct for command
    substitution
  t/t6002-rev-list-bisect.sh: use the $( ... ) construct for command
    substitution
  t/t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for
    command substitution
  t/t6032-merge-large-rename.sh: use the $( ... ) construct for command
    substitution
  t/t6132-pathspec-exclude.sh: use the $( ... ) construct for command
    substitution
  t/t7001-mv.sh: use the $( ... ) construct for command substitution
  t/t7003-filter-branch.sh: use the $( ... ) construct for command
    substitution
  t/t7004-tag.sh: use the $( ... ) construct for command substitution
  t/t7006-pager.sh: use the $( ... ) construct for command substitution

 t/t5900-repo-selection.sh            |  2 +-
 t/t6001-rev-list-graft.sh            | 12 ++++++------
 t/t6002-rev-list-bisect.sh           |  6 +++---
 t/t6015-rev-list-show-all-parents.sh |  6 +++---
 t/t6032-merge-large-rename.sh        |  2 +-
 t/t6132-pathspec-exclude.sh          |  2 +-
 t/t7001-mv.sh                        |  4 ++--
 t/t7003-filter-branch.sh             |  6 +++---
 t/t7004-tag.sh                       | 16 ++++++++--------
 t/t7006-pager.sh                     |  2 +-
 10 files changed, 29 insertions(+), 29 deletions(-)

-- 
2.3.3.GIT

^ permalink raw reply	[relevance 6%]

* [PATCH v2] wt-status: correct and simplify check for detached HEAD
  @ 2015-11-25 14:10  4%       ` René Scharfe
  0 siblings, 0 replies; 200+ results
From: René Scharfe @ 2015-11-25 14:10 UTC (permalink / raw)
  To: Jeff King; +Cc: Git List, Junio C Hamano, Matthieu Moy, Duy Nguyen

If a branch name is longer than four characters then memcmp() reads over
the end of the static string "HEAD".  This causes the following test
failures with AddressSanitizer:

t3203-branch-output.sh                           (Wstat: 256 Tests: 18 Failed: 4)
  Failed tests:  12, 15-17
  Non-zero exit status: 1
t3412-rebase-root.sh                             (Wstat: 256 Tests: 31 Failed: 3)
  Failed tests:  28-29, 31
  Non-zero exit status: 1
t3507-cherry-pick-conflict.sh                    (Wstat: 256 Tests: 31 Failed: 4)
  Failed tests:  14, 29-31
  Non-zero exit status: 1
t3510-cherry-pick-sequence.sh                    (Wstat: 256 Tests: 39 Failed: 14)
  Failed tests:  17, 22-26, 28-30, 34-35, 37-39
  Non-zero exit status: 1
t3420-rebase-autostash.sh                        (Wstat: 256 Tests: 28 Failed: 4)
  Failed tests:  24-27
  Non-zero exit status: 1
t3404-rebase-interactive.sh                      (Wstat: 256 Tests: 91 Failed: 57)
  Failed tests:  17, 19, 21-42, 44, 46-74, 77, 81-82
  Non-zero exit status: 1
t3900-i18n-commit.sh                             (Wstat: 256 Tests: 34 Failed: 1)
  Failed test:  34
  Non-zero exit status: 1
t5407-post-rewrite-hook.sh                       (Wstat: 256 Tests: 14 Failed: 6)
  Failed tests:  9-14
  Non-zero exit status: 1
t7001-mv.sh                                      (Wstat: 256 Tests: 46 Failed: 5)
  Failed tests:  39-43
  Non-zero exit status: 1
t7509-commit.sh                                  (Wstat: 256 Tests: 12 Failed: 2)
  Failed tests:  11-12
  Non-zero exit status: 1
t7512-status-help.sh                             (Wstat: 256 Tests: 39 Failed: 35)
  Failed tests:  5-39
  Non-zero exit status: 1
t6030-bisect-porcelain.sh                        (Wstat: 256 Tests: 70 Failed: 1)
  Failed test:  13
  Non-zero exit status: 1

And if a branch is named "H", "HE", or "HEA" then the current if clause
erroneously considers it as matching "HEAD" because it only compares
up to the end of the branch name.

Fix that by doing the comparison using strcmp() and only after the
branch name is extracted.  This way neither too less nor too many
characters are checked.  While at it call strchrnul() to find the end
of the branch name instead of open-coding it.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
We can be more careful when parsing -- or avoid parsing and backtrack
if we found "HEAD" after all.  The latter is simpler, and string
parsing is tricky enough that we better take such opportunities to
simplify the code..

Changes since v1:
* strcmp() instead of strncmp()
* strchrnul() (unrelated cleanup)
* adjusted subject (and commit message)

 wt-status.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/wt-status.c b/wt-status.c
index 435fc28..ced53dd 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1317,15 +1317,14 @@ static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1,
 	target += strlen(" to ");
 	strbuf_reset(&cb->buf);
 	hashcpy(cb->nsha1, nsha1);
-	for (end = target; *end && *end != '\n'; end++)
-		;
-	if (!memcmp(target, "HEAD", end - target)) {
+	end = strchrnul(target, '\n');
+	strbuf_add(&cb->buf, target, end - target);
+	if (!strcmp(cb->buf.buf, "HEAD")) {
 		/* HEAD is relative. Resolve it to the right reflog entry. */
+		strbuf_reset(&cb->buf);
 		strbuf_addstr(&cb->buf,
 			      find_unique_abbrev(nsha1, DEFAULT_ABBREV));
-		return 1;
 	}
-	strbuf_add(&cb->buf, target, end - target);
 	return 1;
 }
 
-- 
2.6.3

^ permalink raw reply related	[relevance 4%]

* [PATCH] wt-status: use strncmp() for length-limited string comparison
@ 2015-11-06 22:47  4% René Scharfe
    0 siblings, 1 reply; 200+ results
From: René Scharfe @ 2015-11-06 22:47 UTC (permalink / raw)
  To: Git List; +Cc: Junio C Hamano, Matthieu Moy

When a branch name is longer than four characters, memcmp() can read
past the end of the string literal "HEAD".  Use strncmp() instead, which
stops at the end of a string.  This fixes the following test failures
with AddressSanitizer:

t3203-branch-output.sh                           (Wstat: 256 Tests: 18 Failed: 4)
  Failed tests:  12, 15-17
  Non-zero exit status: 1
t3412-rebase-root.sh                             (Wstat: 256 Tests: 31 Failed: 3)
  Failed tests:  28-29, 31
  Non-zero exit status: 1
t3507-cherry-pick-conflict.sh                    (Wstat: 256 Tests: 31 Failed: 4)
  Failed tests:  14, 29-31
  Non-zero exit status: 1
t3510-cherry-pick-sequence.sh                    (Wstat: 256 Tests: 39 Failed: 14)
  Failed tests:  17, 22-26, 28-30, 34-35, 37-39
  Non-zero exit status: 1
t3420-rebase-autostash.sh                        (Wstat: 256 Tests: 28 Failed: 4)
  Failed tests:  24-27
  Non-zero exit status: 1
t3404-rebase-interactive.sh                      (Wstat: 256 Tests: 91 Failed: 57)
  Failed tests:  17, 19, 21-42, 44, 46-74, 77, 81-82
  Non-zero exit status: 1
t3900-i18n-commit.sh                             (Wstat: 256 Tests: 34 Failed: 1)
  Failed test:  34
  Non-zero exit status: 1
t5407-post-rewrite-hook.sh                       (Wstat: 256 Tests: 14 Failed: 6)
  Failed tests:  9-14
  Non-zero exit status: 1
t7001-mv.sh                                      (Wstat: 256 Tests: 46 Failed: 5)
  Failed tests:  39-43
  Non-zero exit status: 1
t7509-commit.sh                                  (Wstat: 256 Tests: 12 Failed: 2)
  Failed tests:  11-12
  Non-zero exit status: 1
t7512-status-help.sh                             (Wstat: 256 Tests: 39 Failed: 35)
  Failed tests:  5-39
  Non-zero exit status: 1
t6030-bisect-porcelain.sh                        (Wstat: 256 Tests: 70 Failed: 1)
  Failed test:  13
  Non-zero exit status: 1

Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
 wt-status.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/wt-status.c b/wt-status.c
index 435fc28..8dc281b 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1319,7 +1319,7 @@ static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1,
 	hashcpy(cb->nsha1, nsha1);
 	for (end = target; *end && *end != '\n'; end++)
 		;
-	if (!memcmp(target, "HEAD", end - target)) {
+	if (!strncmp(target, "HEAD", end - target)) {
 		/* HEAD is relative. Resolve it to the right reflog entry. */
 		strbuf_addstr(&cb->buf,
 			      find_unique_abbrev(nsha1, DEFAULT_ABBREV));
-- 
2.6.3

^ permalink raw reply related	[relevance 4%]

* [PATCH 06/25] t: use verbose instead of hand-rolled errors
  @ 2015-03-20 10:09 10% ` Jeff King
  0 siblings, 0 replies; 200+ results
From: Jeff King @ 2015-03-20 10:09 UTC (permalink / raw)
  To: git

Many tests that predate the "verbose" helper function use a
pattern like:

  test ... || {
	  echo ...
	  false
  }

to give more verbose output. Using the helper, we can do
this with a single line, and avoid a || which interacts
badly with &&-chaining (besides fooling --chain-lint, we hit
the error block no matter which command in the chain failed,
so we may often show useless results).

In most cases, the messages printed by "verbose" are equally
good (in some cases better; t6006 accidentally redirects the
message to a file!). The exception is t7001, whose output
suffers slightly. However, it's still enough to show the
user which part failed, given that we will have just printed
the test script to stderr.

Signed-off-by: Jeff King <peff@peff.net>
---
 t/t4022-diff-rewrite.sh    |  5 +----
 t/t4202-log.sh             | 30 +++++-------------------------
 t/t6006-rev-list-format.sh |  5 +----
 t/t7001-mv.sh              |  5 +----
 t/t7300-clean.sh           | 10 ++--------
 5 files changed, 10 insertions(+), 45 deletions(-)

diff --git a/t/t4022-diff-rewrite.sh b/t/t4022-diff-rewrite.sh
index 2d030a4..cb51d9f 100755
--- a/t/t4022-diff-rewrite.sh
+++ b/t/t4022-diff-rewrite.sh
@@ -20,10 +20,7 @@ test_expect_success setup '
 test_expect_success 'detect rewrite' '
 
 	actual=$(git diff-files -B --summary test) &&
-	expr "$actual" : " rewrite test ([0-9]*%)$" || {
-		echo "Eh? <<$actual>>"
-		false
-	}
+	verbose expr "$actual" : " rewrite test ([0-9]*%)$"
 
 '
 
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index a22ac7c..85230a8 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -113,11 +113,7 @@ test_expect_success 'diff-filter=M' '
 
 	actual=$(git log --pretty="format:%s" --diff-filter=M HEAD) &&
 	expect=$(echo second) &&
-	test "$actual" = "$expect" || {
-		echo Oops
-		echo "Actual: $actual"
-		false
-	}
+	verbose test "$actual" = "$expect"
 
 '
 
@@ -125,11 +121,7 @@ test_expect_success 'diff-filter=D' '
 
 	actual=$(git log --pretty="format:%s" --diff-filter=D HEAD) &&
 	expect=$(echo sixth ; echo third) &&
-	test "$actual" = "$expect" || {
-		echo Oops
-		echo "Actual: $actual"
-		false
-	}
+	verbose test "$actual" = "$expect"
 
 '
 
@@ -137,11 +129,7 @@ test_expect_success 'diff-filter=R' '
 
 	actual=$(git log -M --pretty="format:%s" --diff-filter=R HEAD) &&
 	expect=$(echo third) &&
-	test "$actual" = "$expect" || {
-		echo Oops
-		echo "Actual: $actual"
-		false
-	}
+	verbose test "$actual" = "$expect"
 
 '
 
@@ -149,11 +137,7 @@ test_expect_success 'diff-filter=C' '
 
 	actual=$(git log -C -C --pretty="format:%s" --diff-filter=C HEAD) &&
 	expect=$(echo fourth) &&
-	test "$actual" = "$expect" || {
-		echo Oops
-		echo "Actual: $actual"
-		false
-	}
+	verbose test "$actual" = "$expect"
 
 '
 
@@ -161,11 +145,7 @@ test_expect_success 'git log --follow' '
 
 	actual=$(git log --follow --pretty="format:%s" ichi) &&
 	expect=$(echo third ; echo second ; echo initial) &&
-	test "$actual" = "$expect" || {
-		echo Oops
-		echo "Actual: $actual"
-		false
-	}
+	verbose test "$actual" = "$expect"
 
 '
 
diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh
index 2b7c0f0..b77d4c9 100755
--- a/t/t6006-rev-list-format.sh
+++ b/t/t6006-rev-list-format.sh
@@ -358,10 +358,7 @@ test_expect_success 'empty email' '
 	test_tick &&
 	C=$(GIT_AUTHOR_EMAIL= git commit-tree HEAD^{tree} </dev/null) &&
 	A=$(git show --pretty=format:%an,%ae,%ad%n -s $C) &&
-	test "$A" = "A U Thor,,Thu Apr 7 15:14:13 2005 -0700" || {
-		echo "Eh? $A" >failure
-		false
-	}
+	verbose test "$A" = "A U Thor,,Thu Apr 7 15:14:13 2005 -0700"
 '
 
 test_expect_success 'del LF before empty (1)' '
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 69f11bd..7b56081 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -161,10 +161,7 @@ test_expect_success "Michael Cassar's test case" '
 	git mv papers/unsorted/Thesis.pdf papers/all-papers/moo-blah.pdf &&
 
 	T=`git write-tree` &&
-	git ls-tree -r $T | grep partA/outline.txt || {
-		git ls-tree -r $T
-		(exit 1)
-	}
+	git ls-tree -r $T | verbose grep partA/outline.txt
 '
 
 rm -fr papers partA path?
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index 04118ad..99be5d9 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -119,10 +119,7 @@ test_expect_success C_LOCALE_OUTPUT 'git clean with relative prefix' '
 		git clean -n ../src |
 		sed -n -e "s|^Would remove ||p"
 	) &&
-	test "$would_clean" = ../src/part3.c || {
-		echo "OOps <$would_clean>"
-		false
-	}
+	verbose test "$would_clean" = ../src/part3.c
 '
 
 test_expect_success C_LOCALE_OUTPUT 'git clean with absolute path' '
@@ -134,10 +131,7 @@ test_expect_success C_LOCALE_OUTPUT 'git clean with absolute path' '
 		git clean -n "$(pwd)/../src" |
 		sed -n -e "s|^Would remove ||p"
 	) &&
-	test "$would_clean" = ../src/part3.c || {
-		echo "OOps <$would_clean>"
-		false
-	}
+	verbose test "$would_clean" = ../src/part3.c
 '
 
 test_expect_success 'git clean with out of work tree relative path' '
-- 
2.3.3.520.g3cfbb5d

^ permalink raw reply related	[relevance 10%]

* Re: Interested in helping open source friends on HP-UX?
  2015-02-18 17:46  0%   ` Michael J Gruber
  2015-02-18 18:25  0%     ` Jeff King
@ 2015-02-18 19:20  0%     ` H.Merijn Brand
  1 sibling, 0 replies; 200+ results
From: H.Merijn Brand @ 2015-02-18 19:20 UTC (permalink / raw)
  To: Michael J Gruber; +Cc: git, Junio C Hamano

[-- Attachment #1: Type: text/plain, Size: 13407 bytes --]

On Wed, 18 Feb 2015 18:46:04 +0100, Michael J Gruber
<git@drmicha.warpmail.net> wrote:

> H.Merijn Brand venit, vidit, dixit 18.02.2015 17:00:
> > On Wed, 10 Dec 2014 23:46:25 -0800, Junio C Hamano <gitster@pobox.com>
> > wrote:
> > 
> >> Hello, all.
> >>
> >> H. Merijn Brand runs a few HP-UX boxes to help perl5 and other open
> >> source communities, wants help porting more recent Git on these
> >> boxes, running HP-UX 10.20, 11.00, and 11.23, and looking for a
> >> volunteer.  Please contact him directly if you are interested.
> > 
> > No-one. Disappointing :(
> 
> Well, how can we help if we don't even know the limitations of that
> platform?

I have offered to give any serious git developer an HP-UX account, so
one can found out themselves. I can then - hopefully - answer any
remaining question.

> In short, you are putting additional restrictions in by not having GNU
> tools around.

There *are* GNU tools around, and I *can* add other tools. I - of
course - cannot install *all* GNU tools. I don't put serious
restrictions on the wishes of developers. You ask we play. Mostly.

The problem here is that I can configure, build, and test any tool
(git) on my system using every GNU tool I might have available, but
once I convert this build into a package/distribution, and people
around the world download it and expect it to work, it will fail if
the tool (git) depends on available system commands that now do not
meet the needs of the tool (git).

Note that I have put TAR = gtar in config.mak.uname, but it is not
consistently used

> > Did *anyone* ever test with NO_ICONV?
> > Too many tests fail without iconv
> 
> There is iconv the library and iconv the command. With NO_ICONV, many
> tests fail for me even on my standard Linux distro. But our tests keep
> using iconv the command. The subtests which pass in t3900, for example,
> mostly test that certain things fail, for one reason or another...
> 
> But we should guard a few tests in case of NO_ICONV, of course, and
> probably not use iconv the command in this case either.
> 
> > It is *very* hard to decide from the current status if all
> > remaining failures are related to (Asian) locale failures and (thus)
> > can be safely ignored (in my environment).
> > 
> > Specifics at the end
> > 
> > 
> > FAILures from scratch with no iconv:
> > --------------------------------------------------------------------------------
> > t3513-revert-submodule.sh       Tests: 14 Failed:  5 Failed tests: 1-2, 4, 6-7                   TODO passed:   10-11
> > t3900-i18n-commit.sh            Tests: 34 Failed:  8 Failed tests: 15-17, 23-25, 27-28
> > t3901-i18n-patch.sh             Tests: 15 Failed:  8 Failed tests: 2-3, 6-7, 9, 11, 14-15
> > t4041-diff-submodule-option.sh  Tests: 44 Failed:  5 Failed tests: 5-7, 9-10
> > t4201-shortlog.sh               Tests: 11 Failed:  1 Failed tests: 9
> > t4204-patch-id.sh               Tests: 15 Failed:  3 Failed tests: 7, 10, 13
> > t4205-log-pretty-formats.sh     Tests: 46 Failed: 20 Failed tests: 12-14, 17, 19, 21, 23-29, 31, 33, 35, 37 39, 41-42
> > t4210-log-i18n.sh               Tests:  5 Failed:  4 Failed tests: 2-5
> > t5100-mailinfo.sh               Tests: 35 Failed: 11 Failed tests: 20-30
> > t5570-git-daemon.sh             Tests: 12 Failed:  2 Failed tests: 4-5      Parse errors: No plan found in TAP output
> > t6006-rev-list-format.sh        Tests: 54 Failed: 11 Failed tests: 9-10, 12, 25-27, 30-34
> > t6041-bisect-submodule.sh       Tests: 14 Failed:  9 Failed tests: 1-2, 4-7, 12-14               TODO passed:   10-11
> > t7001-mv.sh                     Tests: 46 Failed:  2 Failed tests: 38-39
> > t7102-reset.sh                  Tests: 30 Failed:  1 Failed tests: 2
> > t7610-mergetool.sh              Tests: 18 Failed:  1 Failed tests: 18
> > t7800-difftool.sh               Tests: 56 Failed:  1 Failed tests: 49
> > t8005-blame-i18n.sh             Tests:  5 Failed:  3 Failed tests: 2-4
> > t9350-fast-export.sh            Tests: 34 Failed:  1 Failed tests: 4
> > Files=687, Tests=12091
> > 
> > FAILures from scratch with iconv:
> > --------------------------------------------------------------------------------
> > t3513-revert-submodule.sh       Tests: 14 Failed:  5 Failed tests: 1-2, 4, 6-7                   TODO passed:   10-11
> > t3900-i18n-commit.sh            Tests: 34 Failed:  6 Failed tests: 16-17, 24-25, 27-28
> > t4204-patch-id.sh               Tests: 15 Failed:  3 Failed tests: 7, 10, 13
> > t4210-log-i18n.sh               Tests:  5 Failed:  4 Failed tests: 2-5
> > t5100-mailinfo.sh               Tests: 35 Failed:  2 Failed tests: 20, 23
> > t5536-fetch-conflicts.sh        Tests:  7 Failed:  3 Failed tests: 3, 6-7
> > t5570-git-daemon.sh             Tests: 12 Failed:  2 Failed tests: 4-5      Parse errors: No plan found in TAP output
> > t6041-bisect-submodule.sh       Tests: 14 Failed:  9 Failed tests: 1-2, 4-7, 12-14               TODO passed:   10-11
> > t7001-mv.sh                     Tests: 46 Failed:  2 Failed tests: 38-39
> > t7610-mergetool.sh              Tests: 18 Failed:  1 Failed tests: 18
> > t7800-difftool.sh               Tests: 56 Failed:  1 Failed tests: 49
> > t8005-blame-i18n.sh             Tests:  5 Failed:  3 Failed tests: 2-4
> > Files=687, Tests=12091
> > Result: FAIL
> > 
> > running «sh t****.sh -x -i»
> > 
> > 
> > t/t7001-mv.t
> > ------------
> > cp uses -P flag, which is unknown to HP's (non-GNU) version of cp
> > 
> > Changing the two occurrences from
> > 
> > 		cp -R -P -p ../.git/modules/sub .git &&
> > to
> > 		rsync -aHl ../.git/modules/sub/ .git/ &&
> > 
> > make the tests pass (on those systems that have a working rsync)
> 
> "rsync -r -l -o -p -t" would be the proper equivalent. -aH does more for
> my rsync. I don't know what HP-UX rsync understands, though.

HP has no rsync. I installed it myself.
As HP does not have rsync, it does not conflict. If I would install cp
however, I bet many system-tasks could fall over.

> > t/t3513-revert-submodule.sh
> > ---------------------------
> > tar uses z flag, which is unknown to HP's (non-GNU) version of tar
> > config.mak.uname defines TAR = gtar, but that obviously does not help
> > 
> > putting GNU-tar temporary in from of my $PATH makes the test pass
> > /me thinks the z in not required in that test at all
> > 
> > 	tar cf "$TRASH_DIRECTORY/tmp.tar" * &&
> > and
> > 	tar xf "$TRASH_DIRECTORY/tmp.tar" &&
> > 
> > work just as well and prevent the breakage
> 
> We can do without z.

TOP!

> > t/t3900-i18n-commit.sh
> > ----------------------
> > As my HP boxes have *NO* JP or other space eating asian locale stuff
> > installed, it is highly likely that *anything* dealing with asian
> > locales will fail. On modern Linux hardware, disk space is cheap. On
> > most HP-UX boxes disk space is expensive and when having nothing to do
> > with Asian languages, removing all Asian-related packages is a fast and
> > cheap way to regain disk space.
> > 
> > Changing compare_with to
> > 
> > compare_with () {
> >     case "$1$2$3" in
> > 	*eucJP*|*ISO-2022-JP*) true ;;
> > 	*)
> > 	    git show -s $1 | sed -e '1,/^$/d' -e 's/^    //' >current &&
> > 	    case "$3" in
> > 		'')
> > 		    test_cmp "$2" current ;;
> > 		?*)
> > 		    iconv -f "$3" -t UTF-8 >current.utf8 <current &&
> > 		    iconv -f "$3" -t UTF-8 >expect.utf8 <"$2" &&
> > 		    test_cmp expect.utf8 current.utf8
> > 		    ;;
> > 		esac
> > 	    ;;
> > 	esac
> >     }
> > 
> > makes all my tests pass
> 
> So you do have iconv the command, but don't want to link with the library?

Maybe it is too old?

$ iconv --version
iconv (GNU libiconv 1.14)
Copyright (C) 2000-2011 Free Software Foundation, Inc.

> Availability of the locales should be covered by a prerequisite, like we
> do in t9129.
> 
> > t/t4204-patch-id.sh
> > -------------------
> > 
> > No idea yet
> > 
> > + test_patch_id_file_order irrelevant --stable --stable
> > Already on 'same'
> > cmp: patch-id_ordered-ordered-order---stable-irrelevant: No such file or directory
> > 
> > $ find * | grep 4204 | grep stable
> > trash directory.t4204-patch-id/patch-id_order---stable-irrelevant
> > trash directory.t4204-patch-id/patch-id_ordered-order---stable-irrelevant
> 
> The "Already"-part is normal output. The rest looks a bit crazy - and
> shell related?

I have set SHELL_PATH = /pro/local/bin/bash

The default /bin/sh on HP-UX is almost as bare as the old bourne shell
So, shell related? Likely!

> > t/t4210-log-i18n
> > ----------------
> > 
> > $ dump "trash directory.t4210-log-i18n/actual"
> > 00000000  75 74 66 38 0A                                      utf8.
> > $ dump "trash directory.t4210-log-i18n/expect"
> > 00000000  6C 61 74 69 6E 31 0A 75  74 66 38 0A                latin1.utf8.
> > $ dump "trash directory.t4210-log-i18n/msg"
> > 00000000  6C 61 74 69 6E 31 0A 0A  74 E9 73 74 0A             latin1..t.st.
> > 
> > t/t5100-mailinfo.sh
> > -------------------
> > + git mailinfo -u rfc2047/0001-msg rfc2047/0001-patch
> > + 0< rfc2047/0001 1> rfc2047/0001-info
> > fatal: cannot convert from US-ASCII to UTF-8
> > error: last command exited with $?=128
> 
> Is that mailinfo erroring out? Do you have those locales?

$ locale -a
C
POSIX
C.iso88591
C.iso885915
C.utf8
univ.utf8
nl_NL.iso88591
nl_NL.iso885915@euro
nl_NL.roman8
en_GB.iso88591
en_GB.iso885915@euro
en_GB.roman8
en_US.iso88591
en_US.roman8
nl_NL.utf8
en_GB.utf8
en_US.utf8

> OK, I'll have to stop fishing in the dark here.
> 
> > t/t5536-fetch-conflicts.sh
> > --------------------------
> > + setup_repository ccc +refs/heads/branch1:refs/remotes/origin/branch1 +refs/heads/branch2:refs/remotes/origin/branch1
> > Initialized empty Git repository in /pro/3gl/LINUX/git-2.3.0p/t/trash directory.t5536-fetch-conflicts/ccc/.git/
> > + cd ccc
> > + test_must_fail git fetch origin
> > + 2> error
> > + verify_stderr
> > + 0< /var/tmp/sh6096.2
> > cmp: EOF on actual
> > error: last command exited with $?=1
> > not ok 3 - fetch conflict: config vs. config
> > 
> > t/t5570-git-daemon.sh
> > ---------------------
> > I will ignore this myself, as I have no intention of using HP-UX as a
> > git server. We already have a dedicated Linux box doing so.
> > 
> > + test_cmp file clone/file
> > ok 3 - clone git repository
> > 
> > expecting success:
> >         echo content >>file &&
> >         git commit -a -m two &&
> >         git push public &&
> >         (cd clone && git pull) &&
> >         test_cmp file clone/file
> > 
> > + echo content
> > + 1>> file
> > + git commit -a -m two
> > 
> > arg sulong failed. 0, 0x9fffffffbffff058
> > 
> >  Setup args failed.
> > 
> > Pid 6238 was killed due to failure in writing to user register stack - possible stack overflow.
> > [master bca99f0] two
> >  Author: A U Thor <author@example.com>
> >  1 file changed, 1 insertion(+)
> > + git push public
> > 
> > t/t6041-bisect-submodule.sh
> > ---------------------------
> > config.mak.uname defines TAR = gtar, but that obviously does not help
> > 
> > + git_bisect add_sub1
> > tar: z: unknown option
> > tar: usage  tar [-]{txruc}[eONvVwAfblhm{op}][0-7[lmh]] [tapefile] [blocksize] [[-C directory] file] ...
> > 
> > changing my $PATH to have a GNU tar in front makes all tests pass
> > 
> > 
> > t/t7610-mergetool.sh
> > --------------------
> > HP-UX' mktemp obviously is not compatible with GNU mktemp (which I have
> > not installed/available on HP-UX)
> > 
> >  SYNOPSIS
> >       mktemp [-c] [-d directory_name] [-p prefix]
> > 
> > Resolved 'subdir/file3' using previous resolution.
> > Automatic merge failed; fix conflicts and then commit the result.
> > + git mergetool --no-prompt --tool myecho -- both
> > + 1> actual
> > error: mktemp is needed when 'mergetool.writeToTemp' is true
> > error: last command exited with $?=1
> > not ok 18 - temporary filenames are used with mergetool.writeToTemp
> > 
> > 
> > t/t7800-difftool.sh
> > -------------------
> > HP-UX doesn't have readlink
> > 
> > + git difftool --dir-diff --symlink --extcmd ./.git/CHECK_SYMLINKS branch HEAD
> > ./.git/CHECK_SYMLINKS: line 5: readlink: command not found
> > ./.git/CHECK_SYMLINKS: line 5: readlink: command not found
> > ./.git/CHECK_SYMLINKS: line 5: readlink: command not found
> > /pro/3gl/LINUX/git-2.3.0p/git-difftool line 472: No such file or directory
> > fatal: 'difftool' appears to be a git command, but we were not
> > able to execute it. Maybe git-difftool is broken?
> > error: last command exited with $?=128
> > not ok 49 - difftool --dir-diff --symlink without unstaged changes
> > 
> > 
> > t/t8005-blame-i18n.sh
> > ---------------------
> > SJIS again, I DO NOT CARE!
> > 
> > + 1> actual
> > + test_cmp actual expected
> > actual expected differ: char 56, line 3
> > error: last command exited with $?=1
> > not ok 2 - blame respects i18n.commitencoding

-- 
H.Merijn Brand  http://tux.nl   Perl Monger  http://amsterdam.pm.org/
using perl5.00307 .. 5.21   porting perl5 on HP-UX, AIX, and openSUSE
http://mirrors.develooper.com/hpux/        http://www.test-smoke.org/
http://qa.perl.org   http://www.goldmark.org/jeff/stupid-disclaimers/

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 490 bytes --]

^ permalink raw reply	[relevance 0%]

* Re: Interested in helping open source friends on HP-UX?
  2015-02-18 17:46  0%   ` Michael J Gruber
@ 2015-02-18 18:25  0%     ` Jeff King
  2015-02-18 19:20  0%     ` H.Merijn Brand
  1 sibling, 0 replies; 200+ results
From: Jeff King @ 2015-02-18 18:25 UTC (permalink / raw)
  To: Michael J Gruber; +Cc: H.Merijn Brand, git, Junio C Hamano

On Wed, Feb 18, 2015 at 06:46:04PM +0100, Michael J Gruber wrote:

> >> H. Merijn Brand runs a few HP-UX boxes to help perl5 and other open
> >> source communities, wants help porting more recent Git on these
> >> boxes, running HP-UX 10.20, 11.00, and 11.23, and looking for a
> >> volunteer.  Please contact him directly if you are interested.
> > 
> > No-one. Disappointing :(
> 
> Well, how can we help if we don't even know the limitations of that
> platform?

I'm not sure, but I think the original call for help may have been "I
will give you shell access to these boxes if you want to play around".

> > t/t7001-mv.t
> > ------------
> > cp uses -P flag, which is unknown to HP's (non-GNU) version of cp
> > 
> > Changing the two occurrences from
> > 
> > 		cp -R -P -p ../.git/modules/sub .git &&
> > to
> > 		rsync -aHl ../.git/modules/sub/ .git/ &&
> > 
> > make the tests pass (on those systems that have a working rsync)
> 
> "rsync -r -l -o -p -t" would be the proper equivalent. -aH does more for
> my rsync. I don't know what HP-UX rsync understands, though.

It seems like we could use

  (cd src && tar cf - .) | (cd dst && tar xf -)

here as a more portable alternative. I don't think we can rely on rsync
being everywhere.

-Peff

^ permalink raw reply	[relevance 0%]

* Re: Interested in helping open source friends on HP-UX?
  2015-02-18 16:00  5% ` H.Merijn Brand
@ 2015-02-18 17:46  0%   ` Michael J Gruber
  2015-02-18 18:25  0%     ` Jeff King
  2015-02-18 19:20  0%     ` H.Merijn Brand
  0 siblings, 2 replies; 200+ results
From: Michael J Gruber @ 2015-02-18 17:46 UTC (permalink / raw)
  To: H.Merijn Brand, git, Junio C Hamano

H.Merijn Brand venit, vidit, dixit 18.02.2015 17:00:
> On Wed, 10 Dec 2014 23:46:25 -0800, Junio C Hamano <gitster@pobox.com>
> wrote:
> 
>> Hello, all.
>>
>> H. Merijn Brand runs a few HP-UX boxes to help perl5 and other open
>> source communities, wants help porting more recent Git on these
>> boxes, running HP-UX 10.20, 11.00, and 11.23, and looking for a
>> volunteer.  Please contact him directly if you are interested.
> 
> No-one. Disappointing :(

Well, how can we help if we don't even know the limitations of that
platform?

In short, you are putting additional restrictions in by not having GNU
tools around.

> Did *anyone* ever test with NO_ICONV?
> Too many tests fail without iconv

There is iconv the library and iconv the command. With NO_ICONV, many
tests fail for me even on my standard Linux distro. But our tests keep
using iconv the command. The subtests which pass in t3900, for example,
mostly test that certain things fail, for one reason or another...

But we should guard a few tests in case of NO_ICONV, of course, and
probably not use iconv the command in this case either.

> 
> It is *very* hard to decide from the current status if all
> remaining failures are related to (Asian) locale failures and (thus)
> can be safely ignored (in my environment).
> 
> 
> Specifics at the end
> 
> 
> FAILures from scratch with no iconv:
> --------------------------------------------------------------------------------
> t3513-revert-submodule.sh       Tests: 14 Failed:  5 Failed tests: 1-2, 4, 6-7                   TODO passed:   10-11
> t3900-i18n-commit.sh            Tests: 34 Failed:  8 Failed tests: 15-17, 23-25, 27-28
> t3901-i18n-patch.sh             Tests: 15 Failed:  8 Failed tests: 2-3, 6-7, 9, 11, 14-15
> t4041-diff-submodule-option.sh  Tests: 44 Failed:  5 Failed tests: 5-7, 9-10
> t4201-shortlog.sh               Tests: 11 Failed:  1 Failed tests: 9
> t4204-patch-id.sh               Tests: 15 Failed:  3 Failed tests: 7, 10, 13
> t4205-log-pretty-formats.sh     Tests: 46 Failed: 20 Failed tests: 12-14, 17, 19, 21, 23-29, 31, 33, 35, 37 39, 41-42
> t4210-log-i18n.sh               Tests:  5 Failed:  4 Failed tests: 2-5
> t5100-mailinfo.sh               Tests: 35 Failed: 11 Failed tests: 20-30
> t5570-git-daemon.sh             Tests: 12 Failed:  2 Failed tests: 4-5      Parse errors: No plan found in TAP output
> t6006-rev-list-format.sh        Tests: 54 Failed: 11 Failed tests: 9-10, 12, 25-27, 30-34
> t6041-bisect-submodule.sh       Tests: 14 Failed:  9 Failed tests: 1-2, 4-7, 12-14               TODO passed:   10-11
> t7001-mv.sh                     Tests: 46 Failed:  2 Failed tests: 38-39
> t7102-reset.sh                  Tests: 30 Failed:  1 Failed tests: 2
> t7610-mergetool.sh              Tests: 18 Failed:  1 Failed tests: 18
> t7800-difftool.sh               Tests: 56 Failed:  1 Failed tests: 49
> t8005-blame-i18n.sh             Tests:  5 Failed:  3 Failed tests: 2-4
> t9350-fast-export.sh            Tests: 34 Failed:  1 Failed tests: 4
> Files=687, Tests=12091
> 
> FAILures from scratch with iconv:
> --------------------------------------------------------------------------------
> t3513-revert-submodule.sh       Tests: 14 Failed:  5 Failed tests: 1-2, 4, 6-7                   TODO passed:   10-11
> t3900-i18n-commit.sh            Tests: 34 Failed:  6 Failed tests: 16-17, 24-25, 27-28
> t4204-patch-id.sh               Tests: 15 Failed:  3 Failed tests: 7, 10, 13
> t4210-log-i18n.sh               Tests:  5 Failed:  4 Failed tests: 2-5
> t5100-mailinfo.sh               Tests: 35 Failed:  2 Failed tests: 20, 23
> t5536-fetch-conflicts.sh        Tests:  7 Failed:  3 Failed tests: 3, 6-7
> t5570-git-daemon.sh             Tests: 12 Failed:  2 Failed tests: 4-5      Parse errors: No plan found in TAP output
> t6041-bisect-submodule.sh       Tests: 14 Failed:  9 Failed tests: 1-2, 4-7, 12-14               TODO passed:   10-11
> t7001-mv.sh                     Tests: 46 Failed:  2 Failed tests: 38-39
> t7610-mergetool.sh              Tests: 18 Failed:  1 Failed tests: 18
> t7800-difftool.sh               Tests: 56 Failed:  1 Failed tests: 49
> t8005-blame-i18n.sh             Tests:  5 Failed:  3 Failed tests: 2-4
> Files=687, Tests=12091
> Result: FAIL
> 
> running «sh t****.sh -x -i»
> 
> 
> t/t7001-mv.t
> ------------
> cp uses -P flag, which is unknown to HP's (non-GNU) version of cp
> 
> Changing the two occurrences from
> 
> 		cp -R -P -p ../.git/modules/sub .git &&
> to
> 		rsync -aHl ../.git/modules/sub/ .git/ &&
> 
> make the tests pass (on those systems that have a working rsync)

"rsync -r -l -o -p -t" would be the proper equivalent. -aH does more for
my rsync. I don't know what HP-UX rsync understands, though.

> t/t3513-revert-submodule.sh
> ---------------------------
> tar uses z flag, which is unknown to HP's (non-GNU) version of tar
> config.mak.uname defines TAR = gtar, but that obviously does not help
> 
> putting GNU-tar temporary in from of my $PATH makes the test pass
> /me thinks the z in not required in that test at all
> 
> 	tar cf "$TRASH_DIRECTORY/tmp.tar" * &&
> and
> 	tar xf "$TRASH_DIRECTORY/tmp.tar" &&
> 
> work just as well and prevent the breakage

We can do without z.

> t/t3900-i18n-commit.sh
> ----------------------
> As my HP boxes have *NO* JP or other space eating asian locale stuff
> installed, it is highly likely that *anything* dealing with asian
> locales will fail. On modern Linux hardware, disk space is cheap. On
> most HP-UX boxes disk space is expensive and when having nothing to do
> with Asian languages, removing all Asian-related packages is a fast and
> cheap way to regain disk space.
> 
> Changing compare_with to
> 
> compare_with () {
>     case "$1$2$3" in
> 	*eucJP*|*ISO-2022-JP*) true ;;
> 	*)
> 	    git show -s $1 | sed -e '1,/^$/d' -e 's/^    //' >current &&
> 	    case "$3" in
> 		'')
> 		    test_cmp "$2" current ;;
> 		?*)
> 		    iconv -f "$3" -t UTF-8 >current.utf8 <current &&
> 		    iconv -f "$3" -t UTF-8 >expect.utf8 <"$2" &&
> 		    test_cmp expect.utf8 current.utf8
> 		    ;;
> 		esac
> 	    ;;
> 	esac
>     }
> 
> makes all my tests pass

So you do have iconv the command, but don't want to link with the library?

Availability of the locales should be covered by a prerequisite, like we
do in t9129.

> t/t4204-patch-id.sh
> -------------------
> 
> No idea yet
> 
> + test_patch_id_file_order irrelevant --stable --stable
> Already on 'same'
> cmp: patch-id_ordered-ordered-order---stable-irrelevant: No such file or directory
> 
> $ find * | grep 4204 | grep stable
> trash directory.t4204-patch-id/patch-id_order---stable-irrelevant
> trash directory.t4204-patch-id/patch-id_ordered-order---stable-irrelevant

The "Already"-part is normal output. The rest looks a bit crazy - and
shell related?

> t/t4210-log-i18n
> ----------------
> 
> $ dump "trash directory.t4210-log-i18n/actual"
> 00000000  75 74 66 38 0A                                      utf8.
> $ dump "trash directory.t4210-log-i18n/expect"
> 00000000  6C 61 74 69 6E 31 0A 75  74 66 38 0A                latin1.utf8.
> $ dump "trash directory.t4210-log-i18n/msg"
> 00000000  6C 61 74 69 6E 31 0A 0A  74 E9 73 74 0A             latin1..t.st.
> 
> t/t5100-mailinfo.sh
> -------------------
> + git mailinfo -u rfc2047/0001-msg rfc2047/0001-patch
> + 0< rfc2047/0001 1> rfc2047/0001-info
> fatal: cannot convert from US-ASCII to UTF-8
> error: last command exited with $?=128

Is that mailinfo erroring out? Do you have those locales?

OK, I'll have to stop fishing in the dark here.

> t/t5536-fetch-conflicts.sh
> --------------------------
> + setup_repository ccc +refs/heads/branch1:refs/remotes/origin/branch1 +refs/heads/branch2:refs/remotes/origin/branch1
> Initialized empty Git repository in /pro/3gl/LINUX/git-2.3.0p/t/trash directory.t5536-fetch-conflicts/ccc/.git/
> + cd ccc
> + test_must_fail git fetch origin
> + 2> error
> + verify_stderr
> + 0< /var/tmp/sh6096.2
> cmp: EOF on actual
> error: last command exited with $?=1
> not ok 3 - fetch conflict: config vs. config
> 
> t/t5570-git-daemon.sh
> ---------------------
> I will ignore this myself, as I have no intention of using HP-UX as a
> git server. We already have a dedicated Linux box doing so.
> 
> + test_cmp file clone/file
> ok 3 - clone git repository
> 
> expecting success:
>         echo content >>file &&
>         git commit -a -m two &&
>         git push public &&
>         (cd clone && git pull) &&
>         test_cmp file clone/file
> 
> + echo content
> + 1>> file
> + git commit -a -m two
> 
> arg sulong failed. 0, 0x9fffffffbffff058
> 
>  Setup args failed.
> 
> Pid 6238 was killed due to failure in writing to user register stack - possible stack overflow.
> [master bca99f0] two
>  Author: A U Thor <author@example.com>
>  1 file changed, 1 insertion(+)
> + git push public
> 
> t/t6041-bisect-submodule.sh
> ---------------------------
> config.mak.uname defines TAR = gtar, but that obviously does not help
> 
> + git_bisect add_sub1
> tar: z: unknown option
> tar: usage  tar [-]{txruc}[eONvVwAfblhm{op}][0-7[lmh]] [tapefile] [blocksize] [[-C directory] file] ...
> 
> changing my $PATH to have a GNU tar in front makes all tests pass
> 
> 
> t/t7610-mergetool.sh
> --------------------
> HP-UX' mktemp obviously is not compatible with GNU mktemp (which I have
> not installed/available on HP-UX)
> 
>  SYNOPSIS
>       mktemp [-c] [-d directory_name] [-p prefix]
> 
> Resolved 'subdir/file3' using previous resolution.
> Automatic merge failed; fix conflicts and then commit the result.
> + git mergetool --no-prompt --tool myecho -- both
> + 1> actual
> error: mktemp is needed when 'mergetool.writeToTemp' is true
> error: last command exited with $?=1
> not ok 18 - temporary filenames are used with mergetool.writeToTemp
> 
> 
> t/t7800-difftool.sh
> -------------------
> HP-UX doesn't have readlink
> 
> + git difftool --dir-diff --symlink --extcmd ./.git/CHECK_SYMLINKS branch HEAD
> ./.git/CHECK_SYMLINKS: line 5: readlink: command not found
> ./.git/CHECK_SYMLINKS: line 5: readlink: command not found
> ./.git/CHECK_SYMLINKS: line 5: readlink: command not found
> /pro/3gl/LINUX/git-2.3.0p/git-difftool line 472: No such file or directory
> fatal: 'difftool' appears to be a git command, but we were not
> able to execute it. Maybe git-difftool is broken?
> error: last command exited with $?=128
> not ok 49 - difftool --dir-diff --symlink without unstaged changes
> 
> 
> t/t8005-blame-i18n.sh
> ---------------------
> SJIS again, I DO NOT CARE!
> 
> + 1> actual
> + test_cmp actual expected
> actual expected differ: char 56, line 3
> error: last command exited with $?=1
> not ok 2 - blame respects i18n.commitencoding
> 

^ permalink raw reply	[relevance 0%]

* Re: Interested in helping open source friends on HP-UX?
  @ 2015-02-18 16:00  5% ` H.Merijn Brand
  2015-02-18 17:46  0%   ` Michael J Gruber
  0 siblings, 1 reply; 200+ results
From: H.Merijn Brand @ 2015-02-18 16:00 UTC (permalink / raw)
  To: git, Junio C Hamano

[-- Attachment #1: Type: text/plain, Size: 9676 bytes --]

On Wed, 10 Dec 2014 23:46:25 -0800, Junio C Hamano <gitster@pobox.com>
wrote:

> Hello, all.
> 
> H. Merijn Brand runs a few HP-UX boxes to help perl5 and other open
> source communities, wants help porting more recent Git on these
> boxes, running HP-UX 10.20, 11.00, and 11.23, and looking for a
> volunteer.  Please contact him directly if you are interested.

No-one. Disappointing :(

I started to work on 2.3.0 on HP-UX 11.23/63 ia64


Did *anyone* ever test with NO_ICONV?
Too many tests fail without iconv

It is *very* hard to decide from the current status if all
remaining failures are related to (Asian) locale failures and (thus)
can be safely ignored (in my environment).


Specifics at the end


FAILures from scratch with no iconv:
--------------------------------------------------------------------------------
t3513-revert-submodule.sh       Tests: 14 Failed:  5 Failed tests: 1-2, 4, 6-7                   TODO passed:   10-11
t3900-i18n-commit.sh            Tests: 34 Failed:  8 Failed tests: 15-17, 23-25, 27-28
t3901-i18n-patch.sh             Tests: 15 Failed:  8 Failed tests: 2-3, 6-7, 9, 11, 14-15
t4041-diff-submodule-option.sh  Tests: 44 Failed:  5 Failed tests: 5-7, 9-10
t4201-shortlog.sh               Tests: 11 Failed:  1 Failed tests: 9
t4204-patch-id.sh               Tests: 15 Failed:  3 Failed tests: 7, 10, 13
t4205-log-pretty-formats.sh     Tests: 46 Failed: 20 Failed tests: 12-14, 17, 19, 21, 23-29, 31, 33, 35, 37 39, 41-42
t4210-log-i18n.sh               Tests:  5 Failed:  4 Failed tests: 2-5
t5100-mailinfo.sh               Tests: 35 Failed: 11 Failed tests: 20-30
t5570-git-daemon.sh             Tests: 12 Failed:  2 Failed tests: 4-5      Parse errors: No plan found in TAP output
t6006-rev-list-format.sh        Tests: 54 Failed: 11 Failed tests: 9-10, 12, 25-27, 30-34
t6041-bisect-submodule.sh       Tests: 14 Failed:  9 Failed tests: 1-2, 4-7, 12-14               TODO passed:   10-11
t7001-mv.sh                     Tests: 46 Failed:  2 Failed tests: 38-39
t7102-reset.sh                  Tests: 30 Failed:  1 Failed tests: 2
t7610-mergetool.sh              Tests: 18 Failed:  1 Failed tests: 18
t7800-difftool.sh               Tests: 56 Failed:  1 Failed tests: 49
t8005-blame-i18n.sh             Tests:  5 Failed:  3 Failed tests: 2-4
t9350-fast-export.sh            Tests: 34 Failed:  1 Failed tests: 4
Files=687, Tests=12091

FAILures from scratch with iconv:
--------------------------------------------------------------------------------
t3513-revert-submodule.sh       Tests: 14 Failed:  5 Failed tests: 1-2, 4, 6-7                   TODO passed:   10-11
t3900-i18n-commit.sh            Tests: 34 Failed:  6 Failed tests: 16-17, 24-25, 27-28
t4204-patch-id.sh               Tests: 15 Failed:  3 Failed tests: 7, 10, 13
t4210-log-i18n.sh               Tests:  5 Failed:  4 Failed tests: 2-5
t5100-mailinfo.sh               Tests: 35 Failed:  2 Failed tests: 20, 23
t5536-fetch-conflicts.sh        Tests:  7 Failed:  3 Failed tests: 3, 6-7
t5570-git-daemon.sh             Tests: 12 Failed:  2 Failed tests: 4-5      Parse errors: No plan found in TAP output
t6041-bisect-submodule.sh       Tests: 14 Failed:  9 Failed tests: 1-2, 4-7, 12-14               TODO passed:   10-11
t7001-mv.sh                     Tests: 46 Failed:  2 Failed tests: 38-39
t7610-mergetool.sh              Tests: 18 Failed:  1 Failed tests: 18
t7800-difftool.sh               Tests: 56 Failed:  1 Failed tests: 49
t8005-blame-i18n.sh             Tests:  5 Failed:  3 Failed tests: 2-4
Files=687, Tests=12091
Result: FAIL

running «sh t****.sh -x -i»


t/t7001-mv.t
------------
cp uses -P flag, which is unknown to HP's (non-GNU) version of cp

Changing the two occurrences from

		cp -R -P -p ../.git/modules/sub .git &&
to
		rsync -aHl ../.git/modules/sub/ .git/ &&

make the tests pass (on those systems that have a working rsync)

t/t3513-revert-submodule.sh
---------------------------
tar uses z flag, which is unknown to HP's (non-GNU) version of tar
config.mak.uname defines TAR = gtar, but that obviously does not help

putting GNU-tar temporary in from of my $PATH makes the test pass
/me thinks the z in not required in that test at all

	tar cf "$TRASH_DIRECTORY/tmp.tar" * &&
and
	tar xf "$TRASH_DIRECTORY/tmp.tar" &&

work just as well and prevent the breakage

t/t3900-i18n-commit.sh
----------------------
As my HP boxes have *NO* JP or other space eating asian locale stuff
installed, it is highly likely that *anything* dealing with asian
locales will fail. On modern Linux hardware, disk space is cheap. On
most HP-UX boxes disk space is expensive and when having nothing to do
with Asian languages, removing all Asian-related packages is a fast and
cheap way to regain disk space.

Changing compare_with to

compare_with () {
    case "$1$2$3" in
	*eucJP*|*ISO-2022-JP*) true ;;
	*)
	    git show -s $1 | sed -e '1,/^$/d' -e 's/^    //' >current &&
	    case "$3" in
		'')
		    test_cmp "$2" current ;;
		?*)
		    iconv -f "$3" -t UTF-8 >current.utf8 <current &&
		    iconv -f "$3" -t UTF-8 >expect.utf8 <"$2" &&
		    test_cmp expect.utf8 current.utf8
		    ;;
		esac
	    ;;
	esac
    }

makes all my tests pass

t/t4204-patch-id.sh
-------------------

No idea yet

+ test_patch_id_file_order irrelevant --stable --stable
Already on 'same'
cmp: patch-id_ordered-ordered-order---stable-irrelevant: No such file or directory

$ find * | grep 4204 | grep stable
trash directory.t4204-patch-id/patch-id_order---stable-irrelevant
trash directory.t4204-patch-id/patch-id_ordered-order---stable-irrelevant

t/t4210-log-i18n
----------------

$ dump "trash directory.t4210-log-i18n/actual"
00000000  75 74 66 38 0A                                      utf8.
$ dump "trash directory.t4210-log-i18n/expect"
00000000  6C 61 74 69 6E 31 0A 75  74 66 38 0A                latin1.utf8.
$ dump "trash directory.t4210-log-i18n/msg"
00000000  6C 61 74 69 6E 31 0A 0A  74 E9 73 74 0A             latin1..t.st.

t/t5100-mailinfo.sh
-------------------
+ git mailinfo -u rfc2047/0001-msg rfc2047/0001-patch
+ 0< rfc2047/0001 1> rfc2047/0001-info
fatal: cannot convert from US-ASCII to UTF-8
error: last command exited with $?=128

t/t5536-fetch-conflicts.sh
--------------------------
+ setup_repository ccc +refs/heads/branch1:refs/remotes/origin/branch1 +refs/heads/branch2:refs/remotes/origin/branch1
Initialized empty Git repository in /pro/3gl/LINUX/git-2.3.0p/t/trash directory.t5536-fetch-conflicts/ccc/.git/
+ cd ccc
+ test_must_fail git fetch origin
+ 2> error
+ verify_stderr
+ 0< /var/tmp/sh6096.2
cmp: EOF on actual
error: last command exited with $?=1
not ok 3 - fetch conflict: config vs. config

t/t5570-git-daemon.sh
---------------------
I will ignore this myself, as I have no intention of using HP-UX as a
git server. We already have a dedicated Linux box doing so.

+ test_cmp file clone/file
ok 3 - clone git repository

expecting success:
        echo content >>file &&
        git commit -a -m two &&
        git push public &&
        (cd clone && git pull) &&
        test_cmp file clone/file

+ echo content
+ 1>> file
+ git commit -a -m two

arg sulong failed. 0, 0x9fffffffbffff058

 Setup args failed.

Pid 6238 was killed due to failure in writing to user register stack - possible stack overflow.
[master bca99f0] two
 Author: A U Thor <author@example.com>
 1 file changed, 1 insertion(+)
+ git push public

t/t6041-bisect-submodule.sh
---------------------------
config.mak.uname defines TAR = gtar, but that obviously does not help

+ git_bisect add_sub1
tar: z: unknown option
tar: usage  tar [-]{txruc}[eONvVwAfblhm{op}][0-7[lmh]] [tapefile] [blocksize] [[-C directory] file] ...

changing my $PATH to have a GNU tar in front makes all tests pass


t/t7610-mergetool.sh
--------------------
HP-UX' mktemp obviously is not compatible with GNU mktemp (which I have
not installed/available on HP-UX)

 SYNOPSIS
      mktemp [-c] [-d directory_name] [-p prefix]

Resolved 'subdir/file3' using previous resolution.
Automatic merge failed; fix conflicts and then commit the result.
+ git mergetool --no-prompt --tool myecho -- both
+ 1> actual
error: mktemp is needed when 'mergetool.writeToTemp' is true
error: last command exited with $?=1
not ok 18 - temporary filenames are used with mergetool.writeToTemp


t/t7800-difftool.sh
-------------------
HP-UX doesn't have readlink

+ git difftool --dir-diff --symlink --extcmd ./.git/CHECK_SYMLINKS branch HEAD
./.git/CHECK_SYMLINKS: line 5: readlink: command not found
./.git/CHECK_SYMLINKS: line 5: readlink: command not found
./.git/CHECK_SYMLINKS: line 5: readlink: command not found
/pro/3gl/LINUX/git-2.3.0p/git-difftool line 472: No such file or directory
fatal: 'difftool' appears to be a git command, but we were not
able to execute it. Maybe git-difftool is broken?
error: last command exited with $?=128
not ok 49 - difftool --dir-diff --symlink without unstaged changes


t/t8005-blame-i18n.sh
---------------------
SJIS again, I DO NOT CARE!

+ 1> actual
+ test_cmp actual expected
actual expected differ: char 56, line 3
error: last command exited with $?=1
not ok 2 - blame respects i18n.commitencoding

-- 
H.Merijn Brand  http://tux.nl   Perl Monger  http://amsterdam.pm.org/
using perl5.00307 .. 5.21   porting perl5 on HP-UX, AIX, and openSUSE
http://mirrors.develooper.com/hpux/        http://www.test-smoke.org/
http://qa.perl.org   http://www.goldmark.org/jeff/stupid-disclaimers/

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 490 bytes --]

^ permalink raw reply	[relevance 5%]

* [PATCH 01/25] mv test: recreate mod/ directory instead of relying on stale copy
  2014-10-15  0:45  2% [PATCH v23 0/25] rs/ref-transaction ("Use ref transactions", part 3) Jonathan Nieder
@ 2014-10-15  0:46 10% ` Jonathan Nieder
  0 siblings, 0 replies; 200+ results
From: Jonathan Nieder @ 2014-10-15  0:46 UTC (permalink / raw)
  To: Michael Haggerty; +Cc: git, Ronnie Sahlberg, Junio C Hamano

From: Jonathan Nieder <jrnieder@gmail.com>
Date: Wed, 10 Sep 2014 14:01:46 -0700

The tests for 'git mv moves a submodule' functionality often run
commands like

	git mv sub mod/sub

to move a submodule into a subdirectory.  Just like plain /bin/mv,
this is supposed to succeed if the mod/ parent directory exists
and fail if it doesn't exist.

Usually these tests mkdir the parent directory beforehand, but some
instead rely on it being left behind by previous tests.

More precisely, when 'git reset --hard' tries to move to a state where
mod/sub is not present any more, it would perform the following
operations:

	rmdir("mod/sub")
	rmdir("mod")

The first fails with ENOENT because the test script removed mod/sub
with "rm -rf" already, so 'reset --hard' doesn't bother to move on to
the second, and the mod/ directory is kept around.

Better to explicitly remove and re-create the mod/ directory so later
tests don't have to depend on the directory left behind by the earlier
ones at all (making it easier to rearrange or skip some tests in the
file or to tweak 'reset --hard' behavior without breaking unrelated
tests).

Noticed while testing a patch that fixes the reset --hard behavior
described above.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Ronnie Sahlberg <sahlberg@google.com>
---
 t/t7001-mv.sh | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 54d7807..69f11bd 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -350,10 +350,11 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu
 '
 
 test_expect_success 'git mv moves a submodule with gitfile' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	(
 		cd mod &&
 		git mv ../sub/ .
@@ -372,11 +373,12 @@ test_expect_success 'git mv moves a submodule with gitfile' '
 '
 
 test_expect_success 'mv does not complain when no .gitmodules file is found' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git rm .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	! test -s actual.err &&
 	! test -e sub &&
@@ -390,11 +392,12 @@ test_expect_success 'mv does not complain when no .gitmodules file is found' '
 '
 
 test_expect_success 'mv will error out on a modified .gitmodules file unless staged' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules foo.bar true &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	test_must_fail git mv sub mod/sub 2>actual.err &&
 	test -s actual.err &&
 	test -e sub &&
@@ -413,13 +416,14 @@ test_expect_success 'mv will error out on a modified .gitmodules file unless sta
 '
 
 test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules --remove-section submodule.sub &&
 	git add .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
 	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	test_i18ncmp expect.err actual.err &&
 	! test -e sub &&
@@ -433,9 +437,10 @@ test_expect_success 'mv issues a warning when section is not found in .gitmodule
 '
 
 test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
+	mkdir mod &&
 	git mv -n sub mod/sub 2>actual.err &&
 	test -f sub/.git &&
 	git diff-index --exit-code HEAD &&
-- 
2.1.0.rc2.206.gedb03e5

^ permalink raw reply related	[relevance 10%]

* [PATCH v23 0/25] rs/ref-transaction ("Use ref transactions", part 3)
@ 2014-10-15  0:45  2% Jonathan Nieder
  2014-10-15  0:46 10% ` [PATCH 01/25] mv test: recreate mod/ directory instead of relying on stale copy Jonathan Nieder
  0 siblings, 1 reply; 200+ results
From: Jonathan Nieder @ 2014-10-15  0:45 UTC (permalink / raw)
  To: Michael Haggerty; +Cc: git, Ronnie Sahlberg, Junio C Hamano

This series by Ronnie was last seen on-list at [1].  It includes some
improvements to the ref-transaction API, improves handling of poorly
named refs (which should make it easier to tighten the refname format
checks in the future), and is a stepping stone toward later series
that use the ref-transaction API more and make it support alternate
backends (yay!).

The changes since (a merge of 'master' and) v22 are very minor and can
be seen below[2].  The more important change is that it's rebased
against current 'master'.

Review comments from Michael and Junio were very helpful in getting
this in shape.  Thanks much to both.

The series can also be found at

  git://repo.or.cz/git/jrn.git tags/rs/ref-transaction

It is based against current 'master' (670a3c1d, 2014-10-14) and
intended for 'next'.

Thoughts welcome, as always.  Improvements preferred in the form of
patches on top of the series.

Jonathan Nieder (6):
  mv test: recreate mod/ directory instead of relying on stale copy
  branch -d: avoid repeated symref resolution
  packed-ref cache: forbid dot-components in refnames
  refs.c: do not permit err == NULL
  lockfile: remove unable_to_lock_error
  ref_transaction_commit: bail out on failure to remove a ref

Junio C Hamano (1):
  reflog test: test interaction with detached HEAD

Ronnie Sahlberg (18):
  wrapper.c: remove/unlink_or_warn: simplify, treat ENOENT as success
  refs.c: lock_ref_sha1_basic is used for all refs
  wrapper.c: add a new function unlink_or_msg
  refs.c: add an err argument to delete_ref_loose
  refs.c: pass the ref log message to _create/delete/update instead of
    _commit
  rename_ref: don't ask read_ref_full where the ref came from
  refs.c: refuse to lock badly named refs in lock_ref_sha1_basic
  refs.c: call lock_ref_sha1_basic directly from commit
  refs.c: pass a list of names to skip to is_refname_available
  refs.c: ref_transaction_commit: distinguish name conflicts from other
    errors
  fetch.c: change s_update_ref to use a ref transaction
  refs.c: make write_ref_sha1 static
  refs.c: change resolve_ref_unsafe reading argument to be a flags field
  branch -d: simplify by using RESOLVE_REF_READING
  test: put tests for handling of bad ref names in one place
  refs.c: allow listing and deleting badly named refs
  for-each-ref: skip and warn about broken ref names
  remote rm/prune: print a message when writing packed-refs fails

 branch.c                 |   6 +-
 builtin/blame.c          |   2 +-
 builtin/branch.c         |  22 ++-
 builtin/checkout.c       |   6 +-
 builtin/clone.c          |   2 +-
 builtin/commit.c         |   6 +-
 builtin/fetch.c          |  34 ++--
 builtin/fmt-merge-msg.c  |   2 +-
 builtin/for-each-ref.c   |  11 +-
 builtin/fsck.c           |   2 +-
 builtin/log.c            |   3 +-
 builtin/merge.c          |   2 +-
 builtin/notes.c          |   2 +-
 builtin/receive-pack.c   |   9 +-
 builtin/remote.c         |  20 ++-
 builtin/replace.c        |   5 +-
 builtin/show-branch.c    |   7 +-
 builtin/symbolic-ref.c   |   2 +-
 builtin/tag.c            |   4 +-
 builtin/update-ref.c     |  13 +-
 bundle.c                 |   2 +-
 cache.h                  |  44 +++--
 fast-import.c            |   8 +-
 git-compat-util.h        |  16 +-
 http-backend.c           |   4 +-
 lockfile.c               |  10 --
 lockfile.h               |   1 -
 notes-merge.c            |   2 +-
 reflog-walk.c            |   5 +-
 refs.c                   | 446 ++++++++++++++++++++++++++++++++---------------
 refs.h                   |  44 +++--
 remote.c                 |  11 +-
 sequencer.c              |   8 +-
 t/t1400-update-ref.sh    |  62 +++----
 t/t1413-reflog-detach.sh |  70 ++++++++
 t/t1430-bad-ref-name.sh  | 207 ++++++++++++++++++++++
 t/t3200-branch.sh        |   9 +
 t/t7001-mv.sh            |  15 +-
 t/t9300-fast-import.sh   |  30 ----
 transport-helper.c       |   5 +-
 transport.c              |   5 +-
 upload-pack.c            |   2 +-
 walker.c                 |   5 +-
 wrapper.c                |  28 ++-
 wt-status.c              |   2 +-
 45 files changed, 850 insertions(+), 351 deletions(-)
 create mode 100755 t/t1413-reflog-detach.sh
 create mode 100755 t/t1430-bad-ref-name.sh

[1] http://thread.gmane.org/gmane.comp.version-control.git/254501/focus=257771
[2]
 cache.h           | 11 ++++---
 git-compat-util.h |  4 +--
 refs.c            | 96 +++++++++++++++++++++++++++++--------------------------
 refs.h            |  6 +++-
 4 files changed, 64 insertions(+), 53 deletions(-)

diff --git a/cache.h b/cache.h
index 209e8ba..0501f7d 100644
--- a/cache.h
+++ b/cache.h
@@ -983,7 +983,8 @@ extern int read_ref(const char *refname, unsigned char *sha1);
  * packed references), REF_ISSYMREF (if the initial reference was a
  * symbolic reference), REF_BAD_NAME (if the reference name is ill
  * formed --- see RESOLVE_REF_ALLOW_BAD_NAME below), and REF_ISBROKEN
- * (if the ref is malformed).
+ * (if the ref is malformed or has a bad name). See refs.h for more detail
+ * on each flag.
  *
  * If ref is not a properly-formatted, normalized reference, return
  * NULL.  If more than MAXDEPTH recursive symbolic lookups are needed,
@@ -991,12 +992,14 @@ extern int read_ref(const char *refname, unsigned char *sha1);
  *
  * RESOLVE_REF_ALLOW_BAD_NAME allows resolving refs even when their
  * name is invalid according to git-check-ref-format(1).  If the name
- * is bad then the value stored in sha1 will be null_sha1 and the
- * REF_ISBROKEN and REF_BAD_NAME flags will be set.
+ * is bad then the value stored in sha1 will be null_sha1 and the two
+ * flags REF_ISBROKEN and REF_BAD_NAME will be set.
  *
  * Even with RESOLVE_REF_ALLOW_BAD_NAME, names that escape the refs/
  * directory and do not consist of all caps and underscores cannot be
- * resolved.  The function returns NULL for such ref names.
+ * resolved. The function returns NULL for such ref names.
+ * Caps and underscores refers to the special refs, such as HEAD,
+ * FETCH_HEAD and friends, that all live outside of the refs/ directory.
  */
 #define RESOLVE_REF_READING 0x01
 #define RESOLVE_REF_NO_RECURSE 0x02
diff --git a/git-compat-util.h b/git-compat-util.h
index 8f805bf..59ecf21 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -779,7 +779,7 @@ void git_qsort(void *base, size_t nmemb, size_t size,
 
 /*
  * Preserves errno, prints a message, but gives no warning for ENOENT.
- * Returns 0 on success which includes trying to unlink an object that does
+ * Returns 0 on success, which includes trying to unlink an object that does
  * not exist.
  */
 int unlink_or_warn(const char *path);
@@ -792,7 +792,7 @@ int unlink_or_warn(const char *path);
 int unlink_or_msg(const char *file, struct strbuf *err);
 /*
  * Preserves errno, prints a message, but gives no warning for ENOENT.
- * Returns 0 on success which includes trying to remove a directory that does
+ * Returns 0 on success, which includes trying to remove a directory that does
  * not exist.
  */
 int rmdir_or_warn(const char *path);
diff --git a/refs.c b/refs.c
index bee0e39..0368ed4 100644
--- a/refs.c
+++ b/refs.c
@@ -274,29 +274,31 @@ static struct ref_dir *get_ref_dir(struct ref_entry *entry)
 	return dir;
 }
 
-static int escapes_cwd(const char *path) {
-	char *buf;
-	int result;
-
-	if (is_absolute_path(path))
-		return 1;
-	buf = xmalloc(strlen(path) + 1);
-	result = !!normalize_path_copy(buf, path);
-	free(buf);
-	return result;
-}
-
 /*
  * Check if a refname is safe.
- * For refs that start with "refs/" we consider it safe as long as the rest
- * of the path components does not allow it to escape from this directory.
+ * For refs that start with "refs/" we consider it safe as long they do
+ * not try to resolve to outside of refs/.
+ *
  * For all other refs we only consider them safe iff they only contain
- * upper case characters and '_'.
+ * upper case characters and '_' (like "HEAD" AND "MERGE_HEAD", and not like
+ * "config").
  */
 static int refname_is_safe(const char *refname)
 {
-	if (starts_with(refname, "refs/"))
-		return !escapes_cwd(refname + strlen("refs/"));
+	if (starts_with(refname, "refs/")) {
+		char *buf;
+		int result;
+
+		buf = xmalloc(strlen(refname) + 1);
+		/*
+		 * Does the refname try to escape refs/?
+		 * For example: refs/foo/../bar is safe but refs/foo/../../bar
+		 * is not.
+		 */
+		result = !normalize_path_copy(buf, refname + strlen("refs/"));
+		free(buf);
+		return result;
+	}
 	while (*refname) {
 		if (!isupper(*refname) && *refname != '_')
 			return 0;
@@ -812,13 +814,13 @@ static void prime_ref_dir(struct ref_dir *dir)
 	}
 }
 
-static int entry_matches(struct ref_entry *entry, struct string_list *list)
+static int entry_matches(struct ref_entry *entry, const struct string_list *list)
 {
 	return list && string_list_has_string(list, entry->name);
 }
 
 struct nonmatching_ref_data {
-	struct string_list *skip;
+	const struct string_list *skip;
 	struct ref_entry *found;
 };
 
@@ -842,18 +844,20 @@ static void report_refname_conflict(struct ref_entry *entry,
 /*
  * Return true iff a reference named refname could be created without
  * conflicting with the name of an existing reference in dir.  If
- * skiplist is non-NULL, ignore potential conflicts with names in
- * skiplist (e.g., because those refs are scheduled for deletion in
- * the same operation).  skiplist must be sorted.
+ * skip is non-NULL, ignore potential conflicts with refs in skip
+ * (e.g., because they are scheduled for deletion in the same
+ * operation).
  *
  * Two reference names conflict if one of them exactly matches the
  * leading components of the other; e.g., "foo/bar" conflicts with
  * both "foo" and with "foo/bar/baz" but not with "foo/bar" or
  * "foo/barbados".
+ *
+ * skip must be sorted.
  */
 static int is_refname_available(const char *refname,
-				struct ref_dir *dir,
-				struct string_list *skiplist)
+				const struct string_list *skip,
+				struct ref_dir *dir)
 {
 	const char *slash;
 	size_t len;
@@ -866,12 +870,12 @@ static int is_refname_available(const char *refname,
 		 * looking for a conflict with a leaf entry.
 		 *
 		 * If we find one, we still must make sure it is
-		 * not in "skiplist".
+		 * not in "skip".
 		 */
 		pos = search_ref_dir(dir, refname, slash - refname);
 		if (pos >= 0) {
 			struct ref_entry *entry = dir->entries[pos];
-			if (entry_matches(entry, skiplist))
+			if (entry_matches(entry, skip))
 				return 1;
 			report_refname_conflict(entry, refname);
 			return 0;
@@ -903,14 +907,14 @@ static int is_refname_available(const char *refname,
 	if (pos >= 0) {
 		/*
 		 * We found a directory named "refname". It is a
-		 * problem iff it contains any ref that is not in
-		 * "skiplist".
+		 * problem iff it contains any ref that is not
+		 * in "skip".
 		 */
 		struct ref_entry *entry = dir->entries[pos];
 		struct ref_dir *dir = get_ref_dir(entry);
 		struct nonmatching_ref_data data;
 
-		data.skip = skiplist;
+		data.skip = skip;
 		sort_ref_dir(dir);
 		if (!do_for_each_entry_in_dir(dir, 0, nonmatching_ref_fn, &data))
 			return 1;
@@ -1596,7 +1600,7 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags, unsigned
 		}
 		if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
 			if (flags)
-				*flags |= REF_BAD_NAME | REF_ISBROKEN;
+				*flags |= REF_ISBROKEN;
 
 			if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
 			    !refname_is_safe(buf)) {
@@ -2217,12 +2221,12 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
 }
 
 /*
- * Locks a "refs/" ref returning the lock on success and NULL on failure.
+ * Locks a ref returning the lock on success and NULL on failure.
  * On failure errno is set to something meaningful.
  */
 static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 					    const unsigned char *old_sha1,
-					    struct string_list *skiplist,
+					    const struct string_list *skip,
 					    int flags, int *type_p)
 {
 	char *ref_file;
@@ -2278,8 +2282,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 	 * name is a proper prefix of our refname.
 	 */
 	if (missing &&
-	     !is_refname_available(refname, get_packed_refs(&ref_cache),
-				   skiplist)) {
+	     !is_refname_available(refname, skip, get_packed_refs(&ref_cache))) {
 		last_errno = ENOTDIR;
 		goto error_return;
 	}
@@ -2780,6 +2783,18 @@ static int rename_tmp_log(const char *newrefname)
 	return 0;
 }
 
+static int rename_ref_available(const char *oldname, const char *newname)
+{
+	struct string_list skip = STRING_LIST_INIT_NODUP;
+	int ret;
+
+	string_list_insert(&skip, oldname);
+	ret = is_refname_available(newname, &skip, get_packed_refs(&ref_cache))
+	    && is_refname_available(newname, &skip, get_loose_refs(&ref_cache));
+	string_list_clear(&skip, 0);
+	return ret;
+}
+
 static int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1,
 			  const char *logmsg);
 
@@ -2791,7 +2806,6 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 	struct stat loginfo;
 	int log = !lstat(git_path("logs/%s", oldrefname), &loginfo);
 	const char *symref = NULL;
-	struct string_list skiplist = STRING_LIST_INIT_NODUP;
 
 	if (log && S_ISLNK(loginfo.st_mode))
 		return error("reflog for %s is a symlink", oldrefname);
@@ -2804,18 +2818,8 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 	if (!symref)
 		return error("refname %s not found", oldrefname);
 
-	string_list_insert(&skiplist, oldrefname);
-	if (!is_refname_available(newrefname, get_packed_refs(&ref_cache),
-				  &skiplist)) {
-		string_list_clear(&skiplist, 0);
+	if (!rename_ref_available(oldrefname, newrefname))
 		return 1;
-	}
-	if (!is_refname_available(newrefname, get_loose_refs(&ref_cache),
-				  &skiplist)) {
-		string_list_clear(&skiplist, 0);
-		return 1;
-	}
-	string_list_clear(&skiplist, 0);
 
 	if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG)))
 		return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s",
diff --git a/refs.h b/refs.h
index e1c43f9..2bc3556 100644
--- a/refs.h
+++ b/refs.h
@@ -62,7 +62,11 @@ struct ref_transaction;
  */
 #define REF_ISBROKEN 0x04
 
-/* Reference name is not well formed (see git-check-ref-format(1)). */
+/*
+ * Reference name is not well formed.
+ *
+ * See git-check-ref-format(1) for the definition of well formed ref names.
+ */
 #define REF_BAD_NAME 0x08
 
 /*

^ permalink raw reply related	[relevance 2%]

* [PATCH 01/24] mv test: recreate mod/ directory instead of relying on stale copy
  2014-10-02  1:48  1%           ` [PATCH v22 0/24] rs/ref-transaction Jonathan Nieder
@ 2014-10-02  1:50 10%             ` Jonathan Nieder
  0 siblings, 0 replies; 200+ results
From: Jonathan Nieder @ 2014-10-02  1:50 UTC (permalink / raw)
  To: Ronnie Sahlberg; +Cc: git@vger.kernel.org, Michael Haggerty

Date: Wed, 10 Sep 2014 14:01:46 -0700

The tests for 'git mv moves a submodule' functionality often run
commands like

	git mv sub mod/sub

to move a submodule into a subdirectory.  Just like plain /bin/mv,
this is supposed to succeed if the mod/ parent directory exists
and fail if it doesn't exist.

Usually these tests mkdir the parent directory beforehand, but some
instead rely on it being left behind by previous tests.

More precisely, when 'git reset --hard' tries to move to a state where
mod/sub is not present any more, it would perform the following
operations:

	rmdir("mod/sub")
	rmdir("mod")

The first fails with ENOENT because the test script removed mod/sub
with "rm -rf" already, so 'reset --hard' doesn't bother to move on to
the second, and the mod/ directory is kept around.

Better to explicitly remove and re-create the mod/ directory so later
tests don't have to depend on the directory left behind by the earlier
ones at all (making it easier to rearrange or skip some tests in the
file or to tweak 'reset --hard' behavior without breaking unrelated
tests).

Noticed while testing a patch that fixes the reset --hard behavior
described above.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Ronnie Sahlberg <sahlberg@google.com>
---
As before.

 t/t7001-mv.sh | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 54d7807..69f11bd 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -350,10 +350,11 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu
 '
 
 test_expect_success 'git mv moves a submodule with gitfile' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	(
 		cd mod &&
 		git mv ../sub/ .
@@ -372,11 +373,12 @@ test_expect_success 'git mv moves a submodule with gitfile' '
 '
 
 test_expect_success 'mv does not complain when no .gitmodules file is found' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git rm .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	! test -s actual.err &&
 	! test -e sub &&
@@ -390,11 +392,12 @@ test_expect_success 'mv does not complain when no .gitmodules file is found' '
 '
 
 test_expect_success 'mv will error out on a modified .gitmodules file unless staged' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules foo.bar true &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	test_must_fail git mv sub mod/sub 2>actual.err &&
 	test -s actual.err &&
 	test -e sub &&
@@ -413,13 +416,14 @@ test_expect_success 'mv will error out on a modified .gitmodules file unless sta
 '
 
 test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules --remove-section submodule.sub &&
 	git add .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
 	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	test_i18ncmp expect.err actual.err &&
 	! test -e sub &&
@@ -433,9 +437,10 @@ test_expect_success 'mv issues a warning when section is not found in .gitmodule
 '
 
 test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
+	mkdir mod &&
 	git mv -n sub mod/sub 2>actual.err &&
 	test -f sub/.git &&
 	git diff-index --exit-code HEAD &&
-- 
2.1.0.rc2.206.gedb03e5

^ permalink raw reply related	[relevance 10%]

* [PATCH v22 0/24] rs/ref-transaction
  2014-09-11  3:03  2%         ` [PATCH v21 0/19] rs/ref-transaction (Re: Transaction patch series overview) Jonathan Nieder
  2014-09-11  3:04 10%           ` [PATCH 01/19] mv test: recreate mod/ directory instead of relying on stale copy Jonathan Nieder
@ 2014-10-02  1:48  1%           ` Jonathan Nieder
  2014-10-02  1:50 10%             ` [PATCH 01/24] mv test: recreate mod/ directory instead of relying on stale copy Jonathan Nieder
  1 sibling, 1 reply; 200+ results
From: Jonathan Nieder @ 2014-10-02  1:48 UTC (permalink / raw)
  To: Ronnie Sahlberg; +Cc: git@vger.kernel.org, Michael Haggerty

Jonathan Nieder wrote:
> Jonathan Nieder wrote:

>> The next series from Ronnie's collection is available at
>> https://code-review.googlesource.com/#/q/topic:ref-transaction in case
>> someone wants a fresh series to look at.
>
> Here is the outcome of that review.  It could use another set of eyes
> (hint, hint)

Another set of eyes arrived and helped.  Here's a reroll.

Jonathan Nieder (6):
  mv test: recreate mod/ directory instead of relying on stale copy
  branch -d: avoid repeated symref resolution
  packed-ref cache: forbid dot-components in refnames
  refs.c: do not permit err == NULL
  lockfile: remove unable_to_lock_error
  ref_transaction_commit: bail out on failure to remove a ref

Junio C Hamano (1):
  reflog test: test interaction with detached HEAD

Ronnie Sahlberg (17):
  wrapper.c: remove/unlink_or_warn: simplify, treat ENOENT as success
  wrapper.c: add a new function unlink_or_msg
  refs.c: add an err argument to delete_ref_loose
  refs.c: pass the ref log message to _create/delete/update instead of
    _commit
  rename_ref: don't ask read_ref_full where the ref came from
  refs.c: refuse to lock badly named refs in lock_ref_sha1_basic
  refs.c: call lock_ref_sha1_basic directly from commit
  refs.c: pass a list of names to skip to is_refname_available
  refs.c: ref_transaction_commit: distinguish name conflicts from other
    errors
  fetch.c: change s_update_ref to use a ref transaction
  refs.c: make write_ref_sha1 static
  refs.c: change resolve_ref_unsafe reading argument to be a flags field
  branch -d: simplify by using RESOLVE_REF_READING flag
  test: put tests for handling of bad ref names in one place
  refs.c: allow listing and deleting badly named refs
  for-each-ref.c: improve message before aborting on broken ref
  remote rm/prune: print a message when writing packed-refs fails

 branch.c                 |   6 +-
 builtin/blame.c          |   2 +-
 builtin/branch.c         |  22 ++-
 builtin/checkout.c       |   6 +-
 builtin/clone.c          |   2 +-
 builtin/commit.c         |   6 +-
 builtin/fetch.c          |  34 ++--
 builtin/fmt-merge-msg.c  |   2 +-
 builtin/for-each-ref.c   |  11 +-
 builtin/fsck.c           |   2 +-
 builtin/log.c            |   3 +-
 builtin/merge.c          |   2 +-
 builtin/notes.c          |   2 +-
 builtin/receive-pack.c   |   9 +-
 builtin/remote.c         |  20 ++-
 builtin/replace.c        |   5 +-
 builtin/show-branch.c    |   7 +-
 builtin/symbolic-ref.c   |   2 +-
 builtin/tag.c            |   4 +-
 builtin/update-ref.c     |  13 +-
 bundle.c                 |   2 +-
 cache.h                  |  42 +++--
 fast-import.c            |   8 +-
 git-compat-util.h        |  16 +-
 http-backend.c           |   4 +-
 lockfile.c               |  10 --
 notes-merge.c            |   2 +-
 reflog-walk.c            |   5 +-
 refs.c                   | 438 ++++++++++++++++++++++++++++++++---------------
 refs.h                   |  40 +++--
 remote.c                 |  11 +-
 sequencer.c              |   8 +-
 t/t1400-update-ref.sh    |  62 +++----
 t/t1413-reflog-detach.sh |  70 ++++++++
 t/t1430-bad-ref-name.sh  | 207 ++++++++++++++++++++++
 t/t3200-branch.sh        |   9 +
 t/t7001-mv.sh            |  15 +-
 t/t9300-fast-import.sh   |  30 ----
 transport-helper.c       |   5 +-
 transport.c              |   5 +-
 upload-pack.c            |   2 +-
 walker.c                 |   5 +-
 wrapper.c                |  28 ++-
 wt-status.c              |   2 +-
 44 files changed, 838 insertions(+), 348 deletions(-)
 create mode 100755 t/t1413-reflog-detach.sh
 create mode 100755 t/t1430-bad-ref-name.sh

-- 
2.0.0.450.ga793d96

---
Changes since v21:

 branch.c                    |   2 +-
 builtin/blame.c             |   2 +-
 builtin/branch.c            |  25 ++---
 builtin/checkout.c          |   6 +-
 builtin/clone.c             |   2 +-
 builtin/commit.c            |   2 +-
 builtin/fetch.c             |   6 +-
 builtin/fmt-merge-msg.c     |   2 +-
 builtin/for-each-ref.c      |  11 +-
 builtin/fsck.c              |   2 +-
 builtin/log.c               |   4 +-
 builtin/merge.c             |   2 +-
 builtin/notes.c             |   2 +-
 builtin/receive-pack.c      |   4 +-
 builtin/remote.c            |  21 ++--
 builtin/show-branch.c       |   9 +-
 builtin/symbolic-ref.c      |   2 +-
 builtin/update-ref.c        |   3 +-
 bundle.c                    |   2 +-
 cache.h                     |  33 ++++--
 http-backend.c              |   5 +-
 notes-merge.c               |   2 +-
 reflog-walk.c               |   6 +-
 refs.c                      | 263 +++++++++++++++++++++++++-------------------
 refs.h                      |  34 +++---
 remote.c                    |  13 ++-
 sequencer.c                 |   4 +-
 t/t1400-update-ref.sh       |  46 ++------
 t/t1402-check-ref-format.sh |  48 --------
 t/t1413-reflog-detach.sh    |  70 ++++++++++++
 t/t1430-bad-ref-name.sh     | 207 ++++++++++++++++++++++++++++++++++
 t/t9300-fast-import.sh      |  30 -----
 transport-helper.c          |   5 +-
 transport.c                 |   6 +-
 upload-pack.c               |   2 +-
 wt-status.c                 |   2 +-
 36 files changed, 557 insertions(+), 328 deletions(-)

diff --git c/branch.c w/branch.c
index ba3e1c1..adb07c6 100644
--- c/branch.c
+++ w/branch.c
@@ -186,7 +186,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
 		const char *head;
 		unsigned char sha1[20];
 
-		head = resolve_ref_unsafe("HEAD", sha1, NULL, 0);
+		head = resolve_ref_unsafe("HEAD", 0, sha1, NULL);
 		if (!is_bare_repository() && head && !strcmp(head, ref->buf))
 			die(_("Cannot force update the current branch."));
 	}
diff --git c/builtin/blame.c w/builtin/blame.c
index b8bec0a..5cbd38f 100644
--- c/builtin/blame.c
+++ w/builtin/blame.c
@@ -2292,7 +2292,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
 	commit->object.type = OBJ_COMMIT;
 	parent_tail = &commit->parents;
 
-	if (!resolve_ref_unsafe("HEAD", head_sha1, NULL, RESOLVE_REF_READING))
+	if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
 		die("no such ref: HEAD");
 
 	parent_tail = append_parent(parent_tail, head_sha1);
diff --git c/builtin/branch.c w/builtin/branch.c
index 5d5bc56..94aaea1 100644
--- c/builtin/branch.c
+++ w/builtin/branch.c
@@ -129,8 +129,8 @@ static int branch_merged(int kind, const char *name,
 		    branch->merge[0] &&
 		    branch->merge[0]->dst &&
 		    (reference_name = reference_name_to_free =
-		     resolve_refdup(branch->merge[0]->dst, sha1,
-				    NULL, RESOLVE_REF_READING)) != NULL)
+		     resolve_refdup(branch->merge[0]->dst, RESOLVE_REF_READING,
+				    sha1, NULL)) != NULL)
 			reference_rev = lookup_commit_reference(sha1);
 	}
 	if (!reference_rev)
@@ -234,13 +234,12 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 		free(name);
 
 		name = mkpathdup(fmt, bname.buf);
-		target = resolve_ref_unsafe(name, sha1, &flags,
+		target = resolve_ref_unsafe(name,
 					    RESOLVE_REF_READING
-					    | RESOLVE_REF_NODEREF
-					    | RESOLVE_REF_ALLOW_BAD_NAME);
-		if (!target ||
-		    (!(flags & (REF_ISSYMREF|REF_ISBROKEN)) &&
-		     is_null_sha1(sha1))) {
+					    | RESOLVE_REF_NO_RECURSE
+					    | RESOLVE_REF_ALLOW_BAD_NAME,
+					    sha1, &flags);
+		if (!target) {
 			error(remote_branch
 			      ? _("remote branch '%s' not found.")
 			      : _("branch '%s' not found."), bname.buf);
@@ -255,7 +254,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 			continue;
 		}
 
-		if (delete_ref(name, sha1, REF_NODEREF|REF_BADNAMEOK)) {
+		if (delete_ref(name, sha1, REF_NODEREF)) {
 			error(remote_branch
 			      ? _("Error deleting remote branch '%s'")
 			      : _("Error deleting branch '%s'"),
@@ -268,8 +267,8 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 			       ? _("Deleted remote branch %s (was %s).\n")
 			       : _("Deleted branch %s (was %s).\n"),
 			       bname.buf,
-			       (flags & REF_ISSYMREF)
-			       ? target
+			       (flags & REF_ISBROKEN) ? "broken"
+			       : (flags & REF_ISSYMREF) ? target
 			       : find_unique_abbrev(sha1, DEFAULT_ABBREV));
 		}
 		delete_branch_config(bname.buf);
@@ -301,7 +300,7 @@ static char *resolve_symref(const char *src, const char *prefix)
 	int flag;
 	const char *dst, *cp;
 
-	dst = resolve_ref_unsafe(src, sha1, &flag, 0);
+	dst = resolve_ref_unsafe(src, 0, sha1, &flag);
 	if (!(dst && (flag & REF_ISSYMREF)))
 		return NULL;
 	if (prefix && (cp = skip_prefix(dst, prefix)))
@@ -867,7 +866,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 
 	track = git_branch_track;
 
-	head = resolve_refdup("HEAD", head_sha1, NULL, 0);
+	head = resolve_refdup("HEAD", 0, head_sha1, NULL);
 	if (!head)
 		die(_("Failed to resolve HEAD as a valid ref."));
 	if (!strcmp(head, "HEAD")) {
diff --git c/builtin/checkout.c w/builtin/checkout.c
index 64af1f7..a5fef2d 100644
--- c/builtin/checkout.c
+++ w/builtin/checkout.c
@@ -356,7 +356,7 @@ static int checkout_paths(const struct checkout_opts *opts,
 	    commit_locked_index(lock_file))
 		die(_("unable to write new index file"));
 
-	read_ref_full("HEAD", rev, &flag, 0);
+	read_ref_full("HEAD", 0, rev, &flag);
 	head = lookup_commit_reference_gently(rev, 1);
 
 	errs |= post_checkout_hook(head, head, 0);
@@ -771,7 +771,7 @@ static int switch_branches(const struct checkout_opts *opts,
 	unsigned char rev[20];
 	int flag, writeout_error = 0;
 	memset(&old, 0, sizeof(old));
-	old.path = path_to_free = resolve_refdup("HEAD", rev, &flag, 0);
+	old.path = path_to_free = resolve_refdup("HEAD", 0, rev, &flag);
 	old.commit = lookup_commit_reference_gently(rev, 1);
 	if (!(flag & REF_ISSYMREF))
 		old.path = NULL;
@@ -1068,7 +1068,7 @@ static int checkout_branch(struct checkout_opts *opts,
 		unsigned char rev[20];
 		int flag;
 
-		if (!read_ref_full("HEAD", rev, &flag, 0) &&
+		if (!read_ref_full("HEAD", 0, rev, &flag) &&
 		    (flag & REF_ISSYMREF) && is_null_sha1(rev))
 			return switch_unborn_to_new_branch(opts);
 	}
diff --git c/builtin/clone.c w/builtin/clone.c
index 12a78e1..0f5c880 100644
--- c/builtin/clone.c
+++ w/builtin/clone.c
@@ -622,7 +622,7 @@ static int checkout(void)
 	if (option_no_checkout)
 		return 0;
 
-	head = resolve_refdup("HEAD", sha1, NULL, RESOLVE_REF_READING);
+	head = resolve_refdup("HEAD", RESOLVE_REF_READING, sha1, NULL);
 	if (!head) {
 		warning(_("remote HEAD refers to nonexistent ref, "
 			  "unable to checkout.\n"));
diff --git c/builtin/commit.c w/builtin/commit.c
index 3536330..9ccc78b 100644
--- c/builtin/commit.c
+++ w/builtin/commit.c
@@ -1468,7 +1468,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
 	rev.diffopt.break_opt = 0;
 	diff_setup_done(&rev.diffopt);
 
-	head = resolve_ref_unsafe("HEAD", junk_sha1, NULL, 0);
+	head = resolve_ref_unsafe("HEAD", 0, junk_sha1, NULL);
 	printf("[%s%s ",
 		starts_with(head, "refs/heads/") ?
 			head + 11 :
diff --git c/builtin/fetch.c w/builtin/fetch.c
index 2e3bc73..30b40f6 100644
--- c/builtin/fetch.c
+++ w/builtin/fetch.c
@@ -392,10 +392,10 @@ static int s_update_ref(const char *action,
 		goto fail;
 
 	ret = ref_transaction_commit(transaction, &err);
-	if (ret == UPDATE_REFS_NAME_CONFLICT)
-		df_conflict = 1;
-	if (ret)
+	if (ret) {
+		df_conflict = (ret == TRANSACTION_NAME_CONFLICT);
 		goto fail;
+	}
 
 	ref_transaction_free(transaction);
 	strbuf_release(&err);
diff --git c/builtin/fmt-merge-msg.c w/builtin/fmt-merge-msg.c
index b2355ad..afe05dc 100644
--- c/builtin/fmt-merge-msg.c
+++ w/builtin/fmt-merge-msg.c
@@ -602,7 +602,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
 
 	/* get current branch */
 	current_branch = current_branch_to_free =
-		resolve_refdup("HEAD", head_sha1, NULL, RESOLVE_REF_READING);
+		resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, NULL);
 	if (!current_branch)
 		die("No current branch");
 	if (starts_with(current_branch, "refs/heads/"))
diff --git c/builtin/for-each-ref.c w/builtin/for-each-ref.c
index 090390c..a88d681 100644
--- c/builtin/for-each-ref.c
+++ w/builtin/for-each-ref.c
@@ -649,8 +649,8 @@ static void populate_value(struct refinfo *ref)
 
 	if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
 		unsigned char unused1[20];
-		ref->symref = resolve_refdup(ref->refname, unused1,
-					     NULL, RESOLVE_REF_READING);
+		ref->symref = resolve_refdup(ref->refname, RESOLVE_REF_READING,
+					     unused1, NULL);
 		if (!ref->symref)
 			ref->symref = "";
 	}
@@ -708,8 +708,8 @@ static void populate_value(struct refinfo *ref)
 			const char *head;
 			unsigned char sha1[20];
 
-			head = resolve_ref_unsafe("HEAD", sha1,
-						  NULL, RESOLVE_REF_READING);
+			head = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+						  sha1, NULL);
 			if (!strcmp(ref->refname, head))
 				v->s = "*";
 			else
@@ -853,8 +853,7 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
 	struct refinfo *ref;
 	int cnt;
 
-	if ((flag & REF_ISBROKEN) &&
-	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+	if (flag & REF_BAD_NAME) {
 		  warning("ignoring ref with broken name %s", refname);
 		  return 0;
 	}
diff --git c/builtin/fsck.c w/builtin/fsck.c
index 506e32b..7cd109a 100644
--- c/builtin/fsck.c
+++ w/builtin/fsck.c
@@ -560,7 +560,7 @@ static int fsck_head_link(void)
 	if (verbose)
 		fprintf(stderr, "Checking HEAD link\n");
 
-	head_points_at = resolve_ref_unsafe("HEAD", head_sha1, &flag, 0);
+	head_points_at = resolve_ref_unsafe("HEAD", 0, head_sha1, &flag);
 	if (!head_points_at)
 		return error("Invalid HEAD");
 	if (!strcmp(head_points_at, "HEAD"))
diff --git c/builtin/log.c w/builtin/log.c
index 230a9ef..493440a 100644
--- c/builtin/log.c
+++ w/builtin/log.c
@@ -1395,8 +1395,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 		if (check_head) {
 			unsigned char sha1[20];
 			const char *ref;
-			ref = resolve_ref_unsafe("HEAD", sha1, NULL,
-						 RESOLVE_REF_READING);
+			ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+						 sha1, NULL);
 			if (ref && starts_with(ref, "refs/heads/"))
 				branch_name = xstrdup(ref + strlen("refs/heads/"));
 			else
diff --git c/builtin/merge.c w/builtin/merge.c
index d262279..6f56967 100644
--- c/builtin/merge.c
+++ w/builtin/merge.c
@@ -1108,7 +1108,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 	 * Check if we are _not_ on a detached HEAD, i.e. if there is a
 	 * current branch.
 	 */
-	branch = branch_to_free = resolve_refdup("HEAD", head_sha1, &flag, 0);
+	branch = branch_to_free = resolve_refdup("HEAD", 0, head_sha1, &flag);
 	if (branch && starts_with(branch, "refs/heads/"))
 		branch += 11;
 	if (!branch || is_null_sha1(head_sha1))
diff --git c/builtin/notes.c w/builtin/notes.c
index 16df78c..eaf297d 100644
--- c/builtin/notes.c
+++ w/builtin/notes.c
@@ -703,7 +703,7 @@ static int merge_commit(struct notes_merge_options *o)
 	init_notes(t, "NOTES_MERGE_PARTIAL", combine_notes_overwrite, 0);
 
 	o->local_ref = local_ref_to_free =
-		resolve_refdup("NOTES_MERGE_REF", sha1, NULL, 0);
+		resolve_refdup("NOTES_MERGE_REF", 0, sha1, NULL);
 	if (!o->local_ref)
 		die("Failed to resolve NOTES_MERGE_REF");
 
diff --git c/builtin/receive-pack.c w/builtin/receive-pack.c
index 555a4a6..8a6e7e3 100644
--- c/builtin/receive-pack.c
+++ w/builtin/receive-pack.c
@@ -656,7 +656,7 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
 	int flag;
 
 	strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
-	dst_name = resolve_ref_unsafe(buf.buf, sha1, &flag, 0);
+	dst_name = resolve_ref_unsafe(buf.buf, 0, sha1, &flag);
 	strbuf_release(&buf);
 
 	if (!(flag & REF_ISSYMREF))
@@ -817,7 +817,7 @@ static void execute_commands(struct command *commands,
 	check_aliased_updates(commands);
 
 	free(head_name_to_free);
-	head_name = head_name_to_free = resolve_refdup("HEAD", sha1, NULL, 0);
+	head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
 
 	checked_connectivity = 1;
 	for (cmd = commands; cmd; cmd = cmd->next) {
diff --git c/builtin/remote.c w/builtin/remote.c
index 6eaeee7..8517cfa 100644
--- c/builtin/remote.c
+++ w/builtin/remote.c
@@ -568,8 +568,8 @@ static int read_remote_branches(const char *refname,
 	strbuf_addf(&buf, "refs/remotes/%s/", rename->old);
 	if (starts_with(refname, buf.buf)) {
 		item = string_list_append(rename->remote_branches, xstrdup(refname));
-		symref = resolve_ref_unsafe(refname, orig_sha1, &flag,
-					    RESOLVE_REF_READING);
+		symref = resolve_ref_unsafe(refname, RESOLVE_REF_READING,
+					    orig_sha1, &flag);
 		if (flag & REF_ISSYMREF)
 			item->util = xstrdup(symref);
 		else
@@ -705,7 +705,7 @@ static int mv(int argc, const char **argv)
 		int flag = 0;
 		unsigned char sha1[20];
 
-		read_ref_full(item->string, sha1, &flag, RESOLVE_REF_READING);
+		read_ref_full(item->string, RESOLVE_REF_READING, sha1, &flag);
 		if (!(flag & REF_ISSYMREF))
 			continue;
 		if (delete_ref(item->string, NULL, REF_NODEREF))
@@ -750,13 +750,16 @@ static int mv(int argc, const char **argv)
 
 static int remove_branches(struct string_list *branches)
 {
+	struct strbuf err = STRBUF_INIT;
 	const char **branch_names;
 	int i, result = 0;
 
 	branch_names = xmalloc(branches->nr * sizeof(*branch_names));
 	for (i = 0; i < branches->nr; i++)
 		branch_names[i] = branches->items[i].string;
-	result |= repack_without_refs(branch_names, branches->nr, NULL);
+	if (repack_without_refs(branch_names, branches->nr, &err))
+		result |= error("%s", err.buf);
+	strbuf_release(&err);
 	free(branch_names);
 
 	for (i = 0; i < branches->nr; i++) {
@@ -1333,9 +1336,13 @@ static int prune_remote(const char *remote, int dry_run)
 		delete_refs = xmalloc(states.stale.nr * sizeof(*delete_refs));
 		for (i = 0; i < states.stale.nr; i++)
 			delete_refs[i] = states.stale.items[i].util;
-		if (!dry_run)
-			result |= repack_without_refs(delete_refs,
-						      states.stale.nr, NULL);
+		if (!dry_run) {
+			struct strbuf err = STRBUF_INIT;
+			if (repack_without_refs(delete_refs, states.stale.nr,
+						&err))
+				result |= error("%s", err.buf);
+			strbuf_release(&err);
+		}
 		free(delete_refs);
 	}
 
diff --git c/builtin/show-branch.c w/builtin/show-branch.c
index ef6ea52..acc8dc1 100644
--- c/builtin/show-branch.c
+++ w/builtin/show-branch.c
@@ -727,8 +727,9 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 		if (ac == 0) {
 			static const char *fake_av[2];
 
-			fake_av[0] = resolve_refdup("HEAD", sha1, NULL,
-						    RESOLVE_REF_READING);
+			fake_av[0] = resolve_refdup("HEAD",
+						    RESOLVE_REF_READING,
+						    sha1, NULL);
 			fake_av[1] = NULL;
 			av = fake_av;
 			ac = 1;
@@ -790,8 +791,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 		}
 	}
 
-	head_p = resolve_ref_unsafe("HEAD", head_sha1, NULL,
-				    RESOLVE_REF_READING);
+	head_p = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+				    head_sha1, NULL);
 	if (head_p) {
 		head_len = strlen(head_p);
 		memcpy(head, head_p, head_len + 1);
diff --git c/builtin/symbolic-ref.c w/builtin/symbolic-ref.c
index 1dd04af..29fb3f1 100644
--- c/builtin/symbolic-ref.c
+++ w/builtin/symbolic-ref.c
@@ -13,7 +13,7 @@ static int check_symref(const char *HEAD, int quiet, int shorten, int print)
 {
 	unsigned char sha1[20];
 	int flag;
-	const char *refname = resolve_ref_unsafe(HEAD, sha1, &flag, 0);
+	const char *refname = resolve_ref_unsafe(HEAD, 0, sha1, &flag);
 
 	if (!refname)
 		die("No such ref: %s", HEAD);
diff --git c/builtin/update-ref.c w/builtin/update-ref.c
index e379fdd..6c9be05 100644
--- c/builtin/update-ref.c
+++ w/builtin/update-ref.c
@@ -419,8 +419,7 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
 	if (no_deref)
 		flags = REF_NODEREF;
 	if (delete)
-		return delete_ref(refname, oldval ? oldsha1 : NULL,
-				  flags|REF_BADNAMEOK);
+		return delete_ref(refname, oldval ? oldsha1 : NULL, flags);
 	else
 		return update_ref(msg, refname, sha1, oldval ? oldsha1 : NULL,
 				  flags, UPDATE_REFS_DIE_ON_ERR);
diff --git c/bundle.c w/bundle.c
index 32dd2f7..d92e49c 100644
--- c/bundle.c
+++ w/bundle.c
@@ -311,7 +311,7 @@ int create_bundle(struct bundle_header *header, const char *path,
 			continue;
 		if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
 			continue;
-		if (read_ref_full(e->name, sha1, &flag, RESOLVE_REF_READING))
+		if (read_ref_full(e->name, RESOLVE_REF_READING, sha1, &flag))
 			flag = 0;
 		display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
 
diff --git c/cache.h w/cache.h
index 995729f..f582b6c 100644
--- c/cache.h
+++ w/cache.h
@@ -946,8 +946,8 @@ extern int for_each_abbrev(const char *prefix, each_abbrev_fn, void *);
 extern int get_sha1_hex(const char *hex, unsigned char *sha1);
 
 extern char *sha1_to_hex(const unsigned char *sha1);	/* static buffer result! */
-extern int read_ref_full(const char *refname, unsigned char *sha1,
-			 int *flags, int resolve_flags);
+extern int read_ref_full(const char *refname, int resolve_flags,
+			 unsigned char *sha1, int *flags);
 extern int read_ref(const char *refname, unsigned char *sha1);
 
 /*
@@ -969,27 +969,36 @@ extern int read_ref(const char *refname, unsigned char *sha1);
  *   "writing" to the ref, the return value is the name of the ref
  *   that will actually be created or changed.
  *
+ * If the RESOLVE_REF_NO_RECURSE flag is passed, only resolves one
+ * level of symbolic reference.  The value stored in sha1 for a symbolic
+ * reference will always be null_sha1 in this case, and the return
+ * value is the reference that the symref refers to directly.
+ *
  * If flags is non-NULL, set the value that it points to the
  * combination of REF_ISPACKED (if the reference was found among the
  * packed references), REF_ISSYMREF (if the initial reference was a
- * symbolic reference) and REF_ISBROKEN (if the ref is malformed).
+ * symbolic reference), REF_BAD_NAME (if the reference name is ill
+ * formed --- see RESOLVE_REF_ALLOW_BAD_NAME below), and REF_ISBROKEN
+ * (if the ref is malformed).
  *
  * If ref is not a properly-formatted, normalized reference, return
  * NULL.  If more than MAXDEPTH recursive symbolic lookups are needed,
  * give up and return NULL.
  *
- * RESOLVE_REF_ALLOW_BAD_NAME disables most of the ref name checking except
- * for names that are absolute paths or contain ".." components. For both
- * these cases the function will return NULL and set errno to EINVAL.
- * If the name is bad then the function will set the REF_ISBROKEN flag and
- * return the name, if the ref exists, or NULL, if it does not.
- * When this flag is set, any badly named refs will resolve to nullsha1.
+ * RESOLVE_REF_ALLOW_BAD_NAME allows resolving refs even when their
+ * name is invalid according to git-check-ref-format(1).  If the name
+ * is bad then the value stored in sha1 will be null_sha1 and the
+ * REF_ISBROKEN and REF_BAD_NAME flags will be set.
+ *
+ * Even with RESOLVE_REF_ALLOW_BAD_NAME, names that escape the refs/
+ * directory and do not consist of all caps and underscores cannot be
+ * resolved.  The function returns NULL for such ref names.
  */
 #define RESOLVE_REF_READING 0x01
-#define RESOLVE_REF_NODEREF 0x02
+#define RESOLVE_REF_NO_RECURSE 0x02
 #define RESOLVE_REF_ALLOW_BAD_NAME 0x04
-extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int *flags, int resolve_flags);
-extern char *resolve_refdup(const char *ref, unsigned char *sha1, int *flags, int resolve_flags);
+extern const char *resolve_ref_unsafe(const char *ref, int resolve_flags, unsigned char *sha1, int *flags);
+extern char *resolve_refdup(const char *ref, int resolve_flags, unsigned char *sha1, int *flags);
 
 extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref);
 extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
diff --git c/http-backend.c w/http-backend.c
index 8f94f9b..e172886 100644
--- c/http-backend.c
+++ w/http-backend.c
@@ -417,8 +417,9 @@ static int show_head_ref(const char *refname, const unsigned char *sha1,
 
 	if (flag & REF_ISSYMREF) {
 		unsigned char unused[20];
-		const char *target = resolve_ref_unsafe(refname, unused,
-						NULL, RESOLVE_REF_READING);
+		const char *target = resolve_ref_unsafe(refname,
+							RESOLVE_REF_READING,
+							unused, NULL);
 		const char *target_nons = strip_namespace(target);
 
 		strbuf_addf(buf, "ref: %s\n", target_nons);
diff --git c/notes-merge.c w/notes-merge.c
index ffca602..3c88d17 100644
--- c/notes-merge.c
+++ w/notes-merge.c
@@ -549,7 +549,7 @@ int notes_merge(struct notes_merge_options *o,
 	       o->local_ref, o->remote_ref);
 
 	/* Dereference o->local_ref into local_sha1 */
-	if (read_ref_full(o->local_ref, local_sha1, NULL, 0))
+	if (read_ref_full(o->local_ref, 0, local_sha1, NULL))
 		die("Failed to resolve local notes ref '%s'", o->local_ref);
 	else if (!check_refname_format(o->local_ref, 0) &&
 		is_null_sha1(local_sha1))
diff --git c/reflog-walk.c w/reflog-walk.c
index feeaf0a..23345ea 100644
--- c/reflog-walk.c
+++ w/reflog-walk.c
@@ -48,8 +48,8 @@ static struct complete_reflogs *read_complete_reflog(const char *ref)
 		unsigned char sha1[20];
 		const char *name;
 		void *name_to_free;
-		name = name_to_free = resolve_refdup(ref, sha1, NULL,
-						     RESOLVE_REF_READING);
+		name = name_to_free = resolve_refdup(ref, RESOLVE_REF_READING,
+						     sha1, NULL);
 		if (name) {
 			for_each_reflog_ent(name, read_one_reflog, reflogs);
 			free(name_to_free);
@@ -175,7 +175,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
 		if (*branch == '\0') {
 			unsigned char sha1[20];
 			free(branch);
-			branch = resolve_refdup("HEAD", sha1, NULL, 0);
+			branch = resolve_refdup("HEAD", 0, sha1, NULL);
 			if (!branch)
 				die ("No current branch");
 
diff --git c/refs.c w/refs.c
index 3b27758..d9d327d 100644
--- c/refs.c
+++ w/refs.c
@@ -69,16 +69,8 @@ static int check_refname_component(const char *refname, int flags)
 out:
 	if (cp == refname)
 		return 0; /* Component has zero length. */
-	if (refname[0] == '.') {
-		if (!(flags & REFNAME_DOT_COMPONENT))
-			return -1; /* Component starts with '.'. */
-		/*
-		 * Even if leading dots are allowed, don't allow "."
-		 * as a component (".." is prevented by a rule above).
-		 */
-		if (refname[1] == '\0')
-			return -1; /* Component equals ".". */
-	}
+	if (refname[0] == '.')
+		return -1; /* Component starts with '.'. */
 	if (cp - refname >= 5 && !memcmp(cp - 5, ".lock", 5))
 		return -1; /* Refname ends with ".lock". */
 	return cp - refname;
@@ -193,8 +185,8 @@ struct ref_dir {
 
 /*
  * Bit values for ref_entry::flag.  REF_ISSYMREF=0x01,
- * REF_ISPACKED=0x02, and REF_ISBROKEN=0x04 are public values; see
- * refs.h.
+ * REF_ISPACKED=0x02, REF_ISBROKEN=0x04 and REF_BAD_NAME=0x08 are
+ * public values; see refs.h.
  */
 
 /*
@@ -202,16 +194,16 @@ struct ref_dir {
  * the correct peeled value for the reference, which might be
  * null_sha1 if the reference is not a tag or if it is broken.
  */
-#define REF_KNOWS_PEELED 0x08
+#define REF_KNOWS_PEELED 0x10
 
 /* ref_entry represents a directory of references */
-#define REF_DIR 0x10
+#define REF_DIR 0x20
 
 /*
  * Entry has not yet been read from disk (used only for REF_DIR
  * entries representing loose references)
  */
-#define REF_INCOMPLETE 0x20
+#define REF_INCOMPLETE 0x40
 
 /*
  * A ref_entry represents either a reference or a "subdirectory" of
@@ -280,6 +272,37 @@ static struct ref_dir *get_ref_dir(struct ref_entry *entry)
 	return dir;
 }
 
+static int escapes_cwd(const char *path) {
+	char *buf;
+	int result;
+
+	if (is_absolute_path(path))
+		return 1;
+	buf = xmalloc(strlen(path) + 1);
+	result = !!normalize_path_copy(buf, path);
+	free(buf);
+	return result;
+}
+
+/*
+ * Check if a refname is safe.
+ * For refs that start with "refs/" we consider it safe as long as the rest
+ * of the path components does not allow it to escape from this directory.
+ * For all other refs we only consider them safe iff they only contain
+ * upper case characters and '_'.
+ */
+static int refname_is_safe(const char *refname)
+{
+	if (starts_with(refname, "refs/"))
+		return !escapes_cwd(refname + strlen("refs/"));
+	while (*refname) {
+		if (!isupper(*refname) && *refname != '_')
+			return 0;
+		refname++;
+	}
+	return 1;
+}
+
 static struct ref_entry *create_ref_entry(const char *refname,
 					  const unsigned char *sha1, int flag,
 					  int check_name)
@@ -288,8 +311,10 @@ static struct ref_entry *create_ref_entry(const char *refname,
 	struct ref_entry *ref;
 
 	if (check_name &&
-	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT))
+	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
 		die("Reference has invalid format: '%s'", refname);
+	if (!check_name && !refname_is_safe(refname))
+		die("Reference has invalid name: '%s'", refname);
 	len = strlen(refname) + 1;
 	ref = xmalloc(sizeof(struct ref_entry) + len);
 	hashcpy(ref->u.value.sha1, sha1);
@@ -822,10 +847,9 @@ static int name_conflict_fn(struct ref_entry *entry, void *cb_data)
 /*
  * Return true iff a reference named refname could be created without
  * conflicting with the name of an existing reference in dir.  If
- * oldrefname is non-NULL, ignore potential conflicts with oldrefname
- * (e.g., because oldrefname is scheduled for deletion in the same
- * operation). skiplist contains a list of refs we want to skip checking for
- * conflicts with. skiplist must be sorted.
+ * skiplist is non-NULL, ignore potential conflicts with names in
+ * skiplist (e.g., because those refs are scheduled for deletion in
+ * the same operation).  skiplist must be sorted.
  */
 static int is_refname_available(const char *refname,
 				struct ref_dir *dir,
@@ -1062,9 +1086,9 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir)
 		if (refname) {
 			int flag = REF_ISPACKED;
 
-			if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) {
-				flag |= REF_ISBROKEN;
+			if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
 				hashclr(sha1);
+				flag |= REF_BAD_NAME | REF_ISBROKEN;
 			}
 			last = create_ref_entry(refname, sha1, flag, 0);
 			if (peeled == PEELED_FULLY ||
@@ -1198,16 +1222,16 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
 					hashclr(sha1);
 					flag |= REF_ISBROKEN;
 				}
-			} else if (read_ref_full(refname.buf, sha1, &flag,
-						 RESOLVE_REF_READING)) {
+			} else if (read_ref_full(refname.buf,
+						 RESOLVE_REF_READING,
+						 sha1, &flag)) {
 				hashclr(sha1);
 				flag |= REF_ISBROKEN;
 			}
 			if (check_refname_format(refname.buf,
-						 REFNAME_ALLOW_ONELEVEL|
-						 REFNAME_DOT_COMPONENT)) {
+						 REFNAME_ALLOW_ONELEVEL)) {
 				hashclr(sha1);
-				flag |= REF_ISBROKEN;
+				flag |= REF_BAD_NAME | REF_ISBROKEN;
 			}
 			add_entry_to_dir(dir,
 					 create_ref_entry(refname.buf, sha1, flag, 0));
@@ -1329,10 +1353,10 @@ static struct ref_entry *get_packed_ref(const char *refname)
  * A loose ref file doesn't exist; check for a packed ref.  The
  * options are forwarded from resolve_safe_unsafe().
  */
-static const char *handle_missing_loose_ref(const char *refname,
-					    unsigned char *sha1,
-					    int reading,
-					    int *flag)
+static int resolve_missing_loose_ref(const char *refname,
+				     int resolve_flags,
+				     unsigned char *sha1,
+				     int *flags)
 {
 	struct ref_entry *entry;
 
@@ -1343,33 +1367,22 @@ static const char *handle_missing_loose_ref(const char *refname,
 	entry = get_packed_ref(refname);
 	if (entry) {
 		hashcpy(sha1, entry->u.value.sha1);
-		if (flag)
-			*flag |= REF_ISPACKED;
-		return refname;
+		if (flags)
+			*flags |= REF_ISPACKED;
+		return 0;
 	}
 	/* The reference is not a packed reference, either. */
-	if (reading) {
-		return NULL;
+	if (resolve_flags & RESOLVE_REF_READING) {
+		errno = ENOENT;
+		return -1;
 	} else {
 		hashclr(sha1);
-		return refname;
+		return 0;
 	}
 }
 
-static int escapes_cwd(const char *path) {
-	char *buf;
-	int result;
-
-	if (is_absolute_path(path))
-		return 1;
-	buf = xmalloc(strlen(path) + 1);
-	result = normalize_path_copy(buf, path);
-	free(buf);
-	return result;
-}
-
 /* This function needs to return a meaningful errno on failure */
-const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int *flags, int resolve_flags)
+const char *resolve_ref_unsafe(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
 {
 	int depth = MAXDEPTH;
 	ssize_t len;
@@ -1381,14 +1394,22 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int *fl
 		*flags = 0;
 
 	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+		if (flags)
+			*flags |= REF_BAD_NAME;
+
 		if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
-		    escapes_cwd(refname)) {
+		    !refname_is_safe(refname)) {
 			errno = EINVAL;
 			return NULL;
 		}
-		hashclr(sha1);
-		if (flags)
-			*flags |= REF_ISBROKEN;
+		/*
+		 * dwim_ref() uses REF_ISBROKEN to distinguish between
+		 * missing refs and refs that were present but invalid,
+		 * to complain about the latter to stderr.
+		 *
+		 * We don't know whether the ref exists, so don't set
+		 * REF_ISBROKEN yet.
+		 */
 		bad_name = 1;
 	}
 	for (;;) {
@@ -1415,12 +1436,17 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int *fl
 		 */
 	stat_ref:
 		if (lstat(path, &st) < 0) {
-			if (errno == ENOENT)
-				return handle_missing_loose_ref(refname, sha1,
-					resolve_flags & RESOLVE_REF_READING,
-					flags);
-			else
+			if (errno != ENOENT)
 				return NULL;
+			if (resolve_missing_loose_ref(refname, resolve_flags,
+						      sha1, flags))
+				return NULL;
+			if (bad_name) {
+				hashclr(sha1);
+				if (flags)
+					*flags |= REF_ISBROKEN;
+			}
+			return refname;
 		}
 
 		/* Follow "normalized" - ie "refs/.." symlinks by hand */
@@ -1440,7 +1466,7 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int *fl
 				refname = refname_buffer;
 				if (flags)
 					*flags |= REF_ISSYMREF;
-				if (resolve_flags & RESOLVE_REF_NODEREF) {
+				if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
 					hashclr(sha1);
 					return refname;
 				}
@@ -1493,8 +1519,11 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int *fl
 				errno = EINVAL;
 				return NULL;
 			}
-			if (bad_name)
+			if (bad_name) {
 				hashclr(sha1);
+				if (flags)
+					*flags |= REF_ISBROKEN;
+			}
 			return refname;
 		}
 		if (flags)
@@ -1502,23 +1531,28 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int *fl
 		buf = buffer + 4;
 		while (isspace(*buf))
 			buf++;
-		if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
-			if (flags)
-				*flags |= REF_ISBROKEN;
-			errno = EINVAL;
-			return NULL;
-		}
 		refname = strcpy(refname_buffer, buf);
-		if (resolve_flags & RESOLVE_REF_NODEREF) {
+		if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
 			hashclr(sha1);
 			return refname;
 		}
+		if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
+			if (flags)
+				*flags |= REF_BAD_NAME | REF_ISBROKEN;
+
+			if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
+			    !refname_is_safe(buf)) {
+				errno = EINVAL;
+				return NULL;
+			}
+			bad_name = 1;
+		}
 	}
 }
 
-char *resolve_refdup(const char *ref, unsigned char *sha1, int *flags, int resolve_flags)
+char *resolve_refdup(const char *ref, int resolve_flags, unsigned char *sha1, int *flags)
 {
-	const char *ret = resolve_ref_unsafe(ref, sha1, flags, resolve_flags);
+	const char *ret = resolve_ref_unsafe(ref, resolve_flags, sha1, flags);
 	return ret ? xstrdup(ret) : NULL;
 }
 
@@ -1529,22 +1563,22 @@ struct ref_filter {
 	void *cb_data;
 };
 
-int read_ref_full(const char *refname, unsigned char *sha1, int *flags, int resolve_flags)
+int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
 {
-	if (resolve_ref_unsafe(refname, sha1, flags, resolve_flags))
+	if (resolve_ref_unsafe(refname, resolve_flags, sha1, flags))
 		return 0;
 	return -1;
 }
 
 int read_ref(const char *refname, unsigned char *sha1)
 {
-	return read_ref_full(refname, sha1, NULL, RESOLVE_REF_READING);
+	return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
 }
 
 int ref_exists(const char *refname)
 {
 	unsigned char sha1[20];
-	return !!resolve_ref_unsafe(refname, sha1, NULL, RESOLVE_REF_READING);
+	return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
 }
 
 static int filter_refs(const char *refname, const unsigned char *sha1, int flags,
@@ -1658,7 +1692,7 @@ int peel_ref(const char *refname, unsigned char *sha1)
 		return 0;
 	}
 
-	if (read_ref_full(refname, base, &flag, RESOLVE_REF_READING))
+	if (read_ref_full(refname, RESOLVE_REF_READING, base, &flag))
 		return -1;
 
 	/*
@@ -1699,7 +1733,7 @@ static int warn_if_dangling_symref(const char *refname, const unsigned char *sha
 	if (!(flags & REF_ISSYMREF))
 		return 0;
 
-	resolves_to = resolve_ref_unsafe(refname, junk, NULL, 0);
+	resolves_to = resolve_ref_unsafe(refname, 0, junk, NULL);
 	if (!resolves_to
 	    || (d->refname
 		? strcmp(resolves_to, d->refname)
@@ -1824,7 +1858,7 @@ static int do_head_ref(const char *submodule, each_ref_fn fn, void *cb_data)
 		return 0;
 	}
 
-	if (!read_ref_full("HEAD", sha1, &flag, RESOLVE_REF_READING))
+	if (!read_ref_full("HEAD", RESOLVE_REF_READING, sha1, &flag))
 		return fn("HEAD", sha1, flag, cb_data);
 
 	return 0;
@@ -1904,7 +1938,7 @@ int head_ref_namespaced(each_ref_fn fn, void *cb_data)
 	int flag;
 
 	strbuf_addf(&buf, "%sHEAD", get_git_namespace());
-	if (!read_ref_full(buf.buf, sha1, &flag, RESOLVE_REF_READING))
+	if (!read_ref_full(buf.buf, RESOLVE_REF_READING, sha1, &flag))
 		ret = fn(buf.buf, sha1, flag, cb_data);
 	strbuf_release(&buf);
 
@@ -1999,8 +2033,9 @@ int refname_match(const char *abbrev_name, const char *full_name)
 static struct ref_lock *verify_lock(struct ref_lock *lock,
 	const unsigned char *old_sha1, int mustexist)
 {
-	if (read_ref_full(lock->ref_name, lock->old_sha1, NULL,
-			  mustexist ? RESOLVE_REF_READING : 0)) {
+	if (read_ref_full(lock->ref_name,
+			  mustexist ? RESOLVE_REF_READING : 0,
+			  lock->old_sha1, NULL)) {
 		int save_errno = errno;
 		error("Can't verify ref %s", lock->ref_name);
 		unlock_ref(lock);
@@ -2073,8 +2108,8 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
 
 		this_result = refs_found ? sha1_from_ref : sha1;
 		mksnpath(fullref, sizeof(fullref), *p, len, str);
-		r = resolve_ref_unsafe(fullref, this_result, &flag,
-				       RESOLVE_REF_READING);
+		r = resolve_ref_unsafe(fullref, RESOLVE_REF_READING,
+				       this_result, &flag);
 		if (r) {
 			if (!refs_found++)
 				*ref = xstrdup(r);
@@ -2103,7 +2138,8 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
 		const char *ref, *it;
 
 		mksnpath(path, sizeof(path), *p, len, str);
-		ref = resolve_ref_unsafe(path, hash, NULL, RESOLVE_REF_READING);
+		ref = resolve_ref_unsafe(path, RESOLVE_REF_READING,
+					 hash, NULL);
 		if (!ref)
 			continue;
 		if (reflog_exists(path))
@@ -2145,16 +2181,16 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 	lock = xcalloc(1, sizeof(struct ref_lock));
 	lock->lock_fd = -1;
 
-	if (flags & REF_BADNAMEOK)
-		resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
-
 	if (mustexist)
 		resolve_flags |= RESOLVE_REF_READING;
-	if (flags & REF_NODEREF)
-		resolve_flags |= RESOLVE_REF_NODEREF;
+	if (flags & REF_DELETING) {
+		resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
+		if (flags & REF_NODEREF)
+			resolve_flags |= RESOLVE_REF_NO_RECURSE;
+	}
 
-	refname = resolve_ref_unsafe(refname, lock->old_sha1, &type,
-				     resolve_flags);
+	refname = resolve_ref_unsafe(refname, resolve_flags,
+				     lock->old_sha1, &type);
 	if (!refname && errno == EISDIR) {
 		/* we are trying to lock foo but we used to
 		 * have foo/bar which now does not exist;
@@ -2167,8 +2203,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 			error("there are still refs under '%s'", orig_refname);
 			goto error_return;
 		}
-		refname = resolve_ref_unsafe(orig_refname, lock->old_sha1,
-					     &type, resolve_flags);
+		refname = resolve_ref_unsafe(orig_refname, resolve_flags,
+					     lock->old_sha1, &type);
 	}
 	if (type_p)
 	    *type_p = type;
@@ -2521,7 +2557,7 @@ static int curate_packed_ref_fn(struct ref_entry *entry, void *cb_data)
 		unsigned char sha1[20];
 		int flags;
 
-		if (read_ref_full(entry->name, sha1, &flags, 0))
+		if (read_ref_full(entry->name, 0, sha1, &flags))
 			/* We should at least have found the packed ref. */
 			die("Internal error");
 		if ((flags & REF_ISSYMREF) || !(flags & REF_ISPACKED)) {
@@ -2712,8 +2748,8 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 	if (log && S_ISLNK(loginfo.st_mode))
 		return error("reflog for %s is a symlink", oldrefname);
 
-	symref = resolve_ref_unsafe(oldrefname, orig_sha1, &flag,
-				    RESOLVE_REF_READING);
+	symref = resolve_ref_unsafe(oldrefname, RESOLVE_REF_READING,
+				    orig_sha1, &flag);
 	if (flag & REF_ISSYMREF)
 		return error("refname %s is a symbolic ref, renaming it is not supported",
 			oldrefname);
@@ -2742,7 +2778,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 		goto rollback;
 	}
 
-	if (!read_ref_full(newrefname, sha1, NULL, RESOLVE_REF_READING) &&
+	if (!read_ref_full(newrefname, RESOLVE_REF_READING, sha1, NULL) &&
 	    delete_ref(newrefname, sha1, REF_NODEREF)) {
 		if (errno==EISDIR) {
 			if (remove_empty_directories(git_path("%s", newrefname))) {
@@ -2956,7 +2992,7 @@ static int is_branch(const char *refname)
 }
 
 /*
- * Writes sha1 into the ref specified by the lock. Makes sure that errno
+ * Write sha1 into the ref specified by the lock. Make sure that errno
  * is sane on error.
  */
 static int write_ref_sha1(struct ref_lock *lock,
@@ -3020,8 +3056,8 @@ static int write_ref_sha1(struct ref_lock *lock,
 		unsigned char head_sha1[20];
 		int head_flag;
 		const char *head_ref;
-		head_ref = resolve_ref_unsafe("HEAD", head_sha1, &head_flag,
-					      RESOLVE_REF_READING);
+		head_ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+					      head_sha1, &head_flag);
 		if (head_ref && (head_flag & REF_ISSYMREF) &&
 		    !strcmp(head_ref, lock->ref_name))
 			log_ref_write("HEAD", lock->old_sha1, sha1, logmsg);
@@ -3388,7 +3424,7 @@ static int do_for_each_reflog(struct strbuf *name, each_ref_fn fn, void *cb_data
 				retval = do_for_each_reflog(name, fn, cb_data);
 			} else {
 				unsigned char sha1[20];
-				if (read_ref_full(name->buf, sha1, NULL, 0))
+				if (read_ref_full(name->buf, 0, sha1, NULL))
 					retval = error("bad ref for %s", name->buf);
 				else
 					retval = fn(name->buf, sha1, 0, cb_data);
@@ -3667,27 +3703,30 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 	/* Copy, sort, and reject duplicate refs */
 	qsort(updates, n, sizeof(*updates), ref_update_compare);
 	if (ref_update_reject_duplicates(updates, n, err)) {
-		ret = -1;
+		ret = TRANSACTION_GENERIC_ERROR;
 		goto cleanup;
 	}
 
 	/* Acquire all locks while verifying old values */
 	for (i = 0; i < n; i++) {
 		struct ref_update *update = updates[i];
+		int flags = update->flags;
 
+		if (is_null_sha1(update->new_sha1))
+			flags |= REF_DELETING;
 		update->lock = lock_ref_sha1_basic(update->refname,
 						   (update->have_old ?
 						    update->old_sha1 :
 						    NULL),
 						   NULL,
-						   update->flags,
+						   flags,
 						   &update->type);
 		if (!update->lock) {
-			int df_conflict = (errno == ENOTDIR);
-
+			ret = (errno == ENOTDIR)
+				? TRANSACTION_NAME_CONFLICT
+				: TRANSACTION_GENERIC_ERROR;
 			strbuf_addf(err, "Cannot lock the ref '%s'.",
 				    update->refname);
-			ret = df_conflict ? UPDATE_REFS_NAME_CONFLICT : -1;
 			goto cleanup;
 		}
 	}
@@ -3697,15 +3736,15 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 		struct ref_update *update = updates[i];
 
 		if (!is_null_sha1(update->new_sha1)) {
-			ret = write_ref_sha1(update->lock, update->new_sha1,
-					     update->msg);
-			update->lock = NULL; /* freed by write_ref_sha1 */
-			if (ret) {
+			if (write_ref_sha1(update->lock, update->new_sha1,
+					   update->msg)) {
+				update->lock = NULL; /* freed by write_ref_sha1 */
 				strbuf_addf(err, "Cannot update the ref '%s'.",
 					    update->refname);
-				ret = -1;
+				ret = TRANSACTION_GENERIC_ERROR;
 				goto cleanup;
 			}
+			update->lock = NULL; /* freed by write_ref_sha1 */
 		}
 	}
 
@@ -3715,7 +3754,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 
 		if (update->lock) {
 			if (delete_ref_loose(update->lock, update->type, err)) {
-				ret = -1;
+				ret = TRANSACTION_GENERIC_ERROR;
 				goto cleanup;
 			}
 
@@ -3725,7 +3764,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 	}
 
 	if (repack_without_refs(delnames, delnum, err)) {
-		ret = -1;
+		ret = TRANSACTION_GENERIC_ERROR;
 		goto cleanup;
 	}
 	for (i = 0; i < delnum; i++)
diff --git c/refs.h w/refs.h
index a96e174..3b35387 100644
--- c/refs.h
+++ w/refs.h
@@ -56,11 +56,15 @@ struct ref_transaction;
 
 /*
  * Reference cannot be resolved to an object name: dangling symbolic
- * reference (directly or indirectly), corrupt reference file, or
- * symbolic reference refers to ill-formatted reference name.
+ * reference (directly or indirectly), corrupt reference file,
+ * reference exists but name is bad, or symbolic reference refers to
+ * ill-formatted reference name.
  */
 #define REF_ISBROKEN 0x04
 
+/* Reference name is not well formed (see git-check-ref-format(1)). */
+#define REF_BAD_NAME 0x08
+
 /*
  * The signature for the callback function for the for_each_*()
  * functions below.  The memory pointed to by the refname and sha1
@@ -175,12 +179,12 @@ extern int peel_ref(const char *refname, unsigned char *sha1);
  * ref_transaction_create(), etc.
  * REF_NODEREF: act on the ref directly, instead of dereferencing
  *              symbolic references.
- * REF_BADNAMEOK: allow locking a ref that has a bad name.
+ * REF_DELETING: tolerate broken refs
  *
  * Flags >= 0x100 are reserved for internal use.
  */
 #define REF_NODEREF	0x01
-#define REF_BADNAMEOK	0x02
+#define REF_DELETING	0x02
 /*
  * This function sets errno to something meaningful on failure.
  */
@@ -226,7 +230,6 @@ extern int for_each_reflog(each_ref_fn, void *);
 
 #define REFNAME_ALLOW_ONELEVEL 1
 #define REFNAME_REFSPEC_PATTERN 2
-#define REFNAME_DOT_COMPONENT 4
 
 /*
  * Return 0 iff refname has the correct format for a refname according
@@ -234,10 +237,7 @@ extern int for_each_reflog(each_ref_fn, void *);
  * If REFNAME_ALLOW_ONELEVEL is set in flags, then accept one-level
  * reference names.  If REFNAME_REFSPEC_PATTERN is set in flags, then
  * allow a "*" wildcard character in place of one of the name
- * components.  No leading or repeated slashes are accepted.  If
- * REFNAME_DOT_COMPONENT is set in flags, then allow refname
- * components to start with "." (but not a whole component equal to
- * "." or "..").
+ * components.  No leading or repeated slashes are accepted.
  */
 extern int check_refname_format(const char *refname, int flags);
 
@@ -270,8 +270,8 @@ struct ref_transaction *ref_transaction_begin(struct strbuf *err);
  * The following functions add a reference check or update to a
  * ref_transaction.  In all of them, refname is the name of the
  * reference to be affected.  The functions make internal copies of
- * refname, so the caller retains ownership of the parameter.  flags
- * can be REF_NODEREF; it is passed to update_ref_lock().
+ * refname and msg, so the caller retains ownership of these parameters.
+ * flags can be REF_NODEREF; it is passed to update_ref_lock().
  */
 
 /*
@@ -322,14 +322,14 @@ int ref_transaction_delete(struct ref_transaction *transaction,
 
 /*
  * Commit all of the changes that have been queued in transaction, as
- * atomically as possible.  Return a nonzero value if there is a
- * problem.
+ * atomically as possible.
  *
- * Function returns 0 on success, -1 for generic failures and
- * UPDATE_REFS_NAME_CONFLICT (-2) if the failure was due to a naming conflict.
- * For example, the ref names A and A/B conflict.
+ * Returns 0 for success, or one of the below error codes for errors.
  */
-#define UPDATE_REFS_NAME_CONFLICT -2
+/* Naming conflict (for example, the ref names A and A/B conflict). */
+#define TRANSACTION_NAME_CONFLICT -1
+/* All other errors. */
+#define TRANSACTION_GENERIC_ERROR -2
 int ref_transaction_commit(struct ref_transaction *transaction,
 			   struct strbuf *err);
 
diff --git c/remote.c w/remote.c
index 67c375d..25b07ac 100644
--- c/remote.c
+++ w/remote.c
@@ -486,7 +486,7 @@ static void read_config(void)
 		return;
 	default_remote_name = "origin";
 	current_branch = NULL;
-	head_ref = resolve_ref_unsafe("HEAD", sha1, &flag, 0);
+	head_ref = resolve_ref_unsafe("HEAD", 0, sha1, &flag);
 	if (head_ref && (flag & REF_ISSYMREF) &&
 	    starts_with(head_ref, "refs/heads/")) {
 		current_branch =
@@ -1121,8 +1121,8 @@ static char *guess_ref(const char *name, struct ref *peer)
 	struct strbuf buf = STRBUF_INIT;
 	unsigned char sha1[20];
 
-	const char *r = resolve_ref_unsafe(peer->name, sha1, NULL,
-					   RESOLVE_REF_READING);
+	const char *r = resolve_ref_unsafe(peer->name, RESOLVE_REF_READING,
+					   sha1, NULL);
 	if (!r)
 		return NULL;
 
@@ -1183,8 +1183,9 @@ static int match_explicit(struct ref *src, struct ref *dst,
 		unsigned char sha1[20];
 		int flag;
 
-		dst_value = resolve_ref_unsafe(matched_src->name, sha1, &flag,
-					       RESOLVE_REF_READING);
+		dst_value = resolve_ref_unsafe(matched_src->name,
+					       RESOLVE_REF_READING,
+					       sha1, &flag);
 		if (!dst_value ||
 		    ((flag & REF_ISSYMREF) &&
 		     !starts_with(dst_value, "refs/heads/")))
@@ -1658,7 +1659,7 @@ static int ignore_symref_update(const char *refname)
 	unsigned char sha1[20];
 	int flag;
 
-	if (!resolve_ref_unsafe(refname, sha1, &flag, 0))
+	if (!resolve_ref_unsafe(refname, 0, sha1, &flag))
 		return 0; /* non-existing refs are OK */
 	return (flag & REF_ISSYMREF);
 }
diff --git c/sequencer.c w/sequencer.c
index 6a05ad4..70fb7a8 100644
--- c/sequencer.c
+++ w/sequencer.c
@@ -366,7 +366,7 @@ static int is_index_unchanged(void)
 	unsigned char head_sha1[20];
 	struct commit *head_commit;
 
-	if (!resolve_ref_unsafe("HEAD", head_sha1, NULL, RESOLVE_REF_READING))
+	if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
 		return error(_("Could not resolve HEAD commit\n"));
 
 	head_commit = lookup_commit(head_sha1);
@@ -912,7 +912,7 @@ static int rollback_single_pick(void)
 	if (!file_exists(git_path("CHERRY_PICK_HEAD")) &&
 	    !file_exists(git_path("REVERT_HEAD")))
 		return error(_("no cherry-pick or revert in progress"));
-	if (read_ref_full("HEAD", head_sha1, NULL, 0))
+	if (read_ref_full("HEAD", 0, head_sha1, NULL))
 		return error(_("cannot resolve HEAD"));
 	if (is_null_sha1(head_sha1))
 		return error(_("cannot abort from a branch yet to be born"));
diff --git c/t/t1400-update-ref.sh w/t/t1400-update-ref.sh
index ff4607b..7b4707b 100755
--- c/t/t1400-update-ref.sh
+++ w/t/t1400-update-ref.sh
@@ -126,6 +126,16 @@ test_expect_success 'update-ref --no-deref -d can delete self-reference' '
 	test_path_is_missing .git/refs/heads/self
 '
 
+test_expect_success 'update-ref --no-deref -d can delete reference to bad ref' '
+	>.git/refs/heads/bad &&
+	test_when_finished "rm -f .git/refs/heads/bad" &&
+	git symbolic-ref refs/heads/ref-to-bad refs/heads/bad &&
+	test_when_finished "rm -f .git/refs/heads/ref-to-bad" &&
+	test_path_is_file .git/refs/heads/ref-to-bad &&
+	git update-ref --no-deref -d refs/heads/ref-to-bad &&
+	test_path_is_missing .git/refs/heads/ref-to-bad
+'
+
 test_expect_success '(not) create HEAD with old sha1' "
 	test_must_fail git update-ref HEAD $A $B
 "
@@ -390,12 +400,6 @@ test_expect_success 'stdin fails create with no ref' '
 	grep "fatal: create: missing <ref>" err
 '
 
-test_expect_success 'stdin fails create with bad ref name' '
-	echo "create ~a $m" >stdin &&
-	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
-'
-
 test_expect_success 'stdin fails create with no new value' '
 	echo "create $a" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
@@ -414,12 +418,6 @@ test_expect_success 'stdin fails update with no ref' '
 	grep "fatal: update: missing <ref>" err
 '
 
-test_expect_success 'stdin fails update with bad ref name' '
-	echo "update ~a $m" >stdin &&
-	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
-'
-
 test_expect_success 'stdin fails update with no new value' '
 	echo "update $a" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
@@ -438,12 +436,6 @@ test_expect_success 'stdin fails delete with no ref' '
 	grep "fatal: delete: missing <ref>" err
 '
 
-test_expect_success 'stdin fails delete with bad ref name' '
-	echo "delete ~a $m" >stdin &&
-	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
-'
-
 test_expect_success 'stdin fails delete with too many arguments' '
 	echo "delete $a $m $m" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
@@ -716,12 +708,6 @@ test_expect_success 'stdin -z fails create with no ref' '
 	grep "fatal: create: missing <ref>" err
 '
 
-test_expect_success 'stdin -z fails create with bad ref name' '
-	printf $F "create ~a " "$m" >stdin &&
-	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a " err
-'
-
 test_expect_success 'stdin -z fails create with no new value' '
 	printf $F "create $a" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
@@ -746,12 +732,6 @@ test_expect_success 'stdin -z fails update with too few args' '
 	grep "fatal: update $a: unexpected end of input when reading <oldvalue>" err
 '
 
-test_expect_success 'stdin -z fails update with bad ref name' '
-	printf $F "update ~a" "$m" "" >stdin &&
-	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
-'
-
 test_expect_success 'stdin -z emits warning with empty new value' '
 	git update-ref $a $m &&
 	printf $F "update $a" "" "" >stdin &&
@@ -784,12 +764,6 @@ test_expect_success 'stdin -z fails delete with no ref' '
 	grep "fatal: delete: missing <ref>" err
 '
 
-test_expect_success 'stdin -z fails delete with bad ref name' '
-	printf $F "delete ~a" "$m" >stdin &&
-	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
-'
-
 test_expect_success 'stdin -z fails delete with no old value' '
 	printf $F "delete $a" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
diff --git c/t/t1402-check-ref-format.sh w/t/t1402-check-ref-format.sh
index 058fa37..1a5a5f3 100755
--- c/t/t1402-check-ref-format.sh
+++ w/t/t1402-check-ref-format.sh
@@ -196,52 +196,4 @@ invalid_ref_normalized 'heads///foo.lock'
 invalid_ref_normalized 'foo.lock/bar'
 invalid_ref_normalized 'foo.lock///bar'
 
-test_expect_success 'git branch shows badly named ref' '
-	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
-	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
-	git branch >output &&
-	grep -e "broken...ref" output
-'
-
-test_expect_success 'git branch -d can delete badly named ref' '
-	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
-	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
-	git branch -d broken...ref &&
-	git branch >output &&
-	! grep -e "broken...ref" output
-'
-
-test_expect_success 'git branch -D can delete badly named ref' '
-	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
-	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
-	git branch -D broken...ref &&
-	git branch >output &&
-	! grep -e "broken...ref" output
-'
-
-test_expect_success 'git update-ref -d can delete badly named ref' '
-	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
-	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
-	git update-ref -d refs/heads/broken...ref &&
-	git branch >output &&
-	! grep -e "broken...ref" output
-'
-
-test_expect_success 'git branch can not create a badly named ref' '
-	test_must_fail git branch broken...ref
-'
-
-test_expect_success 'git branch can not rename to a bad ref name' '
-	git branch goodref &&
-	test_must_fail git branch -m goodref broken...ref
-'
-
-test_expect_failure 'git branch can rename from a bad ref name' '
-	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
-	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
-	git branch -m broken...ref renamed &&
-	test_must_fail git rev-parse broken...ref &&
-	test_cmp_rev master renamed
-'
-
 test_done
diff --git c/t/t1413-reflog-detach.sh w/t/t1413-reflog-detach.sh
new file mode 100755
index 0000000..c730600
--- /dev/null
+++ w/t/t1413-reflog-detach.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+test_description='Test reflog interaction with detached HEAD'
+. ./test-lib.sh
+
+reset_state () {
+	git checkout master &&
+	cp saved_reflog .git/logs/HEAD
+}
+
+test_expect_success setup '
+	test_tick &&
+	git commit --allow-empty -m initial &&
+	git branch side &&
+	test_tick &&
+	git commit --allow-empty -m second &&
+	cat .git/logs/HEAD >saved_reflog
+'
+
+test_expect_success baseline '
+	reset_state &&
+	git rev-parse master master^ >expect &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'switch to branch' '
+	reset_state &&
+	git rev-parse side master master^ >expect &&
+	git checkout side &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'detach to other' '
+	reset_state &&
+	git rev-parse master side master master^ >expect &&
+	git checkout side &&
+	git checkout master^0 &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'detach to self' '
+	reset_state &&
+	git rev-parse master master master^ >expect &&
+	git checkout master^0 &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'attach to self' '
+	reset_state &&
+	git rev-parse master master master master^ >expect &&
+	git checkout master^0 &&
+	git checkout master &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'attach to other' '
+	reset_state &&
+	git rev-parse side master master master^ >expect &&
+	git checkout master^0 &&
+	git checkout side &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_done
diff --git c/t/t1430-bad-ref-name.sh w/t/t1430-bad-ref-name.sh
new file mode 100755
index 0000000..468e856
--- /dev/null
+++ w/t/t1430-bad-ref-name.sh
@@ -0,0 +1,207 @@
+#!/bin/sh
+
+test_description='Test handling of ref names that check-ref-format rejects'
+. ./test-lib.sh
+
+test_expect_success setup '
+	test_commit one &&
+	test_commit two
+'
+
+test_expect_success 'fast-import: fail on invalid branch name ".badbranchname"' '
+	test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&
+	cat >input <<-INPUT_END &&
+		commit .badbranchname
+		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+		data <<COMMIT
+		corrupt
+		COMMIT
+
+		from refs/heads/master
+
+	INPUT_END
+	test_must_fail git fast-import <input
+'
+
+test_expect_success 'fast-import: fail on invalid branch name "bad[branch]name"' '
+	test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&
+	cat >input <<-INPUT_END &&
+		commit bad[branch]name
+		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+		data <<COMMIT
+		corrupt
+		COMMIT
+
+		from refs/heads/master
+
+	INPUT_END
+	test_must_fail git fast-import <input
+'
+
+test_expect_success 'git branch shows badly named ref' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch >output &&
+	grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'branch -d can delete badly named ref' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch -d broken...ref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'branch -D can delete badly named ref' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch -D broken...ref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'branch -D cannot delete non-ref in .git dir' '
+	echo precious >.git/my-private-file &&
+	echo precious >expect &&
+	test_must_fail git branch -D ../../my-private-file &&
+	test_cmp expect .git/my-private-file
+'
+
+test_expect_success 'branch -D cannot delete absolute path' '
+	git branch -f extra &&
+	test_must_fail git branch -D "$(pwd)/.git/refs/heads/extra" &&
+	test_cmp_rev HEAD extra
+'
+
+test_expect_success 'git branch cannot create a badly named ref' '
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	test_must_fail git branch broken...ref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'branch -m cannot rename to a bad ref name' '
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	test_might_fail git branch -D goodref &&
+	git branch goodref &&
+	test_must_fail git branch -m goodref broken...ref &&
+	test_cmp_rev master goodref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_failure 'branch -m can rename from a bad ref name' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch -m broken...ref renamed &&
+	test_cmp_rev master renamed &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'push cannot create a badly named ref' '
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	test_must_fail git push "file://$(pwd)" HEAD:refs/heads/broken...ref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_failure 'push --mirror can delete badly named ref' '
+	top=$(pwd) &&
+	git init src &&
+	git init dest &&
+
+	(
+		cd src &&
+		test_commit one
+	) &&
+	(
+		cd dest &&
+		test_commit two &&
+		git checkout --detach &&
+		cp .git/refs/heads/master .git/refs/heads/broken...ref
+	) &&
+	git -C src push --mirror "file://$top/dest" &&
+	git -C dest branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'rev-parse skips symref pointing to broken name' '
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch shadow one &&
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	git symbolic-ref refs/tags/shadow refs/heads/broken...ref &&
+
+	git rev-parse --verify one >expect &&
+	git rev-parse --verify shadow >actual 2>err &&
+	test_cmp expect actual &&
+	test_i18ngrep "ignoring.*refs/tags/shadow" err
+'
+
+test_expect_success 'update-ref --no-deref -d can delete reference to broken name' '
+	git symbolic-ref refs/heads/badname refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/badname" &&
+	test_path_is_file .git/refs/heads/badname &&
+	git update-ref --no-deref -d refs/heads/badname &&
+	test_path_is_missing .git/refs/heads/badname
+'
+
+test_expect_success 'update-ref -d can delete broken name' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git update-ref -d refs/heads/broken...ref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'update-ref -d cannot delete non-ref in .git dir' '
+	echo precious >.git/my-private-file &&
+	echo precious >expect &&
+	test_must_fail git update-ref -d my-private-file &&
+	test_cmp expect .git/my-private-file
+'
+
+test_expect_success 'update-ref -d cannot delete absolute path' '
+	git branch -f extra &&
+	test_must_fail git update-ref -d "$(pwd)/.git/refs/heads/extra" &&
+	test_cmp_rev HEAD extra
+'
+
+test_expect_success 'update-ref --stdin fails create with bad ref name' '
+	echo "create ~a refs/heads/master" >stdin &&
+	test_must_fail git update-ref --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin fails update with bad ref name' '
+	echo "update ~a refs/heads/master" >stdin &&
+	test_must_fail git update-ref --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin fails delete with bad ref name' '
+	echo "delete ~a refs/heads/master" >stdin &&
+	test_must_fail git update-ref --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin -z fails create with bad ref name' '
+	printf "%s\0" "create ~a " refs/heads/master >stdin &&
+	test_must_fail git update-ref -z --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a " err
+'
+
+test_expect_success 'update-ref --stdin -z fails update with bad ref name' '
+	printf "%s\0" "update ~a" refs/heads/master "" >stdin &&
+	test_must_fail git update-ref -z --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin -z fails delete with bad ref name' '
+	printf "%s\0" "delete ~a" refs/heads/master >stdin &&
+	test_must_fail git update-ref -z --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_done
diff --git c/t/t9300-fast-import.sh w/t/t9300-fast-import.sh
index 5fc9ef2..3d156f9 100755
--- c/t/t9300-fast-import.sh
+++ w/t/t9300-fast-import.sh
@@ -347,36 +347,6 @@ test_expect_success 'B: fail on invalid blob sha1' '
 rm -f .git/objects/pack_* .git/objects/index_*
 
 cat >input <<INPUT_END
-commit .badbranchname
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-corrupt
-COMMIT
-
-from refs/heads/master
-
-INPUT_END
-test_expect_success 'B: fail on invalid branch name ".badbranchname"' '
-    test_must_fail git fast-import <input
-'
-rm -f .git/objects/pack_* .git/objects/index_*
-
-cat >input <<INPUT_END
-commit bad[branch]name
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-corrupt
-COMMIT
-
-from refs/heads/master
-
-INPUT_END
-test_expect_success 'B: fail on invalid branch name "bad[branch]name"' '
-    test_must_fail git fast-import <input
-'
-rm -f .git/objects/pack_* .git/objects/index_*
-
-cat >input <<INPUT_END
 commit TEMP_TAG
 committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 data <<COMMIT
diff --git c/transport-helper.c w/transport-helper.c
index 8365441..3497a5e 100644
--- c/transport-helper.c
+++ w/transport-helper.c
@@ -890,8 +890,9 @@ static int push_refs_with_export(struct transport *transport,
 
 					/* Follow symbolic refs (mainly for HEAD). */
 					name = resolve_ref_unsafe(
-						 ref->peer_ref->name, sha1,
-						 &flag, RESOLVE_REF_READING);
+						 ref->peer_ref->name,
+						 RESOLVE_REF_READING,
+						 sha1, &flag);
 					if (!name || !(flag & REF_ISSYMREF))
 						name = ref->peer_ref->name;
 
diff --git c/transport.c w/transport.c
index 3ba7bbf..76e0a9a 100644
--- c/transport.c
+++ w/transport.c
@@ -168,8 +168,8 @@ static void set_upstreams(struct transport *transport, struct ref *refs,
 		/* Follow symbolic refs (mainly for HEAD). */
 		localname = ref->peer_ref->name;
 		remotename = ref->name;
-		tmp = resolve_ref_unsafe(localname, sha, &flag,
-					 RESOLVE_REF_READING);
+		tmp = resolve_ref_unsafe(localname, RESOLVE_REF_READING,
+					 sha, &flag);
 		if (tmp && flag & REF_ISSYMREF &&
 			starts_with(tmp, "refs/heads/"))
 			localname = tmp;
@@ -754,7 +754,7 @@ void transport_print_push_status(const char *dest, struct ref *refs,
 	unsigned char head_sha1[20];
 	char *head;
 
-	head = resolve_refdup("HEAD", head_sha1, NULL, RESOLVE_REF_READING);
+	head = resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, NULL);
 
 	if (verbose) {
 		for (ref = refs; ref; ref = ref->next)
diff --git c/upload-pack.c w/upload-pack.c
index 3b51ccb..4542565 100644
--- c/upload-pack.c
+++ w/upload-pack.c
@@ -743,7 +743,7 @@ static int find_symref(const char *refname, const unsigned char *sha1, int flag,
 
 	if ((flag & REF_ISSYMREF) == 0)
 		return 0;
-	symref_target = resolve_ref_unsafe(refname, unused, &flag, 0);
+	symref_target = resolve_ref_unsafe(refname, 0, unused, &flag);
 	if (!symref_target || (flag & REF_ISSYMREF) == 0)
 		die("'%s' is a symref but it is not?", refname);
 	item = string_list_append(cb_data, refname);
diff --git c/wt-status.c w/wt-status.c
index 6819e2b..c3cbf50 100644
--- c/wt-status.c
+++ w/wt-status.c
@@ -128,7 +128,7 @@ void wt_status_prepare(struct wt_status *s)
 	s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
 	s->use_color = -1;
 	s->relative_paths = 1;
-	s->branch = resolve_refdup("HEAD", sha1, NULL, 0);
+	s->branch = resolve_refdup("HEAD", 0, sha1, NULL);
 	s->reference = "HEAD";
 	s->fp = stdout;
 	s->index_file = get_index_file();

^ permalink raw reply related	[relevance 1%]

* [PATCH 01/19] mv test: recreate mod/ directory instead of relying on stale copy
  2014-09-11  3:03  2%         ` [PATCH v21 0/19] rs/ref-transaction (Re: Transaction patch series overview) Jonathan Nieder
@ 2014-09-11  3:04 10%           ` Jonathan Nieder
  2014-10-02  1:48  1%           ` [PATCH v22 0/24] rs/ref-transaction Jonathan Nieder
  1 sibling, 0 replies; 200+ results
From: Jonathan Nieder @ 2014-09-11  3:04 UTC (permalink / raw)
  To: Ronnie Sahlberg; +Cc: git@vger.kernel.org, Michael Haggerty

The tests for 'git mv moves a submodule' functionality often run
commands like

	git mv sub mod/sub

to move a submodule into a subdirectory.  Just like plain /bin/mv,
this is supposed to succeed if the mod/ parent directory exists
and fail if it doesn't exist.

Usually these tests mkdir the parent directory beforehand, but some
instead rely on it being left behind by previous tests.

More precisely, when 'git reset --hard' tries to move to a state where
mod/sub is not present any more, it would perform the following
operations:

	rmdir("mod/sub")
	rmdir("mod")

The first fails with ENOENT because the test script removed mod/sub
with "rm -rf" already, so 'reset --hard' doesn't bother to move on to
the second, and the mod/ directory is kept around.

Better to explicitly remove and re-create the mod/ directory so later
tests don't have to depend on the directory left behind by the earlier
ones at all (making it easier to rearrange or skip some tests in the
file or to tweak 'reset --hard' behavior without breaking unrelated
tests).

Noticed while testing a patch that fixes the reset --hard behavior
described above.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Ronnie Sahlberg <sahlberg@google.com>
---
 t/t7001-mv.sh | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 54d7807..69f11bd 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -350,10 +350,11 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu
 '
 
 test_expect_success 'git mv moves a submodule with gitfile' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	(
 		cd mod &&
 		git mv ../sub/ .
@@ -372,11 +373,12 @@ test_expect_success 'git mv moves a submodule with gitfile' '
 '
 
 test_expect_success 'mv does not complain when no .gitmodules file is found' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git rm .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	! test -s actual.err &&
 	! test -e sub &&
@@ -390,11 +392,12 @@ test_expect_success 'mv does not complain when no .gitmodules file is found' '
 '
 
 test_expect_success 'mv will error out on a modified .gitmodules file unless staged' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules foo.bar true &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	test_must_fail git mv sub mod/sub 2>actual.err &&
 	test -s actual.err &&
 	test -e sub &&
@@ -413,13 +416,14 @@ test_expect_success 'mv will error out on a modified .gitmodules file unless sta
 '
 
 test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules --remove-section submodule.sub &&
 	git add .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
 	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	test_i18ncmp expect.err actual.err &&
 	! test -e sub &&
@@ -433,9 +437,10 @@ test_expect_success 'mv issues a warning when section is not found in .gitmodule
 '
 
 test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
+	mkdir mod &&
 	git mv -n sub mod/sub 2>actual.err &&
 	test -f sub/.git &&
 	git diff-index --exit-code HEAD &&
-- 
2.1.0.rc2.206.gedb03e5

^ permalink raw reply related	[relevance 10%]

* [PATCH v21 0/19] rs/ref-transaction (Re: Transaction patch series overview)
  @ 2014-09-11  3:03  2%         ` Jonathan Nieder
  2014-09-11  3:04 10%           ` [PATCH 01/19] mv test: recreate mod/ directory instead of relying on stale copy Jonathan Nieder
  2014-10-02  1:48  1%           ` [PATCH v22 0/24] rs/ref-transaction Jonathan Nieder
  0 siblings, 2 replies; 200+ results
From: Jonathan Nieder @ 2014-09-11  3:03 UTC (permalink / raw)
  To: Ronnie Sahlberg; +Cc: git@vger.kernel.org, Michael Haggerty

Jonathan Nieder wrote:

> The next series from Ronnie's collection is available at
> https://code-review.googlesource.com/#/q/topic:ref-transaction in case
> someone wants a fresh series to look at.

Here is the outcome of that review.  It could use another set of eyes
(hint, hint) but should be mostly ready.  Interdiff below.  This is meant
to replace rs/ref-transaction in 'pu' and I'd prefer to wait a little
for more comments before merging to 'next'.

These patches are also available from the git repository at

  git://repo.or.cz/git/jrn.git tags/rs/ref-transaction

"Use ref transactions", part 3

Ronnie explains:

	This is the third and final part of the original 48 patch
	series for basic transaction support.  This version implements
	some changes suggested by mhagger for the warn_if_unremovable
	changes.  It also adds a new patch "fix handling of badly
	named refs" that repairs the handling of badly named refs.

This includes some improvements to the transaction API (in
particular allowing different reflog messages per ref update in
a transaction), some cleanups and consistency improvements, and
preparation for an implementation of ref renaming in terms of
the transaction API.

It also improves handling of refs with invalid names.  Today "git
branch --list" and "git for-each-ref" do not provide a way to discover
refs with invalid names and "git branch -d" and "git update-ref -d"
cannot delete them.  After this series, such bad refs will be
discoverable and deletable again as in olden times.

Jonathan Nieder (5):
  mv test: recreate mod/ directory instead of relying on stale copy
  branch -d: avoid repeated symref resolution
  refs.c: do not permit err == NULL
  lockfile: remove unable_to_lock_error
  ref_transaction_commit: bail out on failure to remove a ref

Ronnie Sahlberg (14):
  wrapper.c: remove/unlink_or_warn: simplify, treat ENOENT as success
  wrapper.c: add a new function unlink_or_msg
  refs.c: add an err argument to delete_ref_loose
  refs.c: pass the ref log message to _create/delete/update instead of
    _commit
  rename_ref: don't ask read_ref_full where the ref came from
  refs.c: move the check for valid refname to lock_ref_sha1_basic
  refs.c: call lock_ref_sha1_basic directly from commit
  refs.c: pass a skip list to name_conflict_fn
  refs.c: ref_transaction_commit: distinguish name conflicts from other
    errors
  fetch.c: change s_update_ref to use a ref transaction
  refs.c: make write_ref_sha1 static
  refs.c: change resolve_ref_unsafe reading argument to be a flags field
  refs.c: fix handling of badly named refs
  for-each-ref.c: improve message before aborting on broken ref

 branch.c                    |   6 +-
 builtin/blame.c             |   2 +-
 builtin/branch.c            |  19 ++-
 builtin/checkout.c          |   6 +-
 builtin/clone.c             |   2 +-
 builtin/commit.c            |   6 +-
 builtin/fetch.c             |  34 +++--
 builtin/fmt-merge-msg.c     |   2 +-
 builtin/for-each-ref.c      |  12 +-
 builtin/fsck.c              |   2 +-
 builtin/log.c               |   3 +-
 builtin/merge.c             |   2 +-
 builtin/notes.c             |   2 +-
 builtin/receive-pack.c      |   9 +-
 builtin/remote.c            |   5 +-
 builtin/replace.c           |   5 +-
 builtin/show-branch.c       |   6 +-
 builtin/symbolic-ref.c      |   2 +-
 builtin/tag.c               |   4 +-
 builtin/update-ref.c        |  16 ++-
 bundle.c                    |   2 +-
 cache.h                     |  31 +++--
 fast-import.c               |   8 +-
 git-compat-util.h           |  16 ++-
 http-backend.c              |   3 +-
 lockfile.c                  |  10 --
 notes-merge.c               |   2 +-
 reflog-walk.c               |   5 +-
 refs.c                      | 321 ++++++++++++++++++++++++++++++--------------
 refs.h                      |  18 ++-
 remote.c                    |  10 +-
 sequencer.c                 |   8 +-
 t/t1400-update-ref.sh       |  16 +++
 t/t1402-check-ref-format.sh |  48 +++++++
 t/t3200-branch.sh           |   9 ++
 t/t7001-mv.sh               |  15 ++-
 transport-helper.c          |   4 +-
 transport.c                 |   5 +-
 upload-pack.c               |   2 +-
 walker.c                    |   5 +-
 wrapper.c                   |  28 ++--
 wt-status.c                 |   2 +-
 42 files changed, 487 insertions(+), 226 deletions(-)
---
Changes since last appearance:

diff --git c/branch.c w/branch.c
index 76a8ec9..ba3e1c1 100644
--- c/branch.c
+++ w/branch.c
@@ -186,7 +186,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
 		const char *head;
 		unsigned char sha1[20];
 
-		head = resolve_ref_unsafe("HEAD", sha1, 0, NULL);
+		head = resolve_ref_unsafe("HEAD", sha1, NULL, 0);
 		if (!is_bare_repository() && head && !strcmp(head, ref->buf))
 			die(_("Cannot force update the current branch."));
 	}
diff --git c/builtin/blame.c w/builtin/blame.c
index 1568bd8..b8bec0a 100644
--- c/builtin/blame.c
+++ w/builtin/blame.c
@@ -2292,7 +2292,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
 	commit->object.type = OBJ_COMMIT;
 	parent_tail = &commit->parents;
 
-	if (!resolve_ref_unsafe("HEAD", head_sha1, RESOLVE_REF_READING, NULL))
+	if (!resolve_ref_unsafe("HEAD", head_sha1, NULL, RESOLVE_REF_READING))
 		die("no such ref: HEAD");
 
 	parent_tail = append_parent(parent_tail, head_sha1);
diff --git c/builtin/branch.c w/builtin/branch.c
index 5c95656..5d5bc56 100644
--- c/builtin/branch.c
+++ w/builtin/branch.c
@@ -130,7 +130,7 @@ static int branch_merged(int kind, const char *name,
 		    branch->merge[0]->dst &&
 		    (reference_name = reference_name_to_free =
 		     resolve_refdup(branch->merge[0]->dst, sha1,
-				    RESOLVE_REF_READING, NULL)) != NULL)
+				    NULL, RESOLVE_REF_READING)) != NULL)
 			reference_rev = lookup_commit_reference(sha1);
 	}
 	if (!reference_rev)
@@ -234,10 +234,13 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 		free(name);
 
 		name = mkpathdup(fmt, bname.buf);
-		target = resolve_ref_unsafe(name, sha1,
-					    RESOLVE_REF_ALLOW_BAD_NAME, &flags);
+		target = resolve_ref_unsafe(name, sha1, &flags,
+					    RESOLVE_REF_READING
+					    | RESOLVE_REF_NODEREF
+					    | RESOLVE_REF_ALLOW_BAD_NAME);
 		if (!target ||
-		    (!(flags & REF_ISSYMREF) && is_null_sha1(sha1))) {
+		    (!(flags & (REF_ISSYMREF|REF_ISBROKEN)) &&
+		     is_null_sha1(sha1))) {
 			error(remote_branch
 			      ? _("remote branch '%s' not found.")
 			      : _("branch '%s' not found."), bname.buf);
@@ -245,14 +248,14 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 			continue;
 		}
 
-		if (!(flags & REF_ISSYMREF) &&
+		if (!(flags & (REF_ISSYMREF|REF_ISBROKEN)) &&
 		    check_branch_commit(bname.buf, name, sha1, head_rev, kinds,
 					force)) {
 			ret = 1;
 			continue;
 		}
 
-		if (delete_ref(name, sha1, REF_NODEREF)) {
+		if (delete_ref(name, sha1, REF_NODEREF|REF_BADNAMEOK)) {
 			error(remote_branch
 			      ? _("Error deleting remote branch '%s'")
 			      : _("Error deleting branch '%s'"),
@@ -298,7 +301,7 @@ static char *resolve_symref(const char *src, const char *prefix)
 	int flag;
 	const char *dst, *cp;
 
-	dst = resolve_ref_unsafe(src, sha1, 0, &flag);
+	dst = resolve_ref_unsafe(src, sha1, &flag, 0);
 	if (!(dst && (flag & REF_ISSYMREF)))
 		return NULL;
 	if (prefix && (cp = skip_prefix(dst, prefix)))
@@ -864,7 +867,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 
 	track = git_branch_track;
 
-	head = resolve_refdup("HEAD", head_sha1, 0, NULL);
+	head = resolve_refdup("HEAD", head_sha1, NULL, 0);
 	if (!head)
 		die(_("Failed to resolve HEAD as a valid ref."));
 	if (!strcmp(head, "HEAD")) {
diff --git c/builtin/checkout.c w/builtin/checkout.c
index f1dc56e..64af1f7 100644
--- c/builtin/checkout.c
+++ w/builtin/checkout.c
@@ -356,7 +356,7 @@ static int checkout_paths(const struct checkout_opts *opts,
 	    commit_locked_index(lock_file))
 		die(_("unable to write new index file"));
 
-	read_ref_full("HEAD", rev, 0, &flag);
+	read_ref_full("HEAD", rev, &flag, 0);
 	head = lookup_commit_reference_gently(rev, 1);
 
 	errs |= post_checkout_hook(head, head, 0);
@@ -771,7 +771,7 @@ static int switch_branches(const struct checkout_opts *opts,
 	unsigned char rev[20];
 	int flag, writeout_error = 0;
 	memset(&old, 0, sizeof(old));
-	old.path = path_to_free = resolve_refdup("HEAD", rev, 0, &flag);
+	old.path = path_to_free = resolve_refdup("HEAD", rev, &flag, 0);
 	old.commit = lookup_commit_reference_gently(rev, 1);
 	if (!(flag & REF_ISSYMREF))
 		old.path = NULL;
@@ -1068,7 +1068,7 @@ static int checkout_branch(struct checkout_opts *opts,
 		unsigned char rev[20];
 		int flag;
 
-		if (!read_ref_full("HEAD", rev, 0, &flag) &&
+		if (!read_ref_full("HEAD", rev, &flag, 0) &&
 		    (flag & REF_ISSYMREF) && is_null_sha1(rev))
 			return switch_unborn_to_new_branch(opts);
 	}
diff --git c/builtin/clone.c w/builtin/clone.c
index f7307e6..12a78e1 100644
--- c/builtin/clone.c
+++ w/builtin/clone.c
@@ -622,7 +622,7 @@ static int checkout(void)
 	if (option_no_checkout)
 		return 0;
 
-	head = resolve_refdup("HEAD", sha1, RESOLVE_REF_READING, NULL);
+	head = resolve_refdup("HEAD", sha1, NULL, RESOLVE_REF_READING);
 	if (!head) {
 		warning(_("remote HEAD refers to nonexistent ref, "
 			  "unable to checkout.\n"));
diff --git c/builtin/commit.c w/builtin/commit.c
index d23e876..3536330 100644
--- c/builtin/commit.c
+++ w/builtin/commit.c
@@ -1468,7 +1468,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
 	rev.diffopt.break_opt = 0;
 	diff_setup_done(&rev.diffopt);
 
-	head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
+	head = resolve_ref_unsafe("HEAD", junk_sha1, NULL, 0);
 	printf("[%s%s ",
 		starts_with(head, "refs/heads/") ?
 			head + 11 :
diff --git c/builtin/fetch.c w/builtin/fetch.c
index 52f1ebc..2e3bc73 100644
--- c/builtin/fetch.c
+++ w/builtin/fetch.c
@@ -398,6 +398,7 @@ static int s_update_ref(const char *action,
 		goto fail;
 
 	ref_transaction_free(transaction);
+	strbuf_release(&err);
 	return 0;
 fail:
 	ref_transaction_free(transaction);
@@ -686,9 +687,10 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 			}
 		}
 	}
+
 	if (rc & STORE_REF_ERROR_DF_CONFLICT)
 		error(_("some local refs could not be updated; try running\n"
-		      "'git remote prune %s' to remove any old, conflicting "
+		      " 'git remote prune %s' to remove any old, conflicting "
 		      "branches"), remote_name);
 
  abort:
diff --git c/builtin/fmt-merge-msg.c w/builtin/fmt-merge-msg.c
index d8ab177..b2355ad 100644
--- c/builtin/fmt-merge-msg.c
+++ w/builtin/fmt-merge-msg.c
@@ -602,7 +602,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
 
 	/* get current branch */
 	current_branch = current_branch_to_free =
-		resolve_refdup("HEAD", head_sha1, RESOLVE_REF_READING, NULL);
+		resolve_refdup("HEAD", head_sha1, NULL, RESOLVE_REF_READING);
 	if (!current_branch)
 		die("No current branch");
 	if (starts_with(current_branch, "refs/heads/"))
diff --git c/builtin/for-each-ref.c w/builtin/for-each-ref.c
index 7c5b479..090390c 100644
--- c/builtin/for-each-ref.c
+++ w/builtin/for-each-ref.c
@@ -650,7 +650,7 @@ static void populate_value(struct refinfo *ref)
 	if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
 		unsigned char unused1[20];
 		ref->symref = resolve_refdup(ref->refname, unused1,
-					     RESOLVE_REF_READING, NULL);
+					     NULL, RESOLVE_REF_READING);
 		if (!ref->symref)
 			ref->symref = "";
 	}
@@ -709,7 +709,7 @@ static void populate_value(struct refinfo *ref)
 			unsigned char sha1[20];
 
 			head = resolve_ref_unsafe("HEAD", sha1,
-						  RESOLVE_REF_READING, NULL);
+						  NULL, RESOLVE_REF_READING);
 			if (!strcmp(ref->refname, head))
 				v->s = "*";
 			else
@@ -853,6 +853,12 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
 	struct refinfo *ref;
 	int cnt;
 
+	if ((flag & REF_ISBROKEN) &&
+	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+		  warning("ignoring ref with broken name %s", refname);
+		  return 0;
+	}
+
 	if (*cb->grab_pattern) {
 		const char **pattern;
 		int namelen = strlen(refname);
diff --git c/builtin/fsck.c w/builtin/fsck.c
index fc150c8..506e32b 100644
--- c/builtin/fsck.c
+++ w/builtin/fsck.c
@@ -560,7 +560,7 @@ static int fsck_head_link(void)
 	if (verbose)
 		fprintf(stderr, "Checking HEAD link\n");
 
-	head_points_at = resolve_ref_unsafe("HEAD", head_sha1, 0, &flag);
+	head_points_at = resolve_ref_unsafe("HEAD", head_sha1, &flag, 0);
 	if (!head_points_at)
 		return error("Invalid HEAD");
 	if (!strcmp(head_points_at, "HEAD"))
diff --git c/builtin/log.c w/builtin/log.c
index 92db809..230a9ef 100644
--- c/builtin/log.c
+++ w/builtin/log.c
@@ -1395,8 +1395,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 		if (check_head) {
 			unsigned char sha1[20];
 			const char *ref;
-			ref = resolve_ref_unsafe("HEAD", sha1,
-						 RESOLVE_REF_READING, NULL);
+			ref = resolve_ref_unsafe("HEAD", sha1, NULL,
+						 RESOLVE_REF_READING);
 			if (ref && starts_with(ref, "refs/heads/"))
 				branch_name = xstrdup(ref + strlen("refs/heads/"));
 			else
diff --git c/builtin/merge.c w/builtin/merge.c
index 428ca24..d262279 100644
--- c/builtin/merge.c
+++ w/builtin/merge.c
@@ -1108,7 +1108,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 	 * Check if we are _not_ on a detached HEAD, i.e. if there is a
 	 * current branch.
 	 */
-	branch = branch_to_free = resolve_refdup("HEAD", head_sha1, 0, &flag);
+	branch = branch_to_free = resolve_refdup("HEAD", head_sha1, &flag, 0);
 	if (branch && starts_with(branch, "refs/heads/"))
 		branch += 11;
 	if (!branch || is_null_sha1(head_sha1))
diff --git c/builtin/notes.c w/builtin/notes.c
index 820c341..16df78c 100644
--- c/builtin/notes.c
+++ w/builtin/notes.c
@@ -703,7 +703,7 @@ static int merge_commit(struct notes_merge_options *o)
 	init_notes(t, "NOTES_MERGE_PARTIAL", combine_notes_overwrite, 0);
 
 	o->local_ref = local_ref_to_free =
-		resolve_refdup("NOTES_MERGE_REF", sha1, 0, NULL);
+		resolve_refdup("NOTES_MERGE_REF", sha1, NULL, 0);
 	if (!o->local_ref)
 		die("Failed to resolve NOTES_MERGE_REF");
 
diff --git c/builtin/receive-pack.c w/builtin/receive-pack.c
index d1f4cf7..555a4a6 100644
--- c/builtin/receive-pack.c
+++ w/builtin/receive-pack.c
@@ -656,7 +656,7 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
 	int flag;
 
 	strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
-	dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
+	dst_name = resolve_ref_unsafe(buf.buf, sha1, &flag, 0);
 	strbuf_release(&buf);
 
 	if (!(flag & REF_ISSYMREF))
@@ -817,7 +817,7 @@ static void execute_commands(struct command *commands,
 	check_aliased_updates(commands);
 
 	free(head_name_to_free);
-	head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
+	head_name = head_name_to_free = resolve_refdup("HEAD", sha1, NULL, 0);
 
 	checked_connectivity = 1;
 	for (cmd = commands; cmd; cmd = cmd->next) {
diff --git c/builtin/remote.c w/builtin/remote.c
index be8ebac..6eaeee7 100644
--- c/builtin/remote.c
+++ w/builtin/remote.c
@@ -568,8 +568,8 @@ static int read_remote_branches(const char *refname,
 	strbuf_addf(&buf, "refs/remotes/%s/", rename->old);
 	if (starts_with(refname, buf.buf)) {
 		item = string_list_append(rename->remote_branches, xstrdup(refname));
-		symref = resolve_ref_unsafe(refname, orig_sha1,
-					    RESOLVE_REF_READING, &flag);
+		symref = resolve_ref_unsafe(refname, orig_sha1, &flag,
+					    RESOLVE_REF_READING);
 		if (flag & REF_ISSYMREF)
 			item->util = xstrdup(symref);
 		else
@@ -705,7 +705,7 @@ static int mv(int argc, const char **argv)
 		int flag = 0;
 		unsigned char sha1[20];
 
-		read_ref_full(item->string, sha1, RESOLVE_REF_READING, &flag);
+		read_ref_full(item->string, sha1, &flag, RESOLVE_REF_READING);
 		if (!(flag & REF_ISSYMREF))
 			continue;
 		if (delete_ref(item->string, NULL, REF_NODEREF))
diff --git c/builtin/replace.c w/builtin/replace.c
index df060f8..9d03b84 100644
--- c/builtin/replace.c
+++ w/builtin/replace.c
@@ -170,7 +170,7 @@ static int replace_object_sha1(const char *object_ref,
 	transaction = ref_transaction_begin(&err);
 	if (!transaction ||
 	    ref_transaction_update(transaction, ref, repl, prev,
-				   0, !is_null_sha1(prev), NULL, &err) ||
+				   0, 1, NULL, &err) ||
 	    ref_transaction_commit(transaction, &err))
 		die("%s", err.buf);
 
diff --git c/builtin/show-branch.c w/builtin/show-branch.c
index a9a5eb3..ef6ea52 100644
--- c/builtin/show-branch.c
+++ w/builtin/show-branch.c
@@ -727,8 +727,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 		if (ac == 0) {
 			static const char *fake_av[2];
 
-			fake_av[0] = resolve_refdup("HEAD", sha1,
-						    RESOLVE_REF_READING, NULL);
+			fake_av[0] = resolve_refdup("HEAD", sha1, NULL,
+						    RESOLVE_REF_READING);
 			fake_av[1] = NULL;
 			av = fake_av;
 			ac = 1;
@@ -790,8 +790,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 		}
 	}
 
-	head_p = resolve_ref_unsafe("HEAD", head_sha1,
-				    RESOLVE_REF_READING, NULL);
+	head_p = resolve_ref_unsafe("HEAD", head_sha1, NULL,
+				    RESOLVE_REF_READING);
 	if (head_p) {
 		head_len = strlen(head_p);
 		memcpy(head, head_p, head_len + 1);
diff --git c/builtin/symbolic-ref.c w/builtin/symbolic-ref.c
index b6a711d..1dd04af 100644
--- c/builtin/symbolic-ref.c
+++ w/builtin/symbolic-ref.c
@@ -13,7 +13,7 @@ static int check_symref(const char *HEAD, int quiet, int shorten, int print)
 {
 	unsigned char sha1[20];
 	int flag;
-	const char *refname = resolve_ref_unsafe(HEAD, sha1, 0, &flag);
+	const char *refname = resolve_ref_unsafe(HEAD, sha1, &flag, 0);
 
 	if (!refname)
 		die("No such ref: %s", HEAD);
diff --git c/builtin/update-ref.c w/builtin/update-ref.c
index 6c9be05..e379fdd 100644
--- c/builtin/update-ref.c
+++ w/builtin/update-ref.c
@@ -419,7 +419,8 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
 	if (no_deref)
 		flags = REF_NODEREF;
 	if (delete)
-		return delete_ref(refname, oldval ? oldsha1 : NULL, flags);
+		return delete_ref(refname, oldval ? oldsha1 : NULL,
+				  flags|REF_BADNAMEOK);
 	else
 		return update_ref(msg, refname, sha1, oldval ? oldsha1 : NULL,
 				  flags, UPDATE_REFS_DIE_ON_ERR);
diff --git c/bundle.c w/bundle.c
index 8aaf5f8..32dd2f7 100644
--- c/bundle.c
+++ w/bundle.c
@@ -311,7 +311,7 @@ int create_bundle(struct bundle_header *header, const char *path,
 			continue;
 		if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
 			continue;
-		if (read_ref_full(e->name, sha1, RESOLVE_REF_READING, &flag))
+		if (read_ref_full(e->name, sha1, &flag, RESOLVE_REF_READING))
 			flag = 0;
 		display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
 
diff --git c/cache.h w/cache.h
index 3a4b087..995729f 100644
--- c/cache.h
+++ w/cache.h
@@ -558,7 +558,6 @@ struct lock_file {
 };
 #define LOCK_DIE_ON_ERROR 1
 #define LOCK_NODEREF 2
-extern int unable_to_lock_error(const char *path, int err);
 extern void unable_to_lock_message(const char *path, int err,
 				   struct strbuf *buf);
 extern NORETURN void unable_to_lock_index_die(const char *path, int err);
@@ -948,7 +947,7 @@ extern int get_sha1_hex(const char *hex, unsigned char *sha1);
 
 extern char *sha1_to_hex(const unsigned char *sha1);	/* static buffer result! */
 extern int read_ref_full(const char *refname, unsigned char *sha1,
-			 int flags, int *ref_flag);
+			 int *flags, int resolve_flags);
 extern int read_ref(const char *refname, unsigned char *sha1);
 
 /*
@@ -970,21 +969,27 @@ extern int read_ref(const char *refname, unsigned char *sha1);
  *   "writing" to the ref, the return value is the name of the ref
  *   that will actually be created or changed.
  *
- * If ref_flag is non-NULL, set the value that it points to the
+ * If flags is non-NULL, set the value that it points to the
  * combination of REF_ISPACKED (if the reference was found among the
- * packed references) and REF_ISSYMREF (if the initial reference was a
- * symbolic reference).
+ * packed references), REF_ISSYMREF (if the initial reference was a
+ * symbolic reference) and REF_ISBROKEN (if the ref is malformed).
  *
  * If ref is not a properly-formatted, normalized reference, return
  * NULL.  If more than MAXDEPTH recursive symbolic lookups are needed,
  * give up and return NULL.
  *
- * errno is set to something meaningful on error.
+ * RESOLVE_REF_ALLOW_BAD_NAME disables most of the ref name checking except
+ * for names that are absolute paths or contain ".." components. For both
+ * these cases the function will return NULL and set errno to EINVAL.
+ * If the name is bad then the function will set the REF_ISBROKEN flag and
+ * return the name, if the ref exists, or NULL, if it does not.
+ * When this flag is set, any badly named refs will resolve to nullsha1.
  */
-#define RESOLVE_REF_READING        0x01
-#define RESOLVE_REF_ALLOW_BAD_NAME 0x02
-extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int flags, int *ref_flag);
-extern char *resolve_refdup(const char *ref, unsigned char *sha1, int flags, int *ref_flag);
+#define RESOLVE_REF_READING 0x01
+#define RESOLVE_REF_NODEREF 0x02
+#define RESOLVE_REF_ALLOW_BAD_NAME 0x04
+extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int *flags, int resolve_flags);
+extern char *resolve_refdup(const char *ref, unsigned char *sha1, int *flags, int resolve_flags);
 
 extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref);
 extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
diff --git c/git-compat-util.h w/git-compat-util.h
index 426bc98..5ee140c 100644
--- c/git-compat-util.h
+++ w/git-compat-util.h
@@ -307,6 +307,8 @@ extern char *gitbasename(char *);
 
 #include "wildmatch.h"
 
+struct strbuf;
+
 /* General helper functions */
 extern void vreportf(const char *prefix, const char *err, va_list params);
 extern void vwritef(int fd, const char *prefix, const char *err, va_list params);
@@ -704,19 +706,23 @@ void git_qsort(void *base, size_t nmemb, size_t size,
 #endif
 #endif
 
-#include "strbuf.h"
-
 /*
  * Preserves errno, prints a message, but gives no warning for ENOENT.
- * Always returns the return value of unlink(2).
+ * Returns 0 on success which includes trying to unlink an object that does
+ * not exist.
  */
 int unlink_or_warn(const char *path);
-/*
- * Like unlink_or_warn but populates a strbuf
- */
+ /*
+  * Tries to unlink file.  Returns 0 if unlink succeeded
+  * or the file already didn't exist.  Returns -1 and
+  * appends a message to err suitable for
+  * 'error("%s", err->buf)' on error.
+  */
 int unlink_or_msg(const char *file, struct strbuf *err);
 /*
- * Likewise for rmdir(2).
+ * Preserves errno, prints a message, but gives no warning for ENOENT.
+ * Returns 0 on success which includes trying to remove a directory that does
+ * not exist.
  */
 int rmdir_or_warn(const char *path);
 /*
diff --git c/http-backend.c w/http-backend.c
index 059f790..8f94f9b 100644
--- c/http-backend.c
+++ w/http-backend.c
@@ -418,7 +418,7 @@ static int show_head_ref(const char *refname, const unsigned char *sha1,
 	if (flag & REF_ISSYMREF) {
 		unsigned char unused[20];
 		const char *target = resolve_ref_unsafe(refname, unused,
-						RESOLVE_REF_READING, NULL);
+						NULL, RESOLVE_REF_READING);
 		const char *target_nons = strip_namespace(target);
 
 		strbuf_addf(buf, "ref: %s\n", target_nons);
diff --git c/lockfile.c w/lockfile.c
index a921d77..dbd4101 100644
--- c/lockfile.c
+++ w/lockfile.c
@@ -176,16 +176,6 @@ void unable_to_lock_message(const char *path, int err, struct strbuf *buf)
 			    absolute_path(path), strerror(err));
 }
 
-int unable_to_lock_error(const char *path, int err)
-{
-	struct strbuf buf = STRBUF_INIT;
-
-	unable_to_lock_message(path, err, &buf);
-	error("%s", buf.buf);
-	strbuf_release(&buf);
-	return -1;
-}
-
 NORETURN void unable_to_lock_index_die(const char *path, int err)
 {
 	struct strbuf buf = STRBUF_INIT;
diff --git c/notes-merge.c w/notes-merge.c
index 94a1a8a..ffca602 100644
--- c/notes-merge.c
+++ w/notes-merge.c
@@ -549,7 +549,7 @@ int notes_merge(struct notes_merge_options *o,
 	       o->local_ref, o->remote_ref);
 
 	/* Dereference o->local_ref into local_sha1 */
-	if (read_ref_full(o->local_ref, local_sha1, 0, NULL))
+	if (read_ref_full(o->local_ref, local_sha1, NULL, 0))
 		die("Failed to resolve local notes ref '%s'", o->local_ref);
 	else if (!check_refname_format(o->local_ref, 0) &&
 		is_null_sha1(local_sha1))
diff --git c/reflog-walk.c w/reflog-walk.c
index d80a42a..feeaf0a 100644
--- c/reflog-walk.c
+++ w/reflog-walk.c
@@ -48,8 +48,8 @@ static struct complete_reflogs *read_complete_reflog(const char *ref)
 		unsigned char sha1[20];
 		const char *name;
 		void *name_to_free;
-		name = name_to_free = resolve_refdup(ref, sha1,
-						     RESOLVE_REF_READING, NULL);
+		name = name_to_free = resolve_refdup(ref, sha1, NULL,
+						     RESOLVE_REF_READING);
 		if (name) {
 			for_each_reflog_ent(name, read_one_reflog, reflogs);
 			free(name_to_free);
@@ -175,7 +175,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
 		if (*branch == '\0') {
 			unsigned char sha1[20];
 			free(branch);
-			branch = resolve_refdup("HEAD", sha1, 0, NULL);
+			branch = resolve_refdup("HEAD", sha1, NULL, 0);
 			if (!branch)
 				die ("No current branch");
 
diff --git c/refs.c w/refs.c
index b14bbf0..3b27758 100644
--- c/refs.c
+++ w/refs.c
@@ -281,11 +281,15 @@ static struct ref_dir *get_ref_dir(struct ref_entry *entry)
 }
 
 static struct ref_entry *create_ref_entry(const char *refname,
-					  const unsigned char *sha1, int flag)
+					  const unsigned char *sha1, int flag,
+					  int check_name)
 {
 	int len;
 	struct ref_entry *ref;
 
+	if (check_name &&
+	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT))
+		die("Reference has invalid format: '%s'", refname);
 	len = strlen(refname) + 1;
 	ref = xmalloc(sizeof(struct ref_entry) + len);
 	hashcpy(ref->u.value.sha1, sha1);
@@ -798,17 +802,16 @@ static int names_conflict(const char *refname1, const char *refname2)
 struct name_conflict_cb {
 	const char *refname;
 	const char *conflicting_refname;
-	const char **skip;
-	int skipnum;
+	struct string_list *skiplist;
 };
 
 static int name_conflict_fn(struct ref_entry *entry, void *cb_data)
 {
 	struct name_conflict_cb *data = (struct name_conflict_cb *)cb_data;
-	int i;
-	for (i = 0; i < data->skipnum; i++)
-		if (!strcmp(entry->name, data->skip[i]))
-			return 0;
+
+	if (data->skiplist &&
+	    string_list_has_string(data->skiplist, entry->name))
+		return 0;
 	if (names_conflict(data->refname, entry->name)) {
 		data->conflicting_refname = entry->name;
 		return 1;
@@ -821,18 +824,17 @@ static int name_conflict_fn(struct ref_entry *entry, void *cb_data)
  * conflicting with the name of an existing reference in dir.  If
  * oldrefname is non-NULL, ignore potential conflicts with oldrefname
  * (e.g., because oldrefname is scheduled for deletion in the same
- * operation). skip contains a list of refs we want to skip checking for
- * conflicts with.
+ * operation). skiplist contains a list of refs we want to skip checking for
+ * conflicts with. skiplist must be sorted.
  */
 static int is_refname_available(const char *refname,
 				struct ref_dir *dir,
-				const char **skip, int skipnum)
+				struct string_list *skiplist)
 {
 	struct name_conflict_cb data;
 	data.refname = refname;
 	data.conflicting_refname = NULL;
-	data.skip = skip;
-	data.skipnum = skipnum;
+	data.skiplist = skiplist;
 
 	sort_ref_dir(dir);
 	if (do_for_each_entry_in_dir(dir, 0, name_conflict_fn, &data)) {
@@ -1062,8 +1064,9 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir)
 
 			if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) {
 				flag |= REF_ISBROKEN;
+				hashclr(sha1);
 			}
-			last = create_ref_entry(refname, sha1, flag);
+			last = create_ref_entry(refname, sha1, flag, 0);
 			if (peeled == PEELED_FULLY ||
 			    (peeled == PEELED_TAGS && starts_with(refname, "refs/tags/")))
 				last->flag |= REF_KNOWS_PEELED;
@@ -1136,10 +1139,8 @@ void add_packed_ref(const char *refname, const unsigned char *sha1)
 
 	if (!packed_ref_cache->lock)
 		die("internal error: packed refs not locked");
-	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT))
-		die("Reference has invalid format: '%s'", refname);
 	add_ref(get_packed_ref_dir(packed_ref_cache),
-		create_ref_entry(refname, sha1, REF_ISPACKED));
+		create_ref_entry(refname, sha1, REF_ISPACKED, 1));
 }
 
 /*
@@ -1197,17 +1198,19 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
 					hashclr(sha1);
 					flag |= REF_ISBROKEN;
 				}
-			} else if (read_ref_full(refname.buf, sha1,
-						 RESOLVE_REF_READING, &flag)) {
+			} else if (read_ref_full(refname.buf, sha1, &flag,
+						 RESOLVE_REF_READING)) {
 				hashclr(sha1);
 				flag |= REF_ISBROKEN;
 			}
-			if (check_refname_format(refname.buf, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) {
+			if (check_refname_format(refname.buf,
+						 REFNAME_ALLOW_ONELEVEL|
+						 REFNAME_DOT_COMPONENT)) {
 				hashclr(sha1);
 				flag |= REF_ISBROKEN;
 			}
 			add_entry_to_dir(dir,
-					 create_ref_entry(refname.buf, sha1, flag));
+					 create_ref_entry(refname.buf, sha1, flag, 0));
 		}
 		strbuf_setlen(&refname, dirnamelen);
 	}
@@ -1353,21 +1356,40 @@ static const char *handle_missing_loose_ref(const char *refname,
 	}
 }
 
+static int escapes_cwd(const char *path) {
+	char *buf;
+	int result;
+
+	if (is_absolute_path(path))
+		return 1;
+	buf = xmalloc(strlen(path) + 1);
+	result = normalize_path_copy(buf, path);
+	free(buf);
+	return result;
+}
+
 /* This function needs to return a meaningful errno on failure */
-const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int flags, int *ref_flag)
+const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int *flags, int resolve_flags)
 {
 	int depth = MAXDEPTH;
 	ssize_t len;
 	char buffer[256];
 	static char refname_buffer[256];
+	int bad_name = 0;
 
-	if (ref_flag)
-		*ref_flag = 0;
+	if (flags)
+		*flags = 0;
 
-	if (!(flags & RESOLVE_REF_ALLOW_BAD_NAME) &&
-	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
-		errno = EINVAL;
-		return NULL;
+	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+		if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
+		    escapes_cwd(refname)) {
+			errno = EINVAL;
+			return NULL;
+		}
+		hashclr(sha1);
+		if (flags)
+			*flags |= REF_ISBROKEN;
+		bad_name = 1;
 	}
 	for (;;) {
 		char path[PATH_MAX];
@@ -1395,8 +1417,8 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int fla
 		if (lstat(path, &st) < 0) {
 			if (errno == ENOENT)
 				return handle_missing_loose_ref(refname, sha1,
-						flags & RESOLVE_REF_READING,
-						ref_flag);
+					resolve_flags & RESOLVE_REF_READING,
+					flags);
 			else
 				return NULL;
 		}
@@ -1416,8 +1438,12 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int fla
 					!check_refname_format(buffer, 0)) {
 				strcpy(refname_buffer, buffer);
 				refname = refname_buffer;
-				if (ref_flag)
-					*ref_flag |= REF_ISSYMREF;
+				if (flags)
+					*flags |= REF_ISSYMREF;
+				if (resolve_flags & RESOLVE_REF_NODEREF) {
+					hashclr(sha1);
+					return refname;
+				}
 				continue;
 			}
 		}
@@ -1462,31 +1488,37 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int fla
 			 */
 			if (get_sha1_hex(buffer, sha1) ||
 			    (buffer[40] != '\0' && !isspace(buffer[40]))) {
-				if (ref_flag)
-					*ref_flag |= REF_ISBROKEN;
+				if (flags)
+					*flags |= REF_ISBROKEN;
 				errno = EINVAL;
 				return NULL;
 			}
+			if (bad_name)
+				hashclr(sha1);
 			return refname;
 		}
-		if (ref_flag)
-			*ref_flag |= REF_ISSYMREF;
+		if (flags)
+			*flags |= REF_ISSYMREF;
 		buf = buffer + 4;
 		while (isspace(*buf))
 			buf++;
 		if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
-			if (ref_flag)
-				*ref_flag |= REF_ISBROKEN;
+			if (flags)
+				*flags |= REF_ISBROKEN;
 			errno = EINVAL;
 			return NULL;
 		}
 		refname = strcpy(refname_buffer, buf);
+		if (resolve_flags & RESOLVE_REF_NODEREF) {
+			hashclr(sha1);
+			return refname;
+		}
 	}
 }
 
-char *resolve_refdup(const char *ref, unsigned char *sha1, int flags, int *ref_flag)
+char *resolve_refdup(const char *ref, unsigned char *sha1, int *flags, int resolve_flags)
 {
-	const char *ret = resolve_ref_unsafe(ref, sha1, flags, ref_flag);
+	const char *ret = resolve_ref_unsafe(ref, sha1, flags, resolve_flags);
 	return ret ? xstrdup(ret) : NULL;
 }
 
@@ -1497,22 +1529,22 @@ struct ref_filter {
 	void *cb_data;
 };
 
-int read_ref_full(const char *refname, unsigned char *sha1, int flags, int *ref_flag)
+int read_ref_full(const char *refname, unsigned char *sha1, int *flags, int resolve_flags)
 {
-	if (resolve_ref_unsafe(refname, sha1, flags, ref_flag))
+	if (resolve_ref_unsafe(refname, sha1, flags, resolve_flags))
 		return 0;
 	return -1;
 }
 
 int read_ref(const char *refname, unsigned char *sha1)
 {
-	return read_ref_full(refname, sha1, RESOLVE_REF_READING, NULL);
+	return read_ref_full(refname, sha1, NULL, RESOLVE_REF_READING);
 }
 
 int ref_exists(const char *refname)
 {
 	unsigned char sha1[20];
-	return !!resolve_ref_unsafe(refname, sha1, RESOLVE_REF_READING, NULL);
+	return !!resolve_ref_unsafe(refname, sha1, NULL, RESOLVE_REF_READING);
 }
 
 static int filter_refs(const char *refname, const unsigned char *sha1, int flags,
@@ -1626,7 +1658,7 @@ int peel_ref(const char *refname, unsigned char *sha1)
 		return 0;
 	}
 
-	if (read_ref_full(refname, base, RESOLVE_REF_READING, &flag))
+	if (read_ref_full(refname, base, &flag, RESOLVE_REF_READING))
 		return -1;
 
 	/*
@@ -1667,7 +1699,7 @@ static int warn_if_dangling_symref(const char *refname, const unsigned char *sha
 	if (!(flags & REF_ISSYMREF))
 		return 0;
 
-	resolves_to = resolve_ref_unsafe(refname, junk, 0, NULL);
+	resolves_to = resolve_ref_unsafe(refname, junk, NULL, 0);
 	if (!resolves_to
 	    || (d->refname
 		? strcmp(resolves_to, d->refname)
@@ -1792,7 +1824,7 @@ static int do_head_ref(const char *submodule, each_ref_fn fn, void *cb_data)
 		return 0;
 	}
 
-	if (!read_ref_full("HEAD", sha1, RESOLVE_REF_READING, &flag))
+	if (!read_ref_full("HEAD", sha1, &flag, RESOLVE_REF_READING))
 		return fn("HEAD", sha1, flag, cb_data);
 
 	return 0;
@@ -1872,7 +1904,7 @@ int head_ref_namespaced(each_ref_fn fn, void *cb_data)
 	int flag;
 
 	strbuf_addf(&buf, "%sHEAD", get_git_namespace());
-	if (!read_ref_full(buf.buf, sha1, RESOLVE_REF_READING, &flag))
+	if (!read_ref_full(buf.buf, sha1, &flag, RESOLVE_REF_READING))
 		ret = fn(buf.buf, sha1, flag, cb_data);
 	strbuf_release(&buf);
 
@@ -1967,8 +1999,8 @@ int refname_match(const char *abbrev_name, const char *full_name)
 static struct ref_lock *verify_lock(struct ref_lock *lock,
 	const unsigned char *old_sha1, int mustexist)
 {
-	if (read_ref_full(lock->ref_name, lock->old_sha1,
-			  mustexist ? RESOLVE_REF_READING : 0, NULL)) {
+	if (read_ref_full(lock->ref_name, lock->old_sha1, NULL,
+			  mustexist ? RESOLVE_REF_READING : 0)) {
 		int save_errno = errno;
 		error("Can't verify ref %s", lock->ref_name);
 		unlock_ref(lock);
@@ -2041,8 +2073,8 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
 
 		this_result = refs_found ? sha1_from_ref : sha1;
 		mksnpath(fullref, sizeof(fullref), *p, len, str);
-		r = resolve_ref_unsafe(fullref, this_result,
-				       RESOLVE_REF_READING, &flag);
+		r = resolve_ref_unsafe(fullref, this_result, &flag,
+				       RESOLVE_REF_READING);
 		if (r) {
 			if (!refs_found++)
 				*ref = xstrdup(r);
@@ -2071,7 +2103,7 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
 		const char *ref, *it;
 
 		mksnpath(path, sizeof(path), *p, len, str);
-		ref = resolve_ref_unsafe(path, hash, RESOLVE_REF_READING, NULL);
+		ref = resolve_ref_unsafe(path, hash, NULL, RESOLVE_REF_READING);
 		if (!ref)
 			continue;
 		if (reflog_exists(path))
@@ -2097,8 +2129,8 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
  */
 static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 					    const unsigned char *old_sha1,
-					    int flags, int *type_p,
-					    const char **skip, int skipnum)
+					    struct string_list *skiplist,
+					    int flags, int *type_p)
 {
 	char *ref_file;
 	const char *orig_refname = refname;
@@ -2106,22 +2138,23 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 	int last_errno = 0;
 	int type, lflags;
 	int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
-	int resolve_flags;
+	int resolve_flags = 0;
 	int missing = 0;
 	int attempts_remaining = 3;
-	int bad_refname;
 
 	lock = xcalloc(1, sizeof(struct ref_lock));
 	lock->lock_fd = -1;
 
-	bad_refname = check_refname_format(refname, REFNAME_ALLOW_ONELEVEL);
+	if (flags & REF_BADNAMEOK)
+		resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
 
-	resolve_flags = RESOLVE_REF_ALLOW_BAD_NAME;
 	if (mustexist)
 		resolve_flags |= RESOLVE_REF_READING;
+	if (flags & REF_NODEREF)
+		resolve_flags |= RESOLVE_REF_NODEREF;
 
-	refname = resolve_ref_unsafe(refname, lock->old_sha1, resolve_flags,
-				     &type);
+	refname = resolve_ref_unsafe(refname, lock->old_sha1, &type,
+				     resolve_flags);
 	if (!refname && errno == EISDIR) {
 		/* we are trying to lock foo but we used to
 		 * have foo/bar which now does not exist;
@@ -2135,7 +2168,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 			goto error_return;
 		}
 		refname = resolve_ref_unsafe(orig_refname, lock->old_sha1,
-					     resolve_flags, &type);
+					     &type, resolve_flags);
 	}
 	if (type_p)
 	    *type_p = type;
@@ -2153,7 +2186,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 	 */
 	if (missing &&
 	     !is_refname_available(refname, get_packed_refs(&ref_cache),
-				   skip, skipnum)) {
+				   skiplist)) {
 		last_errno = ENOTDIR;
 		goto error_return;
 	}
@@ -2199,8 +2232,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 		else
 			unable_to_lock_index_die(ref_file, errno);
 	}
-	if (bad_refname)
-		return lock;
 	return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock;
 
  error_return:
@@ -2213,7 +2244,7 @@ struct ref_lock *lock_any_ref_for_update(const char *refname,
 					 const unsigned char *old_sha1,
 					 int flags, int *type_p)
 {
-	return lock_ref_sha1_basic(refname, old_sha1, flags, type_p, NULL, 0);
+	return lock_ref_sha1_basic(refname, old_sha1, NULL, flags, type_p);
 }
 
 /*
@@ -2364,9 +2395,8 @@ static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
 		packed_entry->flag = REF_ISPACKED | REF_KNOWS_PEELED;
 		hashcpy(packed_entry->u.value.sha1, entry->u.value.sha1);
 	} else {
-		packed_entry = create_ref_entry(entry->name,
-					entry->u.value.sha1,
-					REF_ISPACKED | REF_KNOWS_PEELED);
+		packed_entry = create_ref_entry(entry->name, entry->u.value.sha1,
+						REF_ISPACKED | REF_KNOWS_PEELED, 0);
 		add_ref(cb->packed_refs, packed_entry);
 	}
 	hashcpy(packed_entry->u.value.peeled, entry->u.value.peeled);
@@ -2491,7 +2521,7 @@ static int curate_packed_ref_fn(struct ref_entry *entry, void *cb_data)
 		unsigned char sha1[20];
 		int flags;
 
-		if (read_ref_full(entry->name, sha1, 0, &flags))
+		if (read_ref_full(entry->name, sha1, &flags, 0))
 			/* We should at least have found the packed ref. */
 			die("Internal error");
 		if ((flags & REF_ISSYMREF) || !(flags & REF_ISPACKED)) {
@@ -2530,6 +2560,8 @@ int repack_without_refs(const char **refnames, int n, struct strbuf *err)
 	struct string_list_item *ref_to_delete;
 	int i, ret, removed = 0;
 
+	assert(err);
+
 	/* Look for a packed ref */
 	for (i = 0; i < n; i++)
 		if (get_packed_ref(refnames[i]))
@@ -2540,13 +2572,8 @@ int repack_without_refs(const char **refnames, int n, struct strbuf *err)
 		return 0; /* no refname exists in packed refs */
 
 	if (lock_packed_refs(0)) {
-		if (err) {
-			unable_to_lock_message(git_path("packed-refs"), errno,
-					       err);
-			return -1;
-		}
-		unable_to_lock_error(git_path("packed-refs"), errno);
-		return error("cannot delete '%s' from packed refs", refnames[i]);
+		unable_to_lock_message(git_path("packed-refs"), errno, err);
+		return -1;
 	}
 	packed = get_packed_refs(&ref_cache);
 
@@ -2572,7 +2599,7 @@ int repack_without_refs(const char **refnames, int n, struct strbuf *err)
 
 	/* Write what remains */
 	ret = commit_packed_refs();
-	if (ret && err)
+	if (ret)
 		strbuf_addf(err, "unable to overwrite old ref-pack file: %s",
 			    strerror(errno));
 	return ret;
@@ -2580,6 +2607,8 @@ int repack_without_refs(const char **refnames, int n, struct strbuf *err)
 
 static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err)
 {
+	assert(err);
+
 	if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
 		/* loose */
 		int res, i = strlen(lock->lk->filename) - 5; /* .lock */
@@ -2678,25 +2707,31 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 	struct stat loginfo;
 	int log = !lstat(git_path("logs/%s", oldrefname), &loginfo);
 	const char *symref = NULL;
+	struct string_list skiplist = STRING_LIST_INIT_NODUP;
 
 	if (log && S_ISLNK(loginfo.st_mode))
 		return error("reflog for %s is a symlink", oldrefname);
 
-	symref = resolve_ref_unsafe(oldrefname, orig_sha1,
-				    RESOLVE_REF_READING, &flag);
+	symref = resolve_ref_unsafe(oldrefname, orig_sha1, &flag,
+				    RESOLVE_REF_READING);
 	if (flag & REF_ISSYMREF)
 		return error("refname %s is a symbolic ref, renaming it is not supported",
 			oldrefname);
 	if (!symref)
 		return error("refname %s not found", oldrefname);
 
+	string_list_insert(&skiplist, oldrefname);
 	if (!is_refname_available(newrefname, get_packed_refs(&ref_cache),
-				  &oldrefname, 1))
+				  &skiplist)) {
+		string_list_clear(&skiplist, 0);
 		return 1;
-
+	}
 	if (!is_refname_available(newrefname, get_loose_refs(&ref_cache),
-				  &oldrefname, 1))
+				  &skiplist)) {
+		string_list_clear(&skiplist, 0);
 		return 1;
+	}
+	string_list_clear(&skiplist, 0);
 
 	if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG)))
 		return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s",
@@ -2707,7 +2742,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 		goto rollback;
 	}
 
-	if (!read_ref_full(newrefname, sha1, RESOLVE_REF_READING, NULL) &&
+	if (!read_ref_full(newrefname, sha1, NULL, RESOLVE_REF_READING) &&
 	    delete_ref(newrefname, sha1, REF_NODEREF)) {
 		if (errno==EISDIR) {
 			if (remove_empty_directories(git_path("%s", newrefname))) {
@@ -2725,7 +2760,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 
 	logmoved = log;
 
-	lock = lock_ref_sha1_basic(newrefname, NULL, 0, NULL, NULL, 0);
+	lock = lock_ref_sha1_basic(newrefname, NULL, NULL, 0, NULL);
 	if (!lock) {
 		error("unable to lock %s for update", newrefname);
 		goto rollback;
@@ -2740,7 +2775,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 	return 0;
 
  rollback:
-	lock = lock_ref_sha1_basic(oldrefname, NULL, 0, NULL, NULL, 0);
+	lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, 0, NULL);
 	if (!lock) {
 		error("unable to lock %s for rollback", oldrefname);
 		goto rollbacklog;
@@ -2985,8 +3020,8 @@ static int write_ref_sha1(struct ref_lock *lock,
 		unsigned char head_sha1[20];
 		int head_flag;
 		const char *head_ref;
-		head_ref = resolve_ref_unsafe("HEAD", head_sha1,
-					      RESOLVE_REF_READING, &head_flag);
+		head_ref = resolve_ref_unsafe("HEAD", head_sha1, &head_flag,
+					      RESOLVE_REF_READING);
 		if (head_ref && (head_flag & REF_ISSYMREF) &&
 		    !strcmp(head_ref, lock->ref_name))
 			log_ref_write("HEAD", lock->old_sha1, sha1, logmsg);
@@ -3353,7 +3388,7 @@ static int do_for_each_reflog(struct strbuf *name, each_ref_fn fn, void *cb_data
 				retval = do_for_each_reflog(name, fn, cb_data);
 			} else {
 				unsigned char sha1[20];
-				if (read_ref_full(name->buf, sha1, 0, NULL))
+				if (read_ref_full(name->buf, sha1, NULL, 0))
 					retval = error("bad ref for %s", name->buf);
 				else
 					retval = fn(name->buf, sha1, 0, cb_data);
@@ -3423,6 +3458,8 @@ struct ref_transaction {
 
 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
 {
+	assert(err);
+
 	return xcalloc(1, sizeof(struct ref_transaction));
 }
 
@@ -3462,6 +3499,8 @@ int ref_transaction_update(struct ref_transaction *transaction,
 {
 	struct ref_update *update;
 
+	assert(err);
+
 	if (transaction->state != REF_TRANSACTION_OPEN)
 		die("BUG: update called for transaction that is not open");
 
@@ -3470,7 +3509,8 @@ int ref_transaction_update(struct ref_transaction *transaction,
 
 	if (!is_null_sha1(new_sha1) &&
 	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
-		strbuf_addf(err, "Bad refname: %s", refname);
+		strbuf_addf(err, "refusing to update ref with bad name %s",
+			    refname);
 		return -1;
 	}
 
@@ -3493,6 +3533,8 @@ int ref_transaction_create(struct ref_transaction *transaction,
 {
 	struct ref_update *update;
 
+	assert(err);
+
 	if (transaction->state != REF_TRANSACTION_OPEN)
 		die("BUG: create called for transaction that is not open");
 
@@ -3500,7 +3542,8 @@ int ref_transaction_create(struct ref_transaction *transaction,
 		die("BUG: create ref with null new_sha1");
 
 	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
-		strbuf_addf(err, "Bad refname: %s", refname);
+		strbuf_addf(err, "refusing to create ref with bad name %s",
+			    refname);
 		return -1;
 	}
 
@@ -3523,6 +3566,8 @@ int ref_transaction_delete(struct ref_transaction *transaction,
 {
 	struct ref_update *update;
 
+	assert(err);
+
 	if (transaction->state != REF_TRANSACTION_OPEN)
 		die("BUG: delete called for transaction that is not open");
 
@@ -3585,13 +3630,14 @@ static int ref_update_reject_duplicates(struct ref_update **updates, int n,
 					struct strbuf *err)
 {
 	int i;
+
+	assert(err);
+
 	for (i = 1; i < n; i++)
 		if (!strcmp(updates[i - 1]->refname, updates[i]->refname)) {
-			const char *str =
-				"Multiple updates for ref '%s' not allowed.";
-			if (err)
-				strbuf_addf(err, str, updates[i]->refname);
-
+			strbuf_addf(err,
+				    "Multiple updates for ref '%s' not allowed.",
+				    updates[i]->refname);
 			return 1;
 		}
 	return 0;
@@ -3600,11 +3646,13 @@ static int ref_update_reject_duplicates(struct ref_update **updates, int n,
 int ref_transaction_commit(struct ref_transaction *transaction,
 			   struct strbuf *err)
 {
-	int ret = 0, delnum = 0, i, df_conflict = 0;
+	int ret = 0, delnum = 0, i;
 	const char **delnames;
 	int n = transaction->nr;
 	struct ref_update **updates = transaction->updates;
 
+	assert(err);
+
 	if (transaction->state != REF_TRANSACTION_OPEN)
 		die("BUG: commit called for transaction that is not open");
 
@@ -3631,16 +3679,15 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 						   (update->have_old ?
 						    update->old_sha1 :
 						    NULL),
+						   NULL,
 						   update->flags,
-						   &update->type,
-						   delnames, delnum);
+						   &update->type);
 		if (!update->lock) {
-			if (errno == ENOTDIR)
-				df_conflict = 1;
-			if (err)
-				strbuf_addf(err, "Cannot lock the ref '%s'.",
-					    update->refname);
-			ret = -1;
+			int df_conflict = (errno == ENOTDIR);
+
+			strbuf_addf(err, "Cannot lock the ref '%s'.",
+				    update->refname);
+			ret = df_conflict ? UPDATE_REFS_NAME_CONFLICT : -1;
 			goto cleanup;
 		}
 	}
@@ -3654,9 +3701,8 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 					     update->msg);
 			update->lock = NULL; /* freed by write_ref_sha1 */
 			if (ret) {
-				if (err)
-					strbuf_addf(err, "Cannot update the ref '%s'.",
-						    update->refname);
+				strbuf_addf(err, "Cannot update the ref '%s'.",
+					    update->refname);
 				ret = -1;
 				goto cleanup;
 			}
@@ -3668,16 +3714,20 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 		struct ref_update *update = updates[i];
 
 		if (update->lock) {
-			if (delete_ref_loose(update->lock, update->type, err))
+			if (delete_ref_loose(update->lock, update->type, err)) {
 				ret = -1;
+				goto cleanup;
+			}
 
 			if (!(update->flags & REF_ISPRUNING))
 				delnames[delnum++] = update->lock->ref_name;
 		}
 	}
 
-	if (repack_without_refs(delnames, delnum, err))
+	if (repack_without_refs(delnames, delnum, err)) {
 		ret = -1;
+		goto cleanup;
+	}
 	for (i = 0; i < delnum; i++)
 		unlink_or_warn(git_path("logs/%s", delnames[i]));
 	clear_loose_ref_cache(&ref_cache);
@@ -3689,8 +3739,6 @@ cleanup:
 		if (updates[i]->lock)
 			unlock_ref(updates[i]->lock);
 	free(delnames);
-	if (df_conflict)
-		ret = -2;
 	return ret;
 }
 
diff --git c/refs.h w/refs.h
index a7b8009..a96e174 100644
--- c/refs.h
+++ w/refs.h
@@ -175,10 +175,12 @@ extern int peel_ref(const char *refname, unsigned char *sha1);
  * ref_transaction_create(), etc.
  * REF_NODEREF: act on the ref directly, instead of dereferencing
  *              symbolic references.
+ * REF_BADNAMEOK: allow locking a ref that has a bad name.
  *
  * Flags >= 0x100 are reserved for internal use.
  */
 #define REF_NODEREF	0x01
+#define REF_BADNAMEOK	0x02
 /*
  * This function sets errno to something meaningful on failure.
  */
@@ -322,11 +324,10 @@ int ref_transaction_delete(struct ref_transaction *transaction,
  * Commit all of the changes that have been queued in transaction, as
  * atomically as possible.  Return a nonzero value if there is a
  * problem.
- * If the transaction is already in failed state this function will return
- * an error.
+ *
  * Function returns 0 on success, -1 for generic failures and
- * UPDATE_REFS_NAME_CONFLICT (-2) if the failure was due to a name
- * collision (ENOTDIR).
+ * UPDATE_REFS_NAME_CONFLICT (-2) if the failure was due to a naming conflict.
+ * For example, the ref names A and A/B conflict.
  */
 #define UPDATE_REFS_NAME_CONFLICT -2
 int ref_transaction_commit(struct ref_transaction *transaction,
diff --git c/remote.c w/remote.c
index 2adb31c..67c375d 100644
--- c/remote.c
+++ w/remote.c
@@ -486,7 +486,7 @@ static void read_config(void)
 		return;
 	default_remote_name = "origin";
 	current_branch = NULL;
-	head_ref = resolve_ref_unsafe("HEAD", sha1, 0, &flag);
+	head_ref = resolve_ref_unsafe("HEAD", sha1, &flag, 0);
 	if (head_ref && (flag & REF_ISSYMREF) &&
 	    starts_with(head_ref, "refs/heads/")) {
 		current_branch =
@@ -1121,8 +1121,8 @@ static char *guess_ref(const char *name, struct ref *peer)
 	struct strbuf buf = STRBUF_INIT;
 	unsigned char sha1[20];
 
-	const char *r = resolve_ref_unsafe(peer->name, sha1,
-					   RESOLVE_REF_READING, NULL);
+	const char *r = resolve_ref_unsafe(peer->name, sha1, NULL,
+					   RESOLVE_REF_READING);
 	if (!r)
 		return NULL;
 
@@ -1183,8 +1183,8 @@ static int match_explicit(struct ref *src, struct ref *dst,
 		unsigned char sha1[20];
 		int flag;
 
-		dst_value = resolve_ref_unsafe(matched_src->name, sha1,
-					       RESOLVE_REF_READING, &flag);
+		dst_value = resolve_ref_unsafe(matched_src->name, sha1, &flag,
+					       RESOLVE_REF_READING);
 		if (!dst_value ||
 		    ((flag & REF_ISSYMREF) &&
 		     !starts_with(dst_value, "refs/heads/")))
@@ -1658,7 +1658,7 @@ static int ignore_symref_update(const char *refname)
 	unsigned char sha1[20];
 	int flag;
 
-	if (!resolve_ref_unsafe(refname, sha1, 0, &flag))
+	if (!resolve_ref_unsafe(refname, sha1, &flag, 0))
 		return 0; /* non-existing refs are OK */
 	return (flag & REF_ISSYMREF);
 }
diff --git c/sequencer.c w/sequencer.c
index ebe8713..6a05ad4 100644
--- c/sequencer.c
+++ w/sequencer.c
@@ -366,7 +366,7 @@ static int is_index_unchanged(void)
 	unsigned char head_sha1[20];
 	struct commit *head_commit;
 
-	if (!resolve_ref_unsafe("HEAD", head_sha1, RESOLVE_REF_READING, NULL))
+	if (!resolve_ref_unsafe("HEAD", head_sha1, NULL, RESOLVE_REF_READING))
 		return error(_("Could not resolve HEAD commit\n"));
 
 	head_commit = lookup_commit(head_sha1);
@@ -912,7 +912,7 @@ static int rollback_single_pick(void)
 	if (!file_exists(git_path("CHERRY_PICK_HEAD")) &&
 	    !file_exists(git_path("REVERT_HEAD")))
 		return error(_("no cherry-pick or revert in progress"));
-	if (read_ref_full("HEAD", head_sha1, 0, NULL))
+	if (read_ref_full("HEAD", head_sha1, NULL, 0))
 		return error(_("cannot resolve HEAD"));
 	if (is_null_sha1(head_sha1))
 		return error(_("cannot abort from a branch yet to be born"));
diff --git c/t/t1400-update-ref.sh w/t/t1400-update-ref.sh
index 0218e96..ff4607b 100755
--- c/t/t1400-update-ref.sh
+++ w/t/t1400-update-ref.sh
@@ -110,6 +110,22 @@ test_expect_success "delete symref without dereference when the referred ref is
 cp -f .git/HEAD.orig .git/HEAD
 git update-ref -d $m
 
+test_expect_success 'update-ref -d is not confused by self-reference' '
+	git symbolic-ref refs/heads/self refs/heads/self &&
+	test_when_finished "rm -f .git/refs/heads/self" &&
+	test_path_is_file .git/refs/heads/self &&
+	test_must_fail git update-ref -d refs/heads/self &&
+	test_path_is_file .git/refs/heads/self
+'
+
+test_expect_success 'update-ref --no-deref -d can delete self-reference' '
+	git symbolic-ref refs/heads/self refs/heads/self &&
+	test_when_finished "rm -f .git/refs/heads/self" &&
+	test_path_is_file .git/refs/heads/self &&
+	git update-ref --no-deref -d refs/heads/self &&
+	test_path_is_missing .git/refs/heads/self
+'
+
 test_expect_success '(not) create HEAD with old sha1' "
 	test_must_fail git update-ref HEAD $A $B
 "
diff --git c/t/t1402-check-ref-format.sh w/t/t1402-check-ref-format.sh
index 1a5a5f3..058fa37 100755
--- c/t/t1402-check-ref-format.sh
+++ w/t/t1402-check-ref-format.sh
@@ -196,4 +196,52 @@ invalid_ref_normalized 'heads///foo.lock'
 invalid_ref_normalized 'foo.lock/bar'
 invalid_ref_normalized 'foo.lock///bar'
 
+test_expect_success 'git branch shows badly named ref' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch >output &&
+	grep -e "broken...ref" output
+'
+
+test_expect_success 'git branch -d can delete badly named ref' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch -d broken...ref &&
+	git branch >output &&
+	! grep -e "broken...ref" output
+'
+
+test_expect_success 'git branch -D can delete badly named ref' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch -D broken...ref &&
+	git branch >output &&
+	! grep -e "broken...ref" output
+'
+
+test_expect_success 'git update-ref -d can delete badly named ref' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git update-ref -d refs/heads/broken...ref &&
+	git branch >output &&
+	! grep -e "broken...ref" output
+'
+
+test_expect_success 'git branch can not create a badly named ref' '
+	test_must_fail git branch broken...ref
+'
+
+test_expect_success 'git branch can not rename to a bad ref name' '
+	git branch goodref &&
+	test_must_fail git branch -m goodref broken...ref
+'
+
+test_expect_failure 'git branch can rename from a bad ref name' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch -m broken...ref renamed &&
+	test_must_fail git rev-parse broken...ref &&
+	test_cmp_rev master renamed
+'
+
 test_done
diff --git c/t/t3200-branch.sh w/t/t3200-branch.sh
index ac31b71..432921b 100755
--- c/t/t3200-branch.sh
+++ w/t/t3200-branch.sh
@@ -285,6 +285,15 @@ test_expect_success 'deleting a dangling symref' '
 	test_i18ncmp expect actual
 '
 
+test_expect_success 'deleting a self-referential symref' '
+	git symbolic-ref refs/heads/self-reference refs/heads/self-reference &&
+	test_path_is_file .git/refs/heads/self-reference &&
+	echo "Deleted branch self-reference (was refs/heads/self-reference)." >expect &&
+	git branch -d self-reference >actual &&
+	test_path_is_missing .git/refs/heads/self-reference &&
+	test_i18ncmp expect actual
+'
+
 test_expect_success 'renaming a symref is not allowed' '
 	git symbolic-ref refs/heads/master2 refs/heads/master &&
 	test_must_fail git branch -m master2 master3 &&
diff --git c/t/t7001-mv.sh w/t/t7001-mv.sh
index 54d7807..69f11bd 100755
--- c/t/t7001-mv.sh
+++ w/t/t7001-mv.sh
@@ -350,10 +350,11 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu
 '
 
 test_expect_success 'git mv moves a submodule with gitfile' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	(
 		cd mod &&
 		git mv ../sub/ .
@@ -372,11 +373,12 @@ test_expect_success 'git mv moves a submodule with gitfile' '
 '
 
 test_expect_success 'mv does not complain when no .gitmodules file is found' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git rm .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	! test -s actual.err &&
 	! test -e sub &&
@@ -390,11 +392,12 @@ test_expect_success 'mv does not complain when no .gitmodules file is found' '
 '
 
 test_expect_success 'mv will error out on a modified .gitmodules file unless staged' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules foo.bar true &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	test_must_fail git mv sub mod/sub 2>actual.err &&
 	test -s actual.err &&
 	test -e sub &&
@@ -413,13 +416,14 @@ test_expect_success 'mv will error out on a modified .gitmodules file unless sta
 '
 
 test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules --remove-section submodule.sub &&
 	git add .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
 	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	test_i18ncmp expect.err actual.err &&
 	! test -e sub &&
@@ -433,9 +437,10 @@ test_expect_success 'mv issues a warning when section is not found in .gitmodule
 '
 
 test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
+	mkdir mod &&
 	git mv -n sub mod/sub 2>actual.err &&
 	test -f sub/.git &&
 	git diff-index --exit-code HEAD &&
diff --git c/transport-helper.c w/transport-helper.c
index 270ae28..8365441 100644
--- c/transport-helper.c
+++ w/transport-helper.c
@@ -889,7 +889,9 @@ static int push_refs_with_export(struct transport *transport,
 					int flag;
 
 					/* Follow symbolic refs (mainly for HEAD). */
-					name = resolve_ref_unsafe(ref->peer_ref->name, sha1, RESOLVE_REF_READING, &flag);
+					name = resolve_ref_unsafe(
+						 ref->peer_ref->name, sha1,
+						 &flag, RESOLVE_REF_READING);
 					if (!name || !(flag & REF_ISSYMREF))
 						name = ref->peer_ref->name;
 
diff --git c/transport.c w/transport.c
index f40e950..3ba7bbf 100644
--- c/transport.c
+++ w/transport.c
@@ -168,8 +168,8 @@ static void set_upstreams(struct transport *transport, struct ref *refs,
 		/* Follow symbolic refs (mainly for HEAD). */
 		localname = ref->peer_ref->name;
 		remotename = ref->name;
-		tmp = resolve_ref_unsafe(localname, sha,
-					 RESOLVE_REF_READING, &flag);
+		tmp = resolve_ref_unsafe(localname, sha, &flag,
+					 RESOLVE_REF_READING);
 		if (tmp && flag & REF_ISSYMREF &&
 			starts_with(tmp, "refs/heads/"))
 			localname = tmp;
@@ -754,7 +754,7 @@ void transport_print_push_status(const char *dest, struct ref *refs,
 	unsigned char head_sha1[20];
 	char *head;
 
-	head = resolve_refdup("HEAD", head_sha1, RESOLVE_REF_READING, NULL);
+	head = resolve_refdup("HEAD", head_sha1, NULL, RESOLVE_REF_READING);
 
 	if (verbose) {
 		for (ref = refs; ref; ref = ref->next)
diff --git c/upload-pack.c w/upload-pack.c
index 01de944..3b51ccb 100644
--- c/upload-pack.c
+++ w/upload-pack.c
@@ -743,7 +743,7 @@ static int find_symref(const char *refname, const unsigned char *sha1, int flag,
 
 	if ((flag & REF_ISSYMREF) == 0)
 		return 0;
-	symref_target = resolve_ref_unsafe(refname, unused, 0, &flag);
+	symref_target = resolve_ref_unsafe(refname, unused, &flag, 0);
 	if (!symref_target || (flag & REF_ISSYMREF) == 0)
 		die("'%s' is a symref but it is not?", refname);
 	item = string_list_append(cb_data, refname);
diff --git c/wrapper.c w/wrapper.c
index 74a0cc0..ec7a08b 100644
--- c/wrapper.c
+++ w/wrapper.c
@@ -430,8 +430,8 @@ int xmkstemp_mode(char *template, int mode)
 static int warn_if_unremovable(const char *op, const char *file, int rc)
 {
 	int err;
-	if (rc >= 0 || errno == ENOENT)
-		return rc;
+	if (!rc || errno == ENOENT)
+		return 0;
 	err = errno;
 	warning("unable to %s %s: %s", op, file, strerror(errno));
 	errno = err;
@@ -440,20 +440,16 @@ static int warn_if_unremovable(const char *op, const char *file, int rc)
 
 int unlink_or_msg(const char *file, struct strbuf *err)
 {
-	if (err) {
-		int rc = unlink(file);
-		int save_errno = errno;
+	int rc = unlink(file);
 
-		if (rc < 0 && errno != ENOENT) {
-			strbuf_addf(err, "unable to unlink %s: %s",
-				    file, strerror(errno));
-			errno = save_errno;
-			return -1;
-		}
+	assert(err);
+
+	if (!rc || errno == ENOENT)
 		return 0;
-	}
 
-	return unlink_or_warn(file);
+	strbuf_addf(err, "unable to unlink %s: %s",
+		    file, strerror(errno));
+	return -1;
 }
 
 int unlink_or_warn(const char *file)
diff --git c/wt-status.c w/wt-status.c
index 318a191..6819e2b 100644
--- c/wt-status.c
+++ w/wt-status.c
@@ -128,7 +128,7 @@ void wt_status_prepare(struct wt_status *s)
 	s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
 	s->use_color = -1;
 	s->relative_paths = 1;
-	s->branch = resolve_refdup("HEAD", sha1, 0, NULL);
+	s->branch = resolve_refdup("HEAD", sha1, NULL, 0);
 	s->reference = "HEAD";
 	s->fp = stdout;
 	s->index_file = get_index_file();

^ permalink raw reply related	[relevance 2%]

* Re: [RFC/PATCH] Windows tests: let $TRASH_DIRECTORY point to native Windows path
  2014-07-29 19:43  0%     ` [RFC/PATCH] Windows tests: let $TRASH_DIRECTORY point to native Windows path Karsten Blees
@ 2014-08-27 13:08  0%       ` Duy Nguyen
  0 siblings, 0 replies; 200+ results
From: Duy Nguyen @ 2014-08-27 13:08 UTC (permalink / raw)
  To: Git Mailing List, msysGit; +Cc: Junio C Hamano, Karsten Blees

Ping...

On Wed, Jul 30, 2014 at 2:43 AM, Karsten Blees <karsten.blees@gmail.com> wrote:
> MSYS programs typically understand native Windows paths (e.g C:/git), but
> native Windows programs (including MinGW) don't understand MSYS paths (e.g.
> /c/git).
>
> On Windows, set TRASH_DIRECTORY to the absolute native path so that it can
> be used more easily in tests.
>
> MSYS 'tar -f' interprets everything before ':' as hostname, not as drive
> letter. Change respective tests to use stdin / stdout instead of '-f'. Also
> use $TAR from GIT-BUILD-OPTIONS rather than hardcoded tar.
>
> Signed-off-by: Karsten Blees <blees@dcon.de>
> ---
>
> Am 25.07.2014 14:30, schrieb Duy Nguyen:
>> On Wed, Jul 23, 2014 at 9:17 PM, Karsten Blees <karsten.blees@gmail.com> wrote:
>>> With the version in pu, three tests fail. t7001 is fixed with a newer 'cp'.
>>> The other two are unrelated (introduced by nd/multiple-work-trees topic).
>>>
>>> * t1501-worktree: failed 1
>>>   As of 5bbcb072 "setup.c: support multi-checkout repo setup"
>>>   Using $TRASH_DIRECTORY doesn't work on Windows.
>>>
>>> * t2026-prune-linked-checkouts: failed 1
>>>   As of 404a45f1 "prune: strategies for linked checkouts"
>>>   Dito.
>>
>> I need your help here. Would saving $(pwd) to a variable and using it
>> instead of $TRASH_DIRECTORY work? Some tests "cd" around and $(pwd)
>> may not be the same as $TRASH_DIRECTORY.
>>
>
> Yes, that would work.
>
> (Actually, you'd only need to change 'echo "$TRASH_DIR..."' in two places (both
> before cd'ing away). The other instances are parameters to non-msys programs and
> are thus automatically mangled by msys.dll.)
>
> However, I wonder why we don't set up TRASH_DIRECTORY to the native Windows path.
> I believe we'd get much fewer 'special' cases that way. Ideally, you shouldn't
> have to worry about the intricacies of MSYS path mangling when writing tests...
>
> [CCing msysgit for opinions]
>
>
>  t/t3513-revert-submodule.sh | 4 ++--
>  t/t6041-bisect-submodule.sh | 4 ++--
>  t/test-lib.sh               | 1 +
>  3 files changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh
> index a1c4e02..4a44dd6 100755
> --- a/t/t3513-revert-submodule.sh
> +++ b/t/t3513-revert-submodule.sh
> @@ -14,11 +14,11 @@ test_description='revert can handle submodules'
>  git_revert () {
>         git status -su >expect &&
>         ls -1pR * >>expect &&
> -       tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
> +       "$TAR" cz * >"$TRASH_DIRECTORY/tmp.tgz" &&
>         git checkout "$1" &&
>         git revert HEAD &&
>         rm -rf * &&
> -       tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
> +       "$TAR" xz <"$TRASH_DIRECTORY/tmp.tgz" &&
>         git status -su >actual &&
>         ls -1pR * >>actual &&
>         test_cmp expect actual &&
> diff --git a/t/t6041-bisect-submodule.sh b/t/t6041-bisect-submodule.sh
> index c6b7aa6..0de614f 100755
> --- a/t/t6041-bisect-submodule.sh
> +++ b/t/t6041-bisect-submodule.sh
> @@ -8,7 +8,7 @@ test_description='bisect can handle submodules'
>  git_bisect () {
>         git status -su >expect &&
>         ls -1pR * >>expect &&
> -       tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
> +       "$TAR" cz * > "$TRASH_DIRECTORY/tmp.tgz" &&
>         GOOD=$(git rev-parse --verify HEAD) &&
>         git checkout "$1" &&
>         echo "foo" >bar &&
> @@ -20,7 +20,7 @@ git_bisect () {
>         git bisect start &&
>         git bisect good $GOOD &&
>         rm -rf * &&
> -       tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
> +       "$TAR" xz <"$TRASH_DIRECTORY/tmp.tgz" &&
>         git status -su >actual &&
>         ls -1pR * >>actual &&
>         test_cmp expect actual &&
> diff --git a/t/test-lib.sh b/t/test-lib.sh
> index 5102340..5f6397b 100644
> --- a/t/test-lib.sh
> +++ b/t/test-lib.sh
> @@ -868,6 +868,7 @@ case $(uname -s) in
>                 md5sum "$@"
>         }
>         # git sees Windows-style pwd
> +       TRASH_DIRECTORY=$(pwd -W)
>         pwd () {
>                 builtin pwd -W
>         }
> --
> 2.0.2.897.g7f80809.dirty
>



-- 
Duy

^ permalink raw reply	[relevance 0%]

* [RFC/PATCH] Windows tests: let $TRASH_DIRECTORY point to native Windows path
  2014-07-25 12:30  0%   ` Duy Nguyen
@ 2014-07-29 19:43  0%     ` Karsten Blees
  2014-08-27 13:08  0%       ` Duy Nguyen
  0 siblings, 1 reply; 200+ results
From: Karsten Blees @ 2014-07-29 19:43 UTC (permalink / raw)
  To: Duy Nguyen; +Cc: Junio C Hamano, Git Mailing List, msysGit

MSYS programs typically understand native Windows paths (e.g C:/git), but
native Windows programs (including MinGW) don't understand MSYS paths (e.g.
/c/git).

On Windows, set TRASH_DIRECTORY to the absolute native path so that it can
be used more easily in tests.

MSYS 'tar -f' interprets everything before ':' as hostname, not as drive
letter. Change respective tests to use stdin / stdout instead of '-f'. Also
use $TAR from GIT-BUILD-OPTIONS rather than hardcoded tar.

Signed-off-by: Karsten Blees <blees@dcon.de>
---

Am 25.07.2014 14:30, schrieb Duy Nguyen:
> On Wed, Jul 23, 2014 at 9:17 PM, Karsten Blees <karsten.blees@gmail.com> wrote:
>> With the version in pu, three tests fail. t7001 is fixed with a newer 'cp'.
>> The other two are unrelated (introduced by nd/multiple-work-trees topic).
>>
>> * t1501-worktree: failed 1
>>   As of 5bbcb072 "setup.c: support multi-checkout repo setup"
>>   Using $TRASH_DIRECTORY doesn't work on Windows.
>>
>> * t2026-prune-linked-checkouts: failed 1
>>   As of 404a45f1 "prune: strategies for linked checkouts"
>>   Dito.
> 
> I need your help here. Would saving $(pwd) to a variable and using it
> instead of $TRASH_DIRECTORY work? Some tests "cd" around and $(pwd)
> may not be the same as $TRASH_DIRECTORY.
> 

Yes, that would work.

(Actually, you'd only need to change 'echo "$TRASH_DIR..."' in two places (both
before cd'ing away). The other instances are parameters to non-msys programs and
are thus automatically mangled by msys.dll.)

However, I wonder why we don't set up TRASH_DIRECTORY to the native Windows path.
I believe we'd get much fewer 'special' cases that way. Ideally, you shouldn't
have to worry about the intricacies of MSYS path mangling when writing tests...

[CCing msysgit for opinions]


 t/t3513-revert-submodule.sh | 4 ++--
 t/t6041-bisect-submodule.sh | 4 ++--
 t/test-lib.sh               | 1 +
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh
index a1c4e02..4a44dd6 100755
--- a/t/t3513-revert-submodule.sh
+++ b/t/t3513-revert-submodule.sh
@@ -14,11 +14,11 @@ test_description='revert can handle submodules'
 git_revert () {
 	git status -su >expect &&
 	ls -1pR * >>expect &&
-	tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
+	"$TAR" cz * >"$TRASH_DIRECTORY/tmp.tgz" &&
 	git checkout "$1" &&
 	git revert HEAD &&
 	rm -rf * &&
-	tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
+	"$TAR" xz <"$TRASH_DIRECTORY/tmp.tgz" &&
 	git status -su >actual &&
 	ls -1pR * >>actual &&
 	test_cmp expect actual &&
diff --git a/t/t6041-bisect-submodule.sh b/t/t6041-bisect-submodule.sh
index c6b7aa6..0de614f 100755
--- a/t/t6041-bisect-submodule.sh
+++ b/t/t6041-bisect-submodule.sh
@@ -8,7 +8,7 @@ test_description='bisect can handle submodules'
 git_bisect () {
 	git status -su >expect &&
 	ls -1pR * >>expect &&
-	tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
+	"$TAR" cz * > "$TRASH_DIRECTORY/tmp.tgz" &&
 	GOOD=$(git rev-parse --verify HEAD) &&
 	git checkout "$1" &&
 	echo "foo" >bar &&
@@ -20,7 +20,7 @@ git_bisect () {
 	git bisect start &&
 	git bisect good $GOOD &&
 	rm -rf * &&
-	tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
+	"$TAR" xz <"$TRASH_DIRECTORY/tmp.tgz" &&
 	git status -su >actual &&
 	ls -1pR * >>actual &&
 	test_cmp expect actual &&
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 5102340..5f6397b 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -868,6 +868,7 @@ case $(uname -s) in
 		md5sum "$@"
 	}
 	# git sees Windows-style pwd
+	TRASH_DIRECTORY=$(pwd -W)
 	pwd () {
 		builtin pwd -W
 	}
-- 
2.0.2.897.g7f80809.dirty

-- 
-- 
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.

You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en

--- 
You received this message because you are subscribed to the Google Groups "msysGit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply related	[relevance 0%]

* Re: What's cooking in git.git (Jul 2014, #04; Tue, 22)
  2014-07-23 14:17  6% ` Karsten Blees
  2014-07-23 18:24  0%   ` Junio C Hamano
@ 2014-07-25 12:30  0%   ` Duy Nguyen
  2014-07-29 19:43  0%     ` [RFC/PATCH] Windows tests: let $TRASH_DIRECTORY point to native Windows path Karsten Blees
  1 sibling, 1 reply; 200+ results
From: Duy Nguyen @ 2014-07-25 12:30 UTC (permalink / raw)
  To: Karsten Blees; +Cc: Junio C Hamano, Git Mailing List

On Wed, Jul 23, 2014 at 9:17 PM, Karsten Blees <karsten.blees@gmail.com> wrote:
> With the version in pu, three tests fail. t7001 is fixed with a newer 'cp'.
> The other two are unrelated (introduced by nd/multiple-work-trees topic).
>
> * t1501-worktree: failed 1
>   As of 5bbcb072 "setup.c: support multi-checkout repo setup"
>   Using $TRASH_DIRECTORY doesn't work on Windows.
>
> * t2026-prune-linked-checkouts: failed 1
>   As of 404a45f1 "prune: strategies for linked checkouts"
>   Dito.

I need your help here. Would saving $(pwd) to a variable and using it
instead of $TRASH_DIRECTORY work? Some tests "cd" around and $(pwd)
may not be the same as $TRASH_DIRECTORY.
-- 
Duy

^ permalink raw reply	[relevance 0%]

* Re: What's cooking in git.git (Jul 2014, #04; Tue, 22)
  2014-07-23 14:17  6% ` Karsten Blees
@ 2014-07-23 18:24  0%   ` Junio C Hamano
  2014-07-25 12:30  0%   ` Duy Nguyen
  1 sibling, 0 replies; 200+ results
From: Junio C Hamano @ 2014-07-23 18:24 UTC (permalink / raw)
  To: Karsten Blees; +Cc: git

Karsten Blees <karsten.blees@gmail.com> writes:

> Am 22.07.2014 23:44, schrieb Junio C Hamano:
>> 
>> * sk/mingw-uni-fix-more (2014-07-21) 14 commits
>> ...
>> * sk/mingw-tests-workaround (2014-07-21) 6 commits
>> ...
>
> Yes, I think both series are ready.
>
> Compiles with msysgit and MSVC (with NO_CURL=1).

Thanks.

> With the version in pu, three tests fail. t7001 is fixed with a newer 'cp'.

It seems that the only use of the "copy symlinks as-is" in that test
are to move trash/submodule/.git to trash/.git/modules/submodule;
as the longer-term direction is not to rely on symlinks in .git/
(and we have got rid of HEAD -> refs/heads/master long time ago),
perhaps we do not even want to have "-P" there?

> The other two are unrelated (introduced by nd/multiple-work-trees topic).
>
> * t1501-worktree: failed 1
>   As of 5bbcb072 "setup.c: support multi-checkout repo setup"
>   Using $TRASH_DIRECTORY doesn't work on Windows.
>   
> * t2026-prune-linked-checkouts: failed 1
>   As of 404a45f1 "prune: strategies for linked checkouts"
>   Dito.
>
> * t7001-mv: failed 6
>   'cp -P' doesn't work due to outdated cp.exe.

^ permalink raw reply	[relevance 0%]

* Re: What's cooking in git.git (Jul 2014, #04; Tue, 22)
  @ 2014-07-23 14:17  6% ` Karsten Blees
  2014-07-23 18:24  0%   ` Junio C Hamano
  2014-07-25 12:30  0%   ` Duy Nguyen
  0 siblings, 2 replies; 200+ results
From: Karsten Blees @ 2014-07-23 14:17 UTC (permalink / raw)
  To: Junio C Hamano, git

Am 22.07.2014 23:44, schrieb Junio C Hamano:
> 
> * sk/mingw-uni-fix-more (2014-07-21) 14 commits
>  - Win32: enable color output in Windows cmd.exe
>  - Win32: patch Windows environment on startup
>  - Win32: keep the environment sorted
>  - Win32: use low-level memory allocation during initialization
>  - Win32: reduce environment array reallocations
>  - Win32: don't copy the environment twice when spawning child processes
>  - Win32: factor out environment block creation
>  - Win32: unify environment function names
>  - Win32: unify environment case-sensitivity
>  - Win32: fix environment memory leaks
>  - Win32: Unicode environment (incoming)
>  - Win32: Unicode environment (outgoing)
>  - Revert "Windows: teach getenv to do a case-sensitive search"
>  - tests: do not pass iso8859-1 encoded parameter
> 
>  Most of these are battle-tested in msysgit and are needed to
>  complete what has been merged to 'master' already.
> 
>  A fix has been squashed into "Unicode environ (outgoing)"; is this
>  now ready to go?
> 
> 
> * sk/mingw-tests-workaround (2014-07-21) 6 commits
>  - t800[12]: work around MSys limitation
>  - t9902: mingw-specific fix for gitfile link files
>  - t4210: skip command-line encoding tests on mingw
>  - MinGW: disable legacy encoding tests
>  - t0110/MinGW: skip tests that pass arbitrary bytes on the command line
>  - MinGW: Skip test redirecting to fd 4
>  (this branch is used by jc/not-mingw-cygwin.)
> 
>  Make tests pass on msysgit by mostly disabling ones that are
>  infeasible on that platform.
> 
>  The t0110 one has been replaced; is this now ready to go?
> 

Yes, I think both series are ready.

Compiles with msysgit and MSVC (with NO_CURL=1).

With the version in pu, three tests fail. t7001 is fixed with a newer 'cp'.
The other two are unrelated (introduced by nd/multiple-work-trees topic).

* t1501-worktree: failed 1
  As of 5bbcb072 "setup.c: support multi-checkout repo setup"
  Using $TRASH_DIRECTORY doesn't work on Windows.
  
* t2026-prune-linked-checkouts: failed 1
  As of 404a45f1 "prune: strategies for linked checkouts"
  Dito.

* t7001-mv: failed 6
  'cp -P' doesn't work due to outdated cp.exe.

^ permalink raw reply	[relevance 6%]

* Re: [PATCH 00/13] mingw unicode environment
  @ 2014-07-17 18:09  4% ` Karsten Blees
  0 siblings, 0 replies; 200+ results
From: Karsten Blees @ 2014-07-17 18:09 UTC (permalink / raw)
  To: Stepan Kasal, GIT Mailing-list; +Cc: msysGit

Am 17.07.2014 17:37, schrieb Stepan Kasal:
> Hello,
> 
> this is the remainder of Karsten's unicode branch, that is a time
> proven part of msysGit.  (If this code is accepted, only one patch
> would only remain: gitk and git-gui fixes.)
> 

Thank you so much!

I had to add '#include "../cache.h"' to compile, due to use of
ALLOC_GROW and alloc_nr in some of the patches. In the msysgit HEAD,
Erik's hideDotFile patch does that [1].

[1] https://github.com/msysgit/git/commit/d85d2b75

After that (and applying your mingw test fixes), only t7001 fails
(the 'cp -P' issue).

> When rebasing Karsten's work, I have eliminated two commits:
> https://github.com/msysgit/git/commit/f967550
> https://github.com/msysgit/git/commit/290bf81
> 
> These commits only moved code down and up; this was not necessary, one
> forward declaration was all I needed.
> 

I believe we prefer moving code to the right place over forward
declarations (IIRC I got bashed for the latter in one of the first rounds
of this patch series). If only to justify 'git-blame -M' :-D

> One of the patches differs from the original version: "Enable color..."
> Following Karsten's suggestion, I have changed the value of env. var.
> TERM from "winterm" to "cygwin".  This is because the subprocesses see
> the variable and may try to find it in (their copy of) termcap.
> 

Good! One more step towards getting rid of the git-wrapper.

-- 
-- 
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.

You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en

--- 
You received this message because you are subscribed to the Google Groups "msysGit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 0/3] fix test suite with mingw-unicode patches
  2014-07-16  9:29  0%       ` Stepan Kasal
@ 2014-07-16 11:01  0%         ` Thomas Braun
  0 siblings, 0 replies; 200+ results
From: Thomas Braun @ 2014-07-16 11:01 UTC (permalink / raw)
  To: Stepan Kasal, Karsten Blees
  Cc: Junio C Hamano, Johannes Sixt, GIT Mailing-list, msysGit

Am 16.07.2014 11:29, schrieb Stepan Kasal:
>> * t7001-mv: 6
>> cp -P fails in MinGW - perhaps use the long option forms (--no-dereference)?
> 
> "cp -P" fails with our 2001-edition of cp, so msysgit had to revert:
> https://github.com/msysgit/git/commit/6d3e23d4
> 
> But I was ashamed to mention that upstream; and I hope mingwGitDevEnv is
> going to solve that.

Yes it does. cp in mingwGitDevEnv is from coreutils 5.97 and knows about -P.

-- 
-- 
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.

You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en

--- 
You received this message because you are subscribed to the Google Groups "msysGit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 0/3] fix test suite with mingw-unicode patches
  2014-07-15 22:52  4%     ` Karsten Blees
@ 2014-07-16  9:29  0%       ` Stepan Kasal
  2014-07-16 11:01  0%         ` Thomas Braun
  0 siblings, 1 reply; 200+ results
From: Stepan Kasal @ 2014-07-16  9:29 UTC (permalink / raw)
  To: Karsten Blees; +Cc: Junio C Hamano, Johannes Sixt, GIT Mailing-list, msysGit

Hello Karsten,

thanks for your analysis.  Most of the patches you refer to are simply
switching off tests for MINGW; let me comment on the remaining ones:

> * t0110-urlmatch-normalization: 1
> 
> Passing binary data on the command line...would have to
> teach test-urlmatch-normalization.c to read from stdin or file.
> https://github.com/msysgit/git/commit/be0d6dee

Indeed, that would be better solution.  For now, I'm going to submit the
switch-off patch you mention.

> * t4036-format-patch-signer-mime: 1
> 
> Passing non-ASCII by environment variable, will be fixed by Unicode
> environment support.

Will submit that patch series soon.

> * t7001-mv: 6
> cp -P fails in MinGW - perhaps use the long option forms (--no-dereference)?

"cp -P" fails with our 2001-edition of cp, so msysgit had to revert:
https://github.com/msysgit/git/commit/6d3e23d4

But I was ashamed to mention that upstream; and I hope mingwGitDevEnv is
going to solve that.

> * t8001-annotate/t8002-blame: 5
> 
> Msys.dll thinks '-L/regex/' is an absolute path and expands to '-LC:/msysgit/regex/'.
> https://github.com/msysgit/git/commit/2d52168a

Nice!  But I'm afraid the patch cannot be submitted upstream as it is.

I think the hack could be automated by processing options "-L*" this way:
    sed 'sX\(^-L\|,\)\^\?/X&\\;*Xg'
Then it would become only few lines at the top of the script, executed
on mingw only.
I hope to submit the patch in this form soon.

Have a nice day,
	Stepan

-- 
-- 
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.

You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en

--- 
You received this message because you are subscribed to the Google Groups "msysGit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 0/3] fix test suite with mingw-unicode patches
  @ 2014-07-15 22:52  4%     ` Karsten Blees
  2014-07-16  9:29  0%       ` Stepan Kasal
  0 siblings, 1 reply; 200+ results
From: Karsten Blees @ 2014-07-15 22:52 UTC (permalink / raw)
  To: Junio C Hamano, Stepan Kasal; +Cc: Johannes Sixt, GIT Mailing-list, msysGit

Am 15.07.2014 20:20, schrieb Junio C Hamano:
> Stepan Kasal <kasal@ucw.cz> writes:
> 
>> Hello Hannes,
>> attached please find the patches that Karsten pointed out:
>>
>> 1) The unicode file name support was omitted from his unicode patch
>> series; my mistake, sorry.  There is still big part missing: support
>> for unicode environment; I can only hope the tests would choke on
>> that.
>>
>> 2) Windows cannot pass non-UTF parameters (commit messages in this
>> case): original patch by Pat Thoyts was extended to apply to other
>> similar cases: the commit msg is passed through stdin.
>>
>> If there are still problems remaining, please tell us.
>>
>> Thanks,
>> 	Stepan
>>
>> Karsten Blees (2):
>>   Win32: Unicode file name support (except dirent)
>>   Win32: Unicode file name support (dirent)
>>
>> Pat Thoyts and Stepan Kasal(1):
>>   tests: do not pass iso8859-1 encoded parameter
> 
> Thanks.  I'll queue these and wait for Windows folks to respond.
> With favourable feedback they can go directly from pu to master, I
> would think.
> 

Looking good. After fixing the ELOOP and fchmod issues (see followup
patches), there are 9 test failures left. Only one of these is
environment related, and for the rest we have fixes in the msysgit
fork:


* t0081-line-buffer: 1

Using file descriptor other than 0, 1, 2.
https://github.com/msysgit/git/commit/4940c51a


* t0110-urlmatch-normalization: 1

Passing binary data on the command line...would have to teach test-urlmatch-normalization.c to read from stdin or file.
https://github.com/msysgit/git/commit/be0d6dee


* t4036-format-patch-signer-mime: 1

not ok 4 - format with non ASCII signer name
#
#               GIT_COMMITTER_NAME="はまの ふにおう" \
#               git format-patch -s --stdout -1 >output &&
#               grep Content-Type output
#

Passing non-ASCII by environment variable, will be fixed by Unicode environment support.


* t4201-shortlog: 3

Passing binary data on the command line ('git-commit -m').
https://github.com/msysgit/git/commit/3717ce1b


* t4210-log-i18n: 2

Passing binary data on the command line ('git log --grep=$latin1_e').
https://github.com/msysgit/git/commit/dd2defa3


* t7001-mv: 6

cp -P fails in MinGW - perhaps use the long option forms (--no-dereference)?
https://github.com/msysgit/git/commit/00764ca1


* t8001-annotate/t8002-blame: 5

Msys.dll thinks '-L/regex/' is an absolute path and expands to '-LC:/msysgit/regex/'.
https://github.com/msysgit/git/commit/2d52168a


* t8005-blame-i18n: 4

Passing binary data on the command line ('git-commit --author -m').
https://github.com/msysgit/git/commit/3717ce1b


* t9902-completion: 2

Must use 'pwd -W' to get Windows-style absolute paths.
https://github.com/msysgit/git/commit/9b612448

-- 
-- 
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.

You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en

--- 
You received this message because you are subscribed to the Google Groups "msysGit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply	[relevance 4%]

* Please pull the patch series "use the $( ... ) construct for command substitution"
@ 2014-05-14 15:23  3% Elia Pinto
  0 siblings, 0 replies; 200+ results
From: Elia Pinto @ 2014-05-14 15:23 UTC (permalink / raw)
  To: git@vger.kernel.org; +Cc: Matthieu Moy

The following changes since commit 6308767f0bb58116cb405e1f4f77f5dfc1589920:


  Merge branch 'fc/prompt-zsh-read-from-file' (2014-05-13 11:53:14 -0700)


are available in the git repository at:


  https://github.com/devzero2000/git-core.git  ep/shell-command-substitution-v4


for you to fetch changes up to 8c8883150c391fae33c122228af937594142600e:



  test-lib-functions.sh: use the $( ... ) construct for command
substitution (2014-05-14 05:34:52 -0700)

----------------------------------------------------------------

I have re-created a branch with these patches based on a previous
observation made here

http://www.spinics.net/lists/git/msg230236.html

Thanks very much to the people (Matthieu i think)
that will make the reviews, I understand it's boring

----------------------------------------------------------------

Elia Pinto (83):

      t5003-archive-zip.sh: use the $( ... ) construct for command substitution

      t5517-push-mirror.sh: use the $( ... ) construct for command substitution

      t6002-rev-list-bisect.sh: use the $( ... ) construct for command
substitution

      t7700-repack.sh: use the $( ... ) construct for command substitution

      t5100-mailinfo.sh: use the $( ... ) construct for command substitution

      t5520-pull.sh: use the $( ... ) construct for command substitution

      t6015-rev-list-show-all-parents.sh: use the $( ... ) construct
for command substitution

      t8003-blame-corner-cases.sh: use the $( ... ) construct for
command substitution

      t5300-pack-object.sh: use the $( ... ) construct for command substitution

      t5522-pull-symlink.sh: use the $( ... ) construct for command substitution

      t6032-merge-large-rename.sh: use the $( ... ) construct for
command substitution

      t5301-sliding-window.sh: use the $( ... ) construct for command
substitution

      t5530-upload-pack-error.sh: use the $( ... ) construct for
command substitution

      t6034-merge-rename-nocruft.sh: use the $( ... ) construct for
command substitution

      t9100-git-svn-basic.sh: use the $( ... ) construct for command
substitution

      t5302-pack-index.sh: use the $( ... ) construct for command substitution

      t5537-fetch-shallow.sh: use the $( ... ) construct for command
substitution

      t6132-pathspec-exclude.sh: use the $( ... ) construct for
command substitution

      t9101-git-svn-props.sh: use the $( ... ) construct for command
substitution

      t5303-pack-corruption-resilience.sh: use the $( ... ) construct
for command substitution

      t5538-push-shallow.sh: use the $( ... ) construct for command substitution

      t7001-mv.sh: use the $( ... ) construct for command substitution

      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for
command substitution

      t5304-prune.sh: use the $( ... ) construct for command substitution

      t5550-http-fetch-dumb.sh: use the $( ... ) construct for command
substitution

      t7003-filter-branch.sh: use the $( ... ) construct for command
substitution

      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for
command substitution

      t5305-include-tag.sh: use the $( ... ) construct for command substitution

      t5551-http-fetch-smart.sh: use the $( ... ) construct for
command substitution

      t7004-tag.sh: use the $( ... ) construct for command substitution

      t9107-git-svn-migrate.sh: use the $( ... ) construct for command
substitution

      t5500-fetch-pack.sh: use the $( ... ) construct for command substitution

      t5570-git-daemon.sh: use the $( ... ) construct for command substitution

      t7006-pager.sh: use the $( ... ) construct for command substitution

      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution

      t5505-remote.sh: use the $( ... ) construct for command substitution

      t5601-clone.sh: use the $( ... ) construct for command substitution

      t7103-reset-bare.sh: use the $( ... ) construct for command substitution

      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for
command substitution

      t5506-remote-groups.sh: use the $( ... ) construct for command
substitution

      t5700-clone-reference.sh: use the $( ... ) construct for command
substitution

      t7406-submodule-update.sh: use the $( ... ) construct for
command substitution

      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for
command substitution

      t5510-fetch.sh: use the $( ... ) construct for command substitution

      t5710-info-alternate.sh: use the $( ... ) construct for command
substitution

      t7408-submodule-reference.sh: use the $( ... ) construct for
command substitution

      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for
command substitution

      t5515-fetch-merge-logic.sh: use the $( ... ) construct for
command substitution

      t5900-repo-selection.sh: use the $( ... ) construct for command
substitution

      t7504-commit-msg-hook.sh: use the $( ... ) construct for command
substitution

      t5516-fetch-push.sh: use the $( ... ) construct for command substitution

      t6001-rev-list-graft.sh: use the $( ... ) construct for command
substitution

      t7602-merge-octopus-many.sh: use the $( ... ) construct for
command substitution

      unimplemented.sh: use the $( ... ) construct for command substitution

      t1100-commit-tree-options.sh: use the $( ... ) construct for
command substitution

      t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution

      t1410-reflog.sh: use the $( ... ) construct for command substitution

      t1511-rev-parse-caret.sh: use the $( ... ) construct for command
substitution

      t1512-rev-parse-disambiguation.sh: use the $( ... ) construct
for command substitution

      t2102-update-index-symlinks.sh: use the $( ... ) construct for
command substitution

      t3030-merge-recursive.sh: use the $( ... ) construct for command
substitution

      t3100-ls-tree-restrict.sh: use the $( ... ) construct for
command substitution

      t3101-ls-tree-dirname.sh: use the $( ... ) construct for command
substitution

      t3210-pack-refs.sh: use the $( ... ) construct for command substitution

      t3403-rebase-skip.sh: use the $( ... ) construct for command substitution

      t3511-cherry-pick-x.sh: use the $( ... ) construct for command
substitution

      t3600-rm.sh: use the $( ... ) construct for command substitution

      t3700-add.sh: use the $( ... ) construct for command substitution

      t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for
command substitution

      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct
for command substitution

      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution

      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct
for command substitution

      t9130-git-svn-authors-file.sh: use the $( ... ) construct for
command substitution

      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for
command substitution

      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... )
construct for command substitution

      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for
command substitution

      t9145-git-svn-master-branch.sh: use the $( ... ) construct for
command substitution

      t9150-svk-mergetickets.sh: use the $( ... ) construct for
command substitution

      t9300-fast-import.sh: use the $( ... ) construct for command substitution

      t9350-fast-export.sh: use the $( ... ) construct for command substitution

      t9501-gitweb-standalone-http-status.sh: use the $( ... )
construct for command substitution

      t9901-git-web--browse.sh: use the $( ... ) construct for command
substitution

      test-lib-functions.sh: use the $( ... ) construct for command substitution



 t/t1100-commit-tree-options.sh            |    4 ++--

 t/t1401-symbolic-ref.sh                   |    2 +-

 t/t1410-reflog.sh                         |   24 ++++++++++++------------

 t/t1511-rev-parse-caret.sh                |    4 ++--

 t/t1512-rev-parse-disambiguation.sh       |    8 ++++----

 t/t2102-update-index-symlinks.sh          |    2 +-

 t/t3030-merge-recursive.sh                |    2 +-

 t/t3100-ls-tree-restrict.sh               |    2 +-

 t/t3101-ls-tree-dirname.sh                |    2 +-

 t/t3210-pack-refs.sh                      |    2 +-

 t/t3403-rebase-skip.sh                    |    2 +-

 t/t3511-cherry-pick-x.sh                  |   14 +++++++-------

 t/t3600-rm.sh                             |    4 ++--

 t/t3700-add.sh                            |   16 ++++++++--------

 t/t5003-archive-zip.sh                    |    2 +-

 t/t5100-mailinfo.sh                       |   12 ++++++------

 t/t5300-pack-object.sh                    |   18 +++++++++---------

 t/t5301-sliding-window.sh                 |   14 +++++++-------

 t/t5302-pack-index.sh                     |   34
+++++++++++++++++-----------------

 t/t5303-pack-corruption-resilience.sh     |    8 ++++----

 t/t5304-prune.sh                          |    2 +-

 t/t5305-include-tag.sh                    |    8 ++++----

 t/t5500-fetch-pack.sh                     |   16 ++++++++--------

 t/t5505-remote.sh                         |    2 +-

 t/t5506-remote-groups.sh                  |    2 +-

 t/t5510-fetch.sh                          |   10 +++++-----

 t/t5515-fetch-merge-logic.sh              |    4 ++--

 t/t5516-fetch-push.sh                     |    4 ++--

 t/t5517-push-mirror.sh                    |    2 +-

 t/t5520-pull.sh                           |   10 +++++-----

 t/t5522-pull-symlink.sh                   |    2 +-

 t/t5530-upload-pack-error.sh              |    2 +-

 t/t5537-fetch-shallow.sh                  |    4 ++--

 t/t5538-push-shallow.sh                   |    4 ++--

 t/t5550-http-fetch-dumb.sh                |    8 ++++----

 t/t5551-http-fetch-smart.sh               |    2 +-

 t/t5570-git-daemon.sh                     |    8 ++++----

 t/t5601-clone.sh                          |    2 +-

 t/t5700-clone-reference.sh                |    2 +-

 t/t5710-info-alternate.sh                 |    2 +-

 t/t5900-repo-selection.sh                 |    2 +-

 t/t6001-rev-list-graft.sh                 |   12 ++++++------

 t/t6002-rev-list-bisect.sh                |    6 +++---

 t/t6015-rev-list-show-all-parents.sh      |    6 +++---

 t/t6032-merge-large-rename.sh             |    2 +-

 t/t6034-merge-rename-nocruft.sh           |    2 +-

 t/t6132-pathspec-exclude.sh               |    2 +-

 t/t7001-mv.sh                             |    4 ++--

 t/t7003-filter-branch.sh                  |    6 +++---

 t/t7004-tag.sh                            |   16 ++++++++--------

 t/t7006-pager.sh                          |    2 +-

 t/t7103-reset-bare.sh                     |    2 +-

 t/t7406-submodule-update.sh               |    4 ++--

 t/t7408-submodule-reference.sh            |    2 +-

 t/t7504-commit-msg-hook.sh                |    2 +-

 t/t7505-prepare-commit-msg-hook.sh        |   32
++++++++++++++++----------------

 t/t7602-merge-octopus-many.sh             |    8 ++++----

 t/t7700-repack.sh                         |    4 ++--

 t/t8003-blame-corner-cases.sh             |    4 ++--

 t/t9100-git-svn-basic.sh                  |   24 ++++++++++++------------

 t/t9101-git-svn-props.sh                  |   30 +++++++++++++++---------------

 t/t9104-git-svn-follow-parent.sh          |   48
++++++++++++++++++++++++------------------------

 t/t9105-git-svn-commit-diff.sh            |    4 ++--

 t/t9107-git-svn-migrate.sh                |   16 ++++++++--------

 t/t9108-git-svn-glob.sh                   |   20 ++++++++++----------

 t/t9109-git-svn-multi-glob.sh             |   32
++++++++++++++++----------------

 t/t9110-git-svn-use-svm-props.sh          |    2 +-

 t/t9114-git-svn-dcommit-merge.sh          |   12 ++++++------

 t/t9118-git-svn-funky-branch-names.sh     |    2 +-

 t/t9119-git-svn-info.sh                   |    2 +-

 t/t9129-git-svn-i18n-commitencoding.sh    |    4 ++--

 t/t9130-git-svn-authors-file.sh           |   12 ++++++------

 t/t9132-git-svn-broken-symlink.sh         |    4 ++--

 t/t9137-git-svn-dcommit-clobber-series.sh |   24 ++++++++++++------------

 t/t9138-git-svn-authors-prog.sh           |    2 +-

 t/t9145-git-svn-master-branch.sh          |    4 ++--

 t/t9150-svk-mergetickets.sh               |    2 +-

 t/t9300-fast-import.sh                    |   68
++++++++++++++++++++++++++++++++++----------------------------------

 t/t9350-fast-export.sh                    |    6 +++---

 t/t9501-gitweb-standalone-http-status.sh  |    6 +++---

 t/t9901-git-web--browse.sh                |    2 +-

 t/test-lib-functions.sh                   |    8 ++++----

 unimplemented.sh                          |    2 +-

 83 files changed, 363 insertions(+), 363 deletions(-)

^ permalink raw reply	[relevance 3%]

* [ANNOUNCE] Git v1.9.3
@ 2014-05-09 20:00  4% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2014-05-09 20:00 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

The latest maintenance release Git v1.9.3 is now available at
the usual places.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories will all have a copy of the
'v1.9.3' tag and the 'maint' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://code.google.com/p/git-core/
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

but I am cutting 2.0.0-rc3 today, so you may have to wait for a bit
until these repositories are updated.


Git v1.9.3 Release Notes
========================

Fixes since v1.9.2
------------------

 * "git p4" dealing with changes in binary files were broken by a
   change in 1.9 release.

 * The shell prompt script (in contrib/), when using the PROMPT_COMMAND
   interface, used an unsafe construct when showing the branch name in
   $PS1.

 * "git rebase" used a POSIX shell construct FreeBSD /bin/sh does not
   work well with.

 * Some more Unicode codepoints defined in Unicode 6.3 as having
   zero width have been taught to our display column counting logic.

 * Some tests used shell constructs that did not work well on
   FreeBSD.

----------------------------------------------------------------

Changes since v1.9.2 are as follows:

Jonathan Nieder (1):
      shell doc: remove stray "+" in example

Junio C Hamano (2):
      Start preparing for 1.9.3
      Git 1.9.3

Kyle J. McKay (4):
      test: fix t7001 cp to use POSIX options
      test: fix t5560 on FreeBSD
      rebase: avoid non-function use of "return" on FreeBSD
      Revert "rebase: fix run_specific_rebase's use of "return" on FreeBSD"

Richard Hansen (1):
      git-prompt.sh: don't put unsanitized branch names in $PS1

Tolga Ceylan (1):
      git-p4: format-patch to diff-tree change breaks binary patches

Torsten Bögershausen (1):
      utf8.c: partially update to version 6.3

^ permalink raw reply	[relevance 4%]

* [ANNOUNCE] Git v2.0.0-rc0
@ 2014-04-18 19:37  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2014-04-18 19:37 UTC (permalink / raw)
  To: git; +Cc: Linux Kernel

An early preview release Git v2.0.0-rc0 is now available for
testing at the usual places.

A major version bump between v1.x.x series and the upcoming v2.0.0
means there are a handful of backward incompatible UI improvements,
but for most people, all the tricky preparation for the transition
would have been already done for you and the upcoming release just
flips the default.  Unless you were living in a cave and have stayed
with an ancient version of Git (e.g. one before 1.8.2 that was
released more than a year ago) for all these times, that is---those
of you may want to double check the backward compatibility notes
section at the beginning of the draft release notes.

The tarballs are found at:

    https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the 'v2.0.0-rc0'
tag and the 'master' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://code.google.com/p/git-core/
  url = git://git.sourceforge.jp/gitroot/git-core/git.git
  url = git://git-core.git.sourceforge.net/gitroot/git-core/git-core
  url = https://github.com/gitster/git

Git v2.0 Release Notes (draft)
==============================

Backward compatibility notes
----------------------------

When "git push [$there]" does not say what to push, we have used the
traditional "matching" semantics so far (all your branches were sent
to the remote as long as there already are branches of the same name
over there).  In Git 2.0, the default is now the "simple" semantics,
which pushes:

 - only the current branch to the branch with the same name, and only
   when the current branch is set to integrate with that remote
   branch, if you are pushing to the same remote as you fetch from; or

 - only the current branch to the branch with the same name, if you
   are pushing to a remote that is not where you usually fetch from.

You can use the configuration variable "push.default" to change
this.  If you are an old-timer who wants to keep using the
"matching" semantics, you can set the variable to "matching", for
example.  Read the documentation for other possibilities.

When "git add -u" and "git add -A" are run inside a subdirectory
without specifying which paths to add on the command line, they
operate on the entire tree for consistency with "git commit -a" and
other commands (these commands used to operate only on the current
subdirectory).  Say "git add -u ." or "git add -A ." if you want to
limit the operation to the current directory.

"git add <path>" is the same as "git add -A <path>" now, so that
"git add dir/" will notice paths you removed from the directory and
record the removal.  In older versions of Git, "git add <path>" used
to ignore removals.  You can say "git add --ignore-removal <path>" to
add only added or modified paths in <path>, if you really want to.

The "-q" option to "git diff-files", which does *NOT* mean "quiet",
has been removed (it told Git to ignore deletion, which you can do
with "git diff-files --diff-filter=d").

"git request-pull" lost a few "heuristics" that often led to mistakes.


Updates since v1.9 series
-------------------------

UI, Workflows & Features

 * The "multi-mail" post-receive hook (in contrib/) has been updated
   to a more recent version from the upstream.

 * "git gc --aggressive" learned "--depth" option and
   "gc.aggressiveDepth" configuration variable to allow use of a less
   insane depth than the built-in default value of 250.

 * "git log" learned the "--show-linear-break" option to show where a
   single strand-of-pearls is broken in its output.

 * The "rev-parse --parseopt" mechanism used by scripted Porcelains to
   parse command line options and to give help text learned to take
   the argv-help (the placeholder string for an option parameter,
   e.g. "key-id" in "--gpg-sign=<key-id>").

 * The pattern to find where the function begins in C/C++ used in
   "diff" and "grep -p" have been updated to help C++ source better.

 * "git rebase" learned to interpret a lone "-" as "@{-1}", the
   branch that we were previously on.

 * "git commit --cleanup=<mode>" learned a new mode, scissors.

 * "git tag --list" output can be sorted using "version sort" with
   "--sort=version:refname".

 * Discard the accumulated "heuristics" to guess from which branch the
   result wants to be pulled from and make sure what the end user
   specified is not second-guessed by "git request-pull", to avoid
   mistakes.  When you pushed out your 'master' branch to your public
   repository as 'for-linus', use the new "master:for-linus" syntax to
   denote the branch to be pulled.

 * "git grep" learned to behave in a way similar to native grep when
   "-h" (no header) and "-c" (count) options are given.

 * transport-helper, fast-import and fast-export have been updated to
   allow the ref mapping and ref deletion in a way similar to the
   natively supported transports.

 * The "simple" mode is the default for "git push".

 * "git add -u" and "git add -A", when run without any pathspec, is a
   tree-wide operation even when run inside a subdirectory of a
   working tree.

 * "git add <path> is the same as "git add -A <path>" now.

 * "core.statinfo" configuration variable, which is a
   never-advertised synonym to "core.checkstat", has been removed.

 * The "-q" option to "git diff-files", which does *NOT* mean
   "quiet", has been removed (it told Git to ignore deletion, which
   you can do with "git diff-files --diff-filter=d").

 * Server operators can loosen the "tips of refs only" restriction for
   the remote archive service with the uploadarchive.allowUnreachable
   configuration option.

 * The progress indicators from various time-consuming commands have
   been marked for i18n/l10n.

 * "git notes -C <blob>" diagnoses an attempt to use an object that
   is not a blob as an error.

 * "git config" learned to read from the standard input when "-" is
   given as the value to its "--file" parameter (attempting an
   operation to update the configuration in the standard input of
   course is rejected).

 * Trailing whitespaces in .gitignore files, unless they are quoted
   for fnmatch(3), e.g. "path\ ", are warned and ignored.  Strictly
   speaking, this is a backward incompatible change, but very unlikely
   to bite any sane user and adjusting should be obvious and easy.

 * Many commands that create commits, e.g. "pull", "rebase",
   learned to take the --gpg-sign option on the command line.

 * "git commit" can be told to always GPG sign the resulting commit
   by setting "commit.gpgsign" configuration variable to true (the
   command line option --no-gpg-sign should override it).

 * "git pull" can be told to only accept fast-forward by setting the
   new "pull.ff" configuration.

 * "git reset" learned "-N" option, which does not reset the index
   fully for paths the index knows about but the tree-ish the command
   resets to does not (these paths are kept as intend-to-add entries).


Performance, Internal Implementation, etc.

 * The compilation options to port to AIX and to MSVC have been
   updated.

 * We started using wildmatch() in place of fnmatch(3) a few releases
   ago; complete the process and stop using fnmatch(3).

 * Uses of curl's "multi" interface and "easy" interface do not mix
   well when we attempt to reuse outgoing connections.  Teach the RPC
   over http code, used in the smart HTTP transport, not to use the
   "easy" interface.

 * The bitmap-index feature from JGit has been ported, which should
   significantly improve performance when serving objects form a
   repository that uses it.

 * The way "git log --cc" shows a combined diff against multiple
   parents have been optimized.

 * The prefixcmp() and suffixcmp() functions are gone.  Use
   starts_with() and ends_with(), and also consider if skip_prefix()
   suits your needs better when using the former.


Also contains various documentation updates and code clean-ups.  Many
of them came from flurry of activities as GSoC candidate microproject
exercises.


Fixes since v1.9 series
-----------------------

Unless otherwise noted, all the fixes since v1.9 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * zsh prompt (in contrib/) leaked unnecessary error messages.

 * bash completion (in contrib/) did not complete the refs and remotes
   correctly given "git pu<TAB>" when "pu" is aliased to "push".

 * Some more Unicode codepoints defined in Unicode 6.3 as having zero
   width have been taught to our display column counting logic.
   (merge d813ab9 tb/unicode-6.3-zero-width later to maint).

 * Some tests used shell constructs that did not work well on FreeBSD
   (merge ff7a1c6 km/avoid-bs-in-shell-glob later to maint).
   (merge 00764ca km/avoid-cp-a later to maint).

 * "git update-ref --stdin" did not fail a request to create a ref
   when the ref already existed.
   (merge b9d56b5 mh/update-ref-batch-create-fix later to maint).

 * "git diff --no-index -Mq a b" fell into an infinite loop.
   (merge ad1c3fb jc/fix-diff-no-index-diff-opt-parse later to maint).

 * "git fetch --prune", when the right-hand-side of multiple fetch
   refspecs overlap (e.g. storing "refs/heads/*" to
   "refs/remotes/origin/*", while storing "refs/frotz/*" to
   "refs/remotes/origin/fr/*"), aggressively thought that lack of
   "refs/heads/fr/otz" on the origin site meant we should remove
   "refs/remotes/origin/fr/otz" from us, without checking their
   "refs/frotz/otz" first.

   Note that such a configuration is inherently unsafe (think what
   should happen when "refs/heads/fr/otz" does appear on the origin
   site), but that is not a reason not to be extra careful.
   (merge e6f6371 cn/fetch-prune-overlapping-destination later to maint).

 * "git status --porcelain --branch" showed its output with labels
   "ahead/behind/gone" translated to the user's locale.
   (merge 7a76c28 mm/status-porcelain-format-i18n-fix later to maint).

 * A stray environment variable $prefix could have leaked into and
   affected the behaviour of the "subtree" script (in contrib/).

 * When it is not necessary to edit a commit log message (e.g. "git
   commit -m" is given a message without specifying "-e"), we used to
   disable the spawning of the editor by overriding GIT_EDITOR, but
   this means all the uses of the editor, other than to edit the
   commit log message, are also affected.
   (merge b549be0 bp/commit-p-editor later to maint).

 * "git mv" that moves a submodule forgot to adjust the array that
   uses to keep track of which submodules were to be moved to update
   its configuration.
   (merge fb8a4e8 jk/mv-submodules-fix later to maint).

 * Length limit for the pathname used when removing a path in a deep
   subdirectory has been removed to avoid buffer overflows.
   (merge 2f29e0c mh/remove-subtree-long-pathname-fix later to maint).

 * The test helper lib-terminal always run an actual test_expect_*
   when included, which screwed up with the use of skil-all that may
   have to be done later.
   (merge 7e27173 jk/lib-terminal-lazy later to maint).

 * "git index-pack" used a wrong variable to name the keep-file in an
   error message when the file cannot be written or closed.
   (merge de983a0 nd/index-pack-error-message later to maint).

 * "rebase -i" produced a broken insn sheet when the title of a commit
   happened to contain '\n' (or ended with '\c') due to a careless use
   of 'echo'.
   (merge cb1aefd us/printf-not-echo later to maint).

 * There were a few instances of 'git-foo' remaining in the
   documentation that should have been spelled 'git foo'.
   (merge 3c3e6f5 rr/doc-merge-strategies later to maint).

 * Serving objects from a shallow repository needs to write a
   new file to hold the temporary shallow boundaries but it was not
   cleaned when we exit due to die() or a signal.
   (merge 7839632 jk/shallow-update-fix later to maint).

 * When "git stash pop" stops after failing to apply the stash
   (e.g. due to conflicting changes), the stash is not dropped. State
   that explicitly in the output to let the users know.
   (merge 2d4c993 jc/stash-pop-not-popped later to maint).

 * The labels in "git status" output that describe the nature of
   conflicts (e.g. "both deleted") were limited to 20 bytes, which was
   too short for some l10n (e.g. fr).
   (merge c7cb333 jn/wt-status later to maint).

 * "git clean -d pathspec" did not use the given pathspec correctly
   and ended up cleaning too much.
   (merge 1f2e108 jk/clean-d-pathspec later to maint).

 * "git difftool" misbehaved when the repository is bound to the
   working tree with the ".git file" mechanism, where a textual file
   ".git" tells us where it is.
   (merge fcfec8b da/difftool-git-files later to maint).

 * "git push" did not pay attention to branch.*.pushremote if it is
   defined earlier than remote.pushdefault; the order of these two
   variables in the configuration file should not matter, but it did
   by mistake.
   (merge 98b406f jk/remote-pushremote-config-reading later to maint).

 * Codepaths that parse timestamps in commit objects have been
   tightened.
   (merge f80d1f9 jk/commit-dates-parsing-fix later to maint).

 * "git diff --external-diff" incorrectly fed the submodule directory
   in the working tree to the external diff driver when it knew it is
   the same as one of the versions being compared.
   (merge aba4727 tr/diff-submodule-no-reuse-worktree later to maint).

 * "git reset" needs to refresh the index when working in a working
   tree (it can also be used to match the index to the HEAD in an
   otherwise bare repository), but it failed to set up the working
   tree properly, causing GIT_WORK_TREE to be ignored.
   (merge b7756d4 nd/reset-setup-worktree later to maint).

 * "git check-attr" when working on a repository with a working tree
   did not work well when the working tree was specified via the
   --work-tree (and obviously with --git-dir) option.
   (merge cdbf623 jc/check-attr-honor-working-tree later to maint).

 * "merge-recursive" was broken in 1.7.7 era and stopped working in
   an empty (temporary) working tree, when there are renames
   involved.  This has been corrected.
   (merge 6e2068a bk/refresh-missing-ok-in-merge-recursive later to maint.)

 * "git rev-parse" was loose in rejecting command line arguments
   that do not make sense, e.g. "--default" without the required
   value for that option.
   (merge a43219f ds/rev-parse-required-args later to maint.)

 * include.path variable (or any variable that expects a path that
   can use ~username expansion) in the configuration file is not a
   boolean, but the code failed to check it.
   (merge 67beb60 jk/config-path-include-fix later to maint.)

 * Commands that take pathspecs on the command line misbehaved when
   the pathspec is given as an absolute pathname (which is a
   practice not particularly encouraged) that points at a symbolic
   link in the working tree.
   (merge later 655ee9e mw/symlinks to maint.)

 * "git diff --quiet -- pathspec1 pathspec2" sometimes did not return
   correct status value.
   (merge f34b205 nd/diff-quiet-stat-dirty later to maint.)

 * Attempting to deepen a shallow repository by fetching over smart
   HTTP transport failed in the protocol exchange, when no-done
   extension was used.  The fetching side waited for the list of
   shallow boundary commits after the sending end stopped talking to
   it.
   (merge 0232852 nd/http-fetch-shallow-fix later to maint.)

 * Allow "git cmd path/", when the 'path' is where a submodule is
   bound to the top-level working tree, to match 'path', despite the
   extra and unnecessary trailing slash (such a slash is often
   given by command line completion).
   (merge 2e70c01 nd/submodule-pathspec-ending-with-slash later to maint.)

 * Documentation and in-code comments had many instances of mistaken
   use of "nor", which have been corrected.
   (merge 235e8d5 jl/nor-or-nand-and later to maint).

----------------------------------------------------------------

Changes since v1.9.2 are as follows:

Adam (1):
      branch.c: install_branch_config: simplify if chain

Albert L. Lash, IV (4):
      docs/merge-strategies: remove hyphen from mis-merges
      docs/git-remote: capitalize first word of initial blurb
      docs/git-clone: clarify use of --no-hardlinks option
      docs/git-blame: explain more clearly the example pickaxe use

Andrew Keller (1):
      gitweb: Avoid overflowing page body frame with large images

Astril Hayato (1):
      Documentation/gitk: document the location of the configulation file

Benoit Sigoure (1):
      git-compat-util.h: #undef (v)snprintf before #define them

Brian Bourn (2):
      diff-no-index: rename read_directory()
      diff-no-index: replace manual "."/".." check with is_dot_or_dotdot()

Brian Gesiak (3):
      t3200-branch: test setting branch as own upstream
      branch: use skip_prefix() in install_branch_config()
      rebase: allow "-" short-hand for the previous branch

Charles Bailey (2):
      dir.c: make git_fnmatch() not inline
      tests: don't rely on strerror text when testing rmdir failure

Chris Angelico (1):
      config.txt: third-party tools may and do use their own variables

Chris Packham (2):
      Documentation/git-am: Document supported --patch-format options
      Documentation/git-am: typofix

Christian Couder (1):
      strbuf: remove prefixcmp() and suffixcmp()

David Aguilar (2):
      pull: add pull.ff configuration
      pull: add --ff-only to the help text

David Kastrup (6):
      builtin/blame.c: struct blame_entry does not need a prev link
      builtin/blame.c: eliminate same_suspect()
      builtin/blame.c::prepare_lines: fix allocation size of sb->lineno
      blame.c: prepare_lines should not call xrealloc for every line
      builtin/blame.c::find_copy_in_blob: no need to scan for region end
      skip_prefix(): scan prefix only once

David Tran (1):
      tests: use "env" to run commands with temporary env-var settings

Dirk Wallenstein (1):
      doc: status, remove leftover statement about '#' prefix

Dmitry Marakasov (1):
      configure.ac: link with -liconv for locale_charset()

Dmitry S. Dolzhenko (15):
      commit.c: use the generic "sha1_pos" function for lookup
      builtin/pack-objects.c: use ALLOC_GROW() in check_pbase_path()
      bundle.c: use ALLOC_GROW() in add_to_ref_list()
      cache-tree.c: use ALLOC_GROW() in find_subtree()
      commit.c: use ALLOC_GROW() in register_commit_graft()
      diff.c: use ALLOC_GROW()
      diffcore-rename.c: use ALLOC_GROW()
      patch-ids.c: use ALLOC_GROW() in add_commit()
      replace_object.c: use ALLOC_GROW() in register_replace_object()
      reflog-walk.c: use ALLOC_GROW()
      dir.c: use ALLOC_GROW() in create_simplify()
      attr.c: use ALLOC_GROW() in handle_attr_line()
      builtin/mktree.c: use ALLOC_GROW() in append_to_tree()
      read-cache.c: use ALLOC_GROW() in add_index_entry()
      sha1_file.c: use ALLOC_GROW() in pretend_sha1_file()

Elia Pinto (9):
      bisect.c: reduce scope of variable
      builtin/apply.c: reduce scope of variables
      builtin/blame.c: reduce scope of variables
      builtin/clean.c: reduce scope of variable
      builtin/commit.c: reduce scope of variables
      builtin/fetch.c: reduce scope of variable
      builtin/gc.c: reduce scope of variables
      check-builtins.sh: use the $(...) construct for command substitution
      git-am.sh: use the $(...) construct for command substitution

Eric Sunshine (2):
      name-hash: retire unused index_name_exists()
      sh-i18n--envsubst: retire unused string_list_member()

Fabian Ruch (1):
      add: use struct argv_array in run_add_interactive()

Felipe Contreras (10):
      transport-helper: mismerge fix
      transport-helper: don't update refs in dry-run
      transport-helper: add 'force' to 'export' helpers
      transport-helper: check for 'forced update' message
      remote-helpers: allow all tests running from any dir
      remote-hg: always normalize paths
      remote-bzr: add support for older versions
      completion: fix completing args of aliased "push", "fetch", etc.
      remote-bzr: trivial test fix
      prompt: fix missing file errors in zsh

Hiroyuki Sano (1):
      fsck: use bitwise-or assignment operator to set flag

Ilya Bobyr (1):
      rev-parse --parseopt: option argument name hints

Jacopo Notarstefano (2):
      git-bisect.sh: fix a few style issues
      branch.c: delete size check of newly tracked branch names

Jeff King (43):
      pack-objects: split add_object_entry
      repack: stop using magic number for ARRAY_SIZE(exts)
      repack: turn exts array into array-of-struct
      repack: handle optional files created by pack-objects
      t: add basic bitmap functionality tests
      t/perf: add tests for pack bitmaps
      cat-file: refactor error handling of batch_objects
      cat-file: fix a minor memory leak in batch_objects
      do not discard revindex when re-preparing packfiles
      block-sha1: factor out get_be and put_be wrappers
      read-cache: use get_be32 instead of hand-rolled ntoh_l
      tests: auto-set git-daemon port
      ewah: unconditionally ntohll ewah data
      tests: turn on network daemon tests by default
      http: never use curl_easy_perform
      config: disallow relative include paths from blobs
      docs: clarify remote restrictions for git-upload-archive
      CodingGuidelines: mention C whitespace rules
      repack: add `repack.packKeptObjects` config var
      docs: mark info/grafts as outdated
      match_explicit: hoist refspec lhs checks into their own function
      match_explicit_lhs: allow a "verify only" mode
      push: detect local refspec errors early
      cat-file: restore warn_on_object_refname_ambiguity flag
      rev-list: disable object/refname ambiguity check with --stdin
      pack-objects: show progress for reused packfiles
      pack-objects: show reused packfile objects in "Counting objects"
      pack-objects: turn off bitmaps when skipping objects
      subtree: initialize "prefix" variable
      t/Makefile: stop setting GIT_CONFIG
      t/test-lib: drop redundant unset of GIT_CONFIG
      t: drop useless sane_unset GIT_* calls
      t: stop using GIT_CONFIG to cross repo boundaries
      t: prefer "git config --file" to GIT_CONFIG with test_must_fail
      t: prefer "git config --file" to GIT_CONFIG
      t0001: make symlink reinit test more careful
      t0001: use test_path_is_*
      t0001: use test_config_global
      t0001: use test_must_fail
      t0001: drop useless subshells
      t0001: drop subshells just for "cd"
      pack-objects: do not reuse packfiles without --delta-base-offset
      config.c: mark die_bad_number as NORETURN

Jens Lehmann (2):
      submodule: don't access the .gitmodules cache entry after removing it
      submodule update: consistently document the '--checkout' option

Johan Herland (1):
      notes: disallow reusing non-blob as a note object

Johannes Sixt (11):
      t0008: skip trailing space test on Windows
      userdiff: support C++ ->* and .* operators in the word regexp
      userdiff: support unsigned and long long suffixes of integer constants
      t4018: an infrastructure to test hunk headers
      t4018: convert perl pattern tests to the new infrastructure
      t4018: convert java pattern test to the new infrastructure
      t4018: convert custom pattern test to the new infrastructure
      t4018: reduce test files for pattern compilation tests
      t4018: test cases for the built-in cpp pattern
      t4018: test cases showing that the cpp pattern misses many anchor points
      userdiff: have 'cpp' hunk header pattern catch more C++ anchor points

John Keeping (4):
      notes-utils: handle boolean notes.rewritemode correctly
      utf8: fix iconv error detection
      utf8: use correct type for values in interval table
      builtin/mv: don't use memory after free

John Marshall (1):
      stash doc: mention short form -k in save description

Jonathan Nieder (3):
      am doc: add a pointer to relevant hooks
      .gitignore: test-hashmap is a generated file
      test-hashmap.c: drop unnecessary #includes

Junio C Hamano (35):
      git add <pathspec>... defaults to "-A"
      git add: -u/-A now affects the entire working tree
      core.statinfo: remove as promised in Git 2.0
      push: switch default from "matching" to "simple"
      diff: remove "diff-files -q" in a version of Git in a distant future
      push: switch default from "matching" to "simple"
      t3004: add test for ls-files on symlinks via absolute paths
      open_istream(): do not dereference NULL in the error case
      combine-diff: simplify intersect_paths() further
      commit-tree: add and document --no-gpg-sign
      request-pull: pick up tag message as before
      request-pull: test updates
      request-pull: resurrect "pretty refname" feature
      *.sh: drop useless use of "env"
      tag: grok "--with" as synonym to "--contains"
      Start preparing for Git 2.0
      request-pull: documentation updates
      Update draft release notes to Git 2.0
      Update draft release notes to Git 2.0
      Update draft release notes to 2.0
      t1502: protect runs of SPs used in the indentation
      parse-options: multi-word argh should use dash to separate words
      update-index: teach --cacheinfo a new syntax "mode,sha1,path"
      parse-options: make sure argh string does not have SP or _
      Update draft release notes to 2.0
      Update draft release notes to 2.0
      parse-options: add cast to correct pointer type to OPT_SET_PTR
      Update draft release notes to 2.0
      Revert "Merge branch 'wt/doc-submodule-name-path-confusion-2'"
      Revert "submodule: explicit local branch creation in module_clone"
      Revert part of 384364b (Start preparing for Git 2.0, 2014-03-07)
      Update draft release notes to 2.0
      Update draft release notes to 2.0
      Update draft release notes for 2.0
      Git 2.0-rc0

Karsten Blees (14):
      add a hashtable implementation that supports O(1) removal
      buitin/describe.c: use new hash map implementation
      diffcore-rename.c: move code around to prepare for the next patch
      diffcore-rename.c: simplify finding exact renames
      diffcore-rename.c: use new hash map implementation
      name-hash.c: use new hash map implementation for directories
      name-hash.c: remove unreferenced directory entries
      name-hash.c: use new hash map implementation for cache entries
      name-hash.c: remove cache entries instead of marking them CE_UNHASHED
      remove old hash.[ch] implementation
      fix 'git update-index --verbose --again' output
      builtin/update-index.c: cleanup update_one
      read-cache.c: fix memory leaks caused by removed cache entries
      hashmap.h: use 'unsigned int' for hash-codes everywhere

Kirill A. Shutemov (3):
      builtin/config.c: rename check_blob_write() -> check_write()
      config: change git_config_with_options() interface
      config: teach "git config --file -" to read from the standard input

Kirill Smelkov (10):
      tree-diff: allow diff_tree_sha1 to accept NULL sha1
      tree-diff: convert diff_root_tree_sha1() to just call diff_tree_sha1 with old=NULL
      line-log: convert to using diff_tree_sha1()
      revision: convert to using diff_tree_sha1()
      tree-walk: finally switch over tree descriptors to contain a pre-parsed entry
      diffcore-order: export generic ordering interface
      diff test: add tests for combine-diff with orderfile
      combine-diff: optimize combine_diff_path sets intersection
      combine-diff: combine_diff_path.len is not needed anymore
      tests: add checking that combine-diff emits only correct paths

Kyle J. McKay (2):
      test: fix t7001 cp to use POSIX options
      test: fix t5560 on FreeBSD

Lars Gullik Bjønnes (1):
      git-contacts: do not fail parsing of good diffs

Linus Torvalds (2):
      request-pull: more strictly match local/remote branches
      request-pull: allow "local:remote" to specify names on both ends

Marat Radchenko (5):
      MSVC: allow linking with the cURL library
      MSVC: link in invalidcontinue.obj for better POSIX compatibility
      MSVC: fix t0040-parse-options crash
      parse-options: remove unused OPT_SET_PTR
      MSVC: allow using ExtUtils::MakeMaker

Martin Erik Werner (5):
      t0060: add test for prefix_path on symlinks via absolute paths
      t0060: add test for prefix_path when path == work tree
      t0060: add tests for prefix_path when path begins with work tree
      setup: add abspath_part_inside_repo() function
      setup: don't dereference in-tree symlinks for absolute paths

Max Horn (2):
      transport-helper.c: do not overwrite forced bit
      remote-hg: do not fail on invalid bookmarks

Michael Haggerty (14):
      rename read_replace_refs to check_replace_refs
      replace_object: use struct members instead of an array
      find_pack_entry(): document last_found_pack
      sha1_file_name(): declare to return a const string
      sha1_file.c: document a bunch of functions defined in the file
      Add docstrings for lookup_replace_object() and do_lookup_replace_object()
      Document some functions defined in object.c
      cache_tree_find(): remove redundant checks
      cache_tree_find(): find the end of path component using strchrnul()
      cache_tree_find(): fix comment formatting
      cache_tree_find(): remove redundant check
      cache_tree_find(): remove early return
      cache_tree_find(): use path variable when passing over slashes
      git-multimail: update to version 1.0.0

Nguyễn Thái Ngọc Duy (24):
      count-objects: recognize .bitmap in garbage-checking
      t7101, t7014: rename test files to indicate what that file is for
      reset: support "--mixed --intent-to-add" mode
      daemon: move daemonize() to libgit.a
      gc: config option for running --auto in background
      dir: warn about trailing spaces in exclude patterns
      dir: ignore trailing spaces in exclude patterns
      wt-status.c: make cut_line[] const to shrink .data section a bit
      wt-status.c: move cut-line print code out to wt_status_add_cut_line
      use wildmatch() directly without fnmatch() wrapper
      Revert "test-wildmatch: add "perf" command to compare wildmatch and fnmatch"
      stop using fnmatch (either native or compat)
      actually remove compat fnmatch source code
      sha1_file: fix delta_stack memory leak in unpack_entry
      i18n: mark all progress lines for translation
      commit: add --cleanup=scissors
      tag: support --sort=<spec>
      strbuf: style fix -- top opening bracket on a separate line
      upload-pack: send shallow info over stdin to pack-objects
      connect.c: SP after "}", not TAB
      object.h: centralize object flag allocation
      log: add --show-linear-break to help see non-linear history
      gc --aggressive: make --depth configurable
      environment.c: fix constness for odb_pack_keep()

Nicolas Vigier (10):
      cherry-pick, revert: add the --gpg-sign option
      git-sh-setup.sh: add variable to use the stuck-long mode
      am: parse options in stuck-long mode
      am: add the --gpg-sign option
      rebase: remove useless arguments check
      rebase: don't try to match -M option
      rebase: parse options in stuck-long mode
      rebase: add the --gpg-sign option
      commit-tree: add the commit.gpgsign option to sign all commits
      test the commit.gpgsign config option

Ralf Thielow (1):
      help.c: rename function "pretty_print_string_list"

René Scharfe (13):
      t7810: add missing variables to tests in loop
      grep: support -h (no header) with --count
      t4209: set up expectations up front
      t4209: factor out helper function test_log()
      t4209: factor out helper function test_log_icase()
      t4209: use helper functions to test --grep
      t4209: use helper functions to test --author
      pickaxe: honor -i when used with -S and --pickaxe-regex
      pickaxe: merge diffcore_pickaxe_grep() and diffcore_pickaxe_count() into diffcore_pickaxe()
      pickaxe: move pickaxe() after pickaxe_match()
      pickaxe: call strlen only when necessary in diffcore_pickaxe_count()
      pickaxe: simplify kwset loop in contains()
      rev-parse: fix typo in example on manpage

Richard Hansen (2):
      test-hg.sh: tests are now expected to pass
      remote-bzr: support the new 'force' option

Richard Lowe (1):
      diffcore.h: be explicit about the signedness of is_binary

Roberto Tyley (1):
      Documentation: fix documentation AsciiDoc links for external urls

Rohit Mani (1):
      use strchrnul() in place of strchr() and strlen()

Scott J. Goldman (1):
      add uploadarchive.allowUnreachable option

Sebastian Schuberth (1):
      t5510: Do not use $(pwd) when fetching / pushing / pulling via rsync

Simon Ruderich (2):
      git-config: document interactive.singlekey requires Term::ReadKey
      git-add--interactive: warn if module for interactive.singlekey is missing

Sun He (3):
      write_pack_file: use correct variable in diagnostic
      finish_tmp_packfile():use strbuf for pathname construction
      Use hashcpy() when copying object names

Sup Yut Sum (1):
      completion: teach --recurse-submodules to fetch, pull and push

Tanay Abhra (1):
      commit.c: use skip_prefix() instead of starts_with()

Tay Ray Chuan (1):
      demonstrate git-commit --dry-run exit code behaviour

Thomas Gummerer (3):
      introduce GIT_INDEX_VERSION environment variable
      test-lib: allow setting the index format version
      read-cache: add index.version config variable

Torsten Bögershausen (1):
      utf8.c: partially update to version 6.3

Vicent Marti (16):
      revindex: export new APIs
      pack-objects: refactor the packing list
      pack-objects: factor out name_hash
      revision: allow setting custom limiter function
      sha1_file: export `git_open_noatime`
      compat: add endianness helpers
      ewah: compressed bitmap implementation
      documentation: add documentation for the bitmap format
      pack-bitmap: add support for bitmap indexes
      pack-objects: use bitmaps when packing objects
      rev-list: add bitmap mode to speed up object lists
      pack-objects: implement bitmap writing
      repack: consider bitmaps when performing repacks
      pack-bitmap: implement optional name_hash cache
      ewah: support platforms that require aligned reads
      add `ignore_missing_links` mode to revwalk

Vlad Dogaru (1):
      git-p4: explicitly specify that HEAD is a revision

W. Trevor King (6):
      submodule: make 'checkout' update_module mode more explicit
      submodule: document module_clone arguments in comments
      submodule: explicit local branch creation in module_clone
      Documentation: describe 'submodule update --remote' use case
      doc: submodule.* config are keyed by submodule names
      doc: submodule.*.branch config is keyed by name

Yuxuan Shui (2):
      fsck.c:fsck_ident(): ident points at a const string
      fsck.c:fsck_commit(): use skip_prefix() to verify and skip constant

brian m. carlson (1):
      pull: add the --gpg-sign option.

dequis (1):
      remote-bzr: include authors field in pushed commits

Дилян Палаузов (1):
      Makefile: describe CHARSET_LIB better

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Apr 2014, #05; Thu, 17)
@ 2014-04-17 21:01  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2014-04-17 21:01 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.

Hopefully we can merge a few more topics slated for 'master' before
cutting an early preview release -rc0 tomorrow.  Many of the topics
that are in 'next' have sizable impact on the codebase and I'd feel
safer to keep them cooking for the remainder of the cycle.

Also I am still waiting for acks for a few topics before merging
them to 'next'.  I would feel it would be good if we can merge them
early to 'next' for wider and longer exposure and some of them may
even deserve to be in -rc1, but as none of them is a regression fix,
it is also OK to wait until 2.0 final.

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* km/avoid-bs-in-shell-glob (2014-04-11) 1 commit
  (merged to 'next' on 2014-04-14 at a3d9a58)
 + test: fix t5560 on FreeBSD

 Portability fix.
 May want to merge to 'maint' later.


* km/avoid-cp-a (2014-04-11) 1 commit
  (merged to 'next' on 2014-04-14 at be661c4)
 + test: fix t7001 cp to use POSIX options

 Portability fix.
 May want to merge to 'maint' later.


* mh/multimail (2014-04-07) 1 commit
  (merged to 'next' on 2014-04-15 at eaba915)
 + git-multimail: update to version 1.0.0


* tb/unicode-6.3-zero-width (2014-04-09) 1 commit
  (merged to 'next' on 2014-04-14 at 72ce72a)
 + utf8.c: partially update to version 6.3

 Teach our display-column-counting logic about decomposed umlauts
 and friends.

--------------------------------------------------
[New Topics]

* jl/git-gui-show-added-submodule-changes (2014-04-15) 1 commit
 - git-gui: show staged submodules regardless of ignore config

 Tentatively queued what I expect to receive via Pat Thoyts.


* jl/gitk-show-added-submodule-changes (2014-04-15) 3 commits
 - gitk: show staged submodules regardless of ignore config
 - gitk: Merge branch 'new' of https://github.com/vnwildman/gitk
 - l10n: Init Vietnamese translation

 Tentatively queued what I expect to receive via Paul Mackerras.


* bg/rebase-off-of-previous-branch (2014-04-16) 1 commit
 - git-rebase: print name of rev when using shorthand

 Teach "git rebase -" to report the concrete name of the branch
 (i.e. the previous one).

 But it stops short and does not do the same for "git rebase @{-1}".


* ef/send-email-absolute-path-to-the-command (2014-04-16) 1 commit
 - send-email: recognize absolute path on Windows


* jk/config-die-bad-number-noreturn (2014-04-16) 1 commit
  (merged to 'next' on 2014-04-16 at 4d49036)
 + config.c: mark die_bad_number as NORETURN

 Squelch a false compiler warning from older gcc.

 Will merge to 'master'.


* ep/shell-command-substitution (2014-04-17) 14 commits
 - t9362-mw-to-git-utf8.sh: use the $( ... ) construct for command substitution
 - t9360-mw-to-git-clone.sh: use the $( ... ) construct for command substitution
 - git-tag.sh: use the $( ... ) construct for command substitution
 - git-revert.sh: use the $( ... ) construct for command substitution
 - git-resolve.sh: use the $( ... ) construct for command substitution
 - git-repack.sh: use the $( ... ) construct for command substitution
 - git-merge.sh: use the $( ... ) construct for command substitution
 - git-ls-remote.sh: use the $( ... ) construct for command substitution
 - git-fetch.sh: use the $( ... ) construct for command substitution
 - git-commit.sh: use the $( ... ) construct for command substitution
 - git-clone.sh: use the $( ... ) construct for command substitution
 - git-checkout.sh: use the $( ... ) construct for command substitution
 - install-webdoc.sh: use the $( ... ) construct for command substitution
 - howto-index.sh: use the $( ... ) construct for command substitution

 Will merge to 'next' and perhaps to 'master'.


* jh/submodule-tests (2014-04-17) 1 commit
 - t7410: 210 tests for various 'git submodule update' scenarios


* jx/i18n (2014-04-17) 3 commits
 - i18n: only extract comments marked with "TRANSLATORS:"
 - i18n: remove obsolete comments for translators in diffstat generation
 - i18n: fix uncatchable comments for translators in date.c

 The tip one is somewhat unfortunate to force us deviate from our
 multi-line comment formatting convention when writing comments for
 translators.


* rs/ref-update-check-errors-early (2014-04-17) 2 commits
 - commit.c: check for lock error and return early
 - sequencer.c: check for lock failure and bail early in fast_forward_to


* sk/svn-parse-datestamp (2014-04-17) 1 commit
 - SVN.pm::parse_svn_date: allow timestamps with a single-digit hour

--------------------------------------------------
[Stalled]

* fc/publish-vs-upstream (2014-04-11) 8 commits
 - sha1_name: add support for @{publish} marks
 - sha1_name: simplify track finding
 - sha1_name: cleanup interpret_branch_name()
 - branch: display publish branch
 - push: add --set-publish option
 - branch: add --set-publish-to option
 - Add concept of 'publish' branch
 - t5516 (fetch-push): fix test restoration

 Add branch@{publish}; it seems that this is somewhat different from
 Ram and Peff started working on.  There are still many discussion
 messages going back and forth but not updates to the patches.

 Seems to have some interactions to break t5516 when merged to 'pu'.


* tr/merge-recursive-index-only (2014-02-05) 3 commits
 - merge-recursive: -Xindex-only to leave worktree unchanged
 - merge-recursive: internal flag to avoid touching the worktree
 - merge-recursive: remove dead conditional in update_stages()
 (this branch is used by tr/remerge-diff.)

 Will hold.


* tr/remerge-diff (2014-02-26) 5 commits
 . log --remerge-diff: show what the conflict resolution changed
 . name-hash: allow dir hashing even when !ignore_case
 . merge-recursive: allow storing conflict hunks in index
 . revision: fold all merge diff variants into an enum merge_diff_mode
 . combine-diff: do not pass revs->dense_combined_merges redundantly
 (this branch uses tr/merge-recursive-index-only.)

 "log -p" output learns a new way to let users inspect a merge
 commit by showing the differences between the automerged result
 with conflicts the person who recorded the merge would have seen
 and the final conflict resolution that was recorded in the merge.

 Needs to be rebased, now kb/fast-hashmap topic is in.


* bc/blame-crlf-test (2014-02-18) 1 commit
 - blame: add a failing test for a CRLF issue.

 I have a feeling that a fix for this should be fairly isolated and
 trivial (it should be just the matter of paying attention to the
 crlf settings when synthesizing the fake commit)---perhaps somebody
 can squash in a fix to this?


* jk/makefile (2014-02-05) 16 commits
 - FIXUP
 - move LESS/LV pager environment to Makefile
 - Makefile: teach scripts to include make variables
 - FIXUP
 - Makefile: auto-build C strings from make variables
 - Makefile: drop *_SQ variables
 - FIXUP
 - Makefile: add c-quote helper function
 - Makefile: introduce sq function for shell-quoting
 - Makefile: always create files via make-var
 - Makefile: store GIT-* sentinel files in MAKE/
 - Makefile: prefer printf to echo for GIT-*
 - Makefile: use tempfile/mv strategy for GIT-*
 - Makefile: introduce make-var helper function
 - Makefile: fix git-instaweb dependency on gitweb
 - Makefile: drop USE_GETTEXT_SCHEME from GIT-CFLAGS

 Simplify the Makefile rules and macros that exist primarily for
 quoting purposes, and make it easier to robustly express the
 dependency rules.

 Expecting a reroll.


* po/everyday-doc (2014-01-27) 1 commit
 - Make 'git help everyday' work

 This may make the said command to emit something, but the source is
 not meant to be formatted into a manual pages to begin with, and
 also its contents are a bit stale.  It may be a good first step in
 the right direction, but needs more work to at least get the
 mark-up right before public consumption.

 Will hold.


* jk/branch-at-publish-rebased (2014-01-17) 5 commits
 . t1507 (rev-parse-upstream): fix typo in test title
 . implement @{publish} shorthand
 . branch_get: provide per-branch pushremote pointers
 . branch_get: return early on error
 . sha1_name: refactor upstream_mark

 Give an easier access to the tracking branches from "other" side in
 a triangular workflow by introducing B@{publish} that works in a
 similar way to how B@{upstream} does.

 Meant to be used as a basis for whatever Ram wants to build on.

 Ejected from 'pu' to make room for fc/publish-vs-upstream topic.


* rb/merge-prepare-commit-msg-hook (2014-01-10) 4 commits
 - merge: drop unused arg from abort_commit method signature
 - merge: make prepare_to_commit responsible for write_merge_state
 - t7505: ensure cleanup after hook blocks merge
 - t7505: add missing &&

 Expose more merge states (e.g. $GIT_DIR/MERGE_MODE) to hooks that
 run during "git merge".  The log message stresses too much on one
 hook, prepare-commit-msg, but it would equally apply to other hooks
 like post-merge, I think.

 Waiting for a reroll.


* jl/submodule-recursive-checkout (2013-12-26) 5 commits
 - Teach checkout to recursively checkout submodules
 - submodule: teach unpack_trees() to update submodules
 - submodule: teach unpack_trees() to repopulate submodules
 - submodule: teach unpack_trees() to remove submodule contents
 - submodule: prepare for recursive checkout of submodules

 An RFCv2 exists ($gmane/241455) with sizable review comments.
 Expecting a reroll.


* jc/graph-post-root-gap (2013-12-30) 3 commits
 - WIP: document what we want at the end
 - graph: remove unused code a bit
 - graph: stuff the current commit into graph->columns[]

 This was primarily a RFH ($gmane/239580).


* np/pack-v4 (2013-09-18) 90 commits
 . packv4-parse.c: add tree offset caching
 . t1050: replace one instance of show-index with verify-pack
 . index-pack, pack-objects: allow creating .idx v2 with .pack v4
 . unpack-objects: decode v4 trees
 . unpack-objects: allow to save processed bytes to a buffer
 - ...

 Nico and Duy advancing the eternal vaporware pack-v4.  This is here
 primarily for wider distribution of the preview edition.

 Needs to be rebased, now the pack-bitmap series is in.


* tg/perf-lib-test-perf-cleanup (2013-09-19) 2 commits
 - perf-lib: add test_perf_cleanup target
 - perf-lib: split starting the test from the execution

 Add test_perf_cleanup shell function to the perf suite, that allows
 the script writers to define a test with a clean-up action.

 Will hold.


* jc/format-patch (2013-04-22) 2 commits
 - format-patch: --inline-single
 - format-patch: rename "no_inline" field

 A new option to send a single patch to the standard output to be
 appended at the bottom of a message.  I personally have no need for
 this, but it was easy enough to cobble together.  Tests, docs and
 stripping out more MIMEy stuff are left as exercises to interested
 parties.


* jc/show-branch (2014-03-24) 5 commits
 - show-branch: use commit slab to represent bitflags of arbitrary width
 - show-branch.c: remove "all_mask"
 - show-branch.c: abstract out "flags" operation
 - show-branch.c: lift all_mask/all_revs to a global static
 - show-branch.c: update comment style

 Waiting for the final step to lift the hard-limit before sending it out.

--------------------------------------------------
[Cooking]

* fc/prompt-zsh-read-from-file (2014-04-14) 1 commit
  (merged to 'next' on 2014-04-16 at 0e5fec0)
 + prompt: fix missing file errors in zsh

 Will merge to 'master'.


* fc/transport-helper-sync-error-fix (2014-04-14) 5 commits
 - transport-helper: fix sync issue on crashes
 - transport-helper: trivial cleanup
 - transport-helper: propagate recvline() error pushing
 - remote-helpers: make recvline return an error
 - transport-helper: remove barely used xchgline()

 Make sure the marks are not written out when the transport helper
 did not finish happily, to avoid marks file that is out of sync
 with the reality.

 As I had to resolve some conflicts with the recent code, will wait
 until getting an OK from Felipe on the conflict resolution and then
 hopefully can be merged to 'next' and then later to 'master'.


* km/avoid-non-function-return-in-rebase (2014-04-17) 2 commits
 - Revert "rebase: fix run_specific_rebase's use of "return" on FreeBSD"
 - rebase: avoid non-function use of "return" on FreeBSD

 Work around /bin/sh that does not like "return" at the top-level
 of a file that is dot-sourced from inside a function definition.

 Will merge to 'next' after the discussion on in-code comment settles.

 We may want to merge it to 'master' by -rc1 if no regressions are
 reported.


* db/make-with-curl (2014-04-15) 2 commits
  (merged to 'next' on 2014-04-16 at b9c8527)
 + Makefile: allow static linking against libcurl
 + Makefile: use curl-config to determine curl flags

 Ask curl-config how to link with the curl library, instead of
 having only a limited configurability knobs in the Makefile.

 Will merge to 'master' by -rc1 if no regressions are reported.


* nd/index-pack-one-fd-per-thread (2014-04-16) 1 commit
  (merged to 'next' on 2014-04-16 at b38d5a9)
 + index-pack: work around thread-unsafe pread()

 Enable threaded index-pack on platforms without thread-unsafe
 pread() emulation.

 Will keep in 'next' for the remainder of the cycle.


* fc/complete-aliased-push (2014-04-09) 1 commit
  (merged to 'next' on 2014-04-16 at ab798d1)
 + completion: fix completing args of aliased "push", "fetch", etc.

 Will merge to 'master'.


* fc/remote-helper-fixes (2014-04-14) 5 commits
  (merged to 'next' on 2014-04-16 at 180482e)
 + remote-bzr: trivial test fix
 + remote-bzr: include authors field in pushed commits
 + remote-bzr: add support for older versions
 + remote-hg: always normalize paths
 + remote-helpers: allow all tests running from any dir

 Will merge to 'master'.


* ym/fix-opportunistic-index-update-race (2014-04-10) 2 commits
  (merged to 'next' on 2014-04-16 at cb92f4f)
 + read-cache.c: verify index file before we opportunistically update it
 + wrapper.c: add xpread() similar to xread()

 Read-only operations such as "git status" that internally refreshes
 the index write out the refreshed index to the disk to optimize
 future accesses to the working tree, but this could race with a
 "read-write" operation that modify the index while it is running.
 Detect such a race and avoid overwriting the index.

 Duy raised a good point that we may need to do the same for the
 normal writeout codepath, not just the "opportunistic" update
 codepath.  While that is true, nobody sane would be running two
 simultaneous operations that are clearly write-oriented competing
 with each other against the same index file.  So in that sense that
 can be done as a less urgent follow-up for this topic.

 Will keep in 'next' for the remainder of the cycle.


* jl/status-added-submodule-is-never-ignored (2014-04-07) 2 commits
 - commit -m: commit staged submodules regardless of ignore config
 - status/commit: show staged submodules regardless of ignore config

 There also are a few patches Ronald Weiss and Jens are working on
 polishing around this topic, and a patch from Jens each for gitk
 and git-gui.

 Waiting for the dust to settle until picking them up all.


* mh/lockfile (2014-04-15) 25 commits
 - trim_last_path_elm(): replace last_path_elm()
 - resolve_symlink(): take a strbuf parameter
 - resolve_symlink(): use a strbuf for internal scratch space
 - change lock_file::filename into a strbuf
 - commit_lock_file(): use a strbuf to manage temporary space
 - try_merge_strategy(): use a statically-allocated lock_file object
 - try_merge_strategy(): remove redundant lock_file allocation
 - struct lock_file: declare some fields volatile
 - lockfile: avoid transitory invalid states
 - commit_lock_file(): die() if called for unlocked lockfile object
 - commit_lock_file(): inline temporary variable
 - remove_lock_file(): call rollback_lock_file()
 - lock_file(): exit early if lockfile cannot be opened
 - write_packed_entry_fn(): convert cb_data into a (const int *)
 - prepare_index(): declare return value to be (const char *)
 - delete_ref_loose(): don't muck around in the lock_file's filename
 - cache.h: define constants LOCK_SUFFIX and LOCK_SUFFIX_LEN
 - lockfile.c: document the various states of lock_file objects
 - lock_file(): always add lock_file object to lock_file_list
 - hold_lock_file_for_append(): release lock on errors
 - lockfile: unlock file if lockfile permissions cannot be adjusted
 - rollback_lock_file(): set fd to -1
 - rollback_lock_file(): do not clear filename redundantly
 - api-lockfile: expand the documentation
 - unable_to_lock_die(): rename function from unable_to_lock_index_die()

 Refactor and fix corner-case bugs in the lockfile API, all looked
 sensible.

 Expecting a reroll.


* mt/patch-id-stable (2014-03-31) 3 commits
  (merged to 'next' on 2014-04-08 at 0188d44)
 + patch-id-test: test --stable and --unstable flags
 + patch-id: document new behaviour
 + patch-id: make it stable against hunk reordering

 Introduce a new way to compute patch-id for a patch that is not
 affected by the order of the paths that appear in the input.

 This changes the generated patch-id unless the users add an extra
 option to their command lines, but I deliberately queued the series
 to 'next' without reverting that compatibility breakage to see if
 people complain.  It could be that we do not have to worry about
 the default flipping at all.  We'll see.

 Will keep in 'next' for the remainder of the cycle.


* mh/ref-transaction (2014-04-07) 27 commits
  (merged to 'next' on 2014-04-16 at a99f84d)
 + ref_transaction_commit(): work with transaction->updates in place
 + struct ref_update: add a type field
 + struct ref_update: add a lock field
 + ref_transaction_commit(): simplify code using temporary variables
 + struct ref_update: store refname as a FLEX_ARRAY
 + struct ref_update: rename field "ref_name" to "refname"
 + refs: remove API function update_refs()
 + update-ref --stdin: reimplement using reference transactions
 + refs: add a concept of a reference transaction
 + update-ref --stdin: harmonize error messages
 + update-ref --stdin: improve the error message for unexpected EOF
 + t1400: test one mistake at a time
 + update-ref --stdin -z: deprecate interpreting the empty string as zeros
 + update-ref.c: extract a new function, parse_next_sha1()
 + t1400: test that stdin -z update treats empty <newvalue> as zeros
 + update-ref --stdin: simplify error messages for missing oldvalues
 + update-ref --stdin: make error messages more consistent
 + update-ref --stdin: improve error messages for invalid values
 + update-ref.c: extract a new function, parse_refname()
 + parse_cmd_verify(): copy old_sha1 instead of evaluating <oldvalue> twice
 + update-ref --stdin: read the whole input at once
 + update_refs(): fix constness
 + refs.h: rename the action_on_err constants
 + t1400: add some more tests involving quoted arguments
 + parse_arg(): really test that argument is properly terminated
 + t1400: provide more usual input to the command
 + t1400: fix name and expected result of one test

 Update "update-ref --stdin [-z]" and then introduce a transactional
 support for (multi-)reference updates.

 Will keep in 'next' for the remainder of the cycle.


* jc/apply-ignore-whitespace (2014-03-26) 1 commit
  (merged to 'next' on 2014-04-04 at 53779a7)
 + apply --ignore-space-change: lines with and without leading whitespaces do not match

 "--ignore-space-change" option of "git apply" ignored the
 spaces at the beginning of line too aggressively, which is
 inconsistent with the option of the same name "diff" and "git diff"
 have.

 Will keep in 'next' for the remainder of the cycle.


* as/grep-fullname-config (2014-03-20) 1 commit
  (merged to 'next' on 2014-03-28 at 810a076)
 + grep: add grep.fullName config variable

 Add a configuration variable to force --full-name to be default for
 "git grep".

 This may cause regressions on scripted users that do not expect
 this new behaviour.

 Will keep in 'next' for the remainder of the cycle.


* nd/multiple-work-trees (2014-03-25) 28 commits
 - count-objects: report unused files in $GIT_DIR/repos/...
 - gc: support prune --repos
 - gc: style change -- no SP before closing bracket
 - prune: strategies for linked checkouts
 - checkout: detach if the branch is already checked out elsewhere
 - checkout: clean up half-prepared directories in --to mode
 - checkout: support checking out into a new working directory
 - use new wrapper write_file() for simple file writing
 - wrapper.c: wrapper to open a file, fprintf then close
 - setup.c: support multi-checkout repo setup
 - setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()
 - setup.c: convert check_repository_format_gently to use strbuf
 - setup.c: detect $GIT_COMMON_DIR in is_git_directory()
 - setup.c: convert is_git_directory() to use strbuf
 - git-stash: avoid hardcoding $GIT_DIR/logs/....
 - *.sh: avoid hardcoding $GIT_DIR/hooks/...
 - git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objects
 - $GIT_COMMON_DIR: a new environment variable
 - commit: use SEQ_DIR instead of hardcoding "sequencer"
 - fast-import: use git_path() for accessing .git dir instead of get_git_dir()
 - reflog: avoid constructing .lock path with git_path
 - *.sh: respect $GIT_INDEX_FILE
 - git_path(): be aware of file relocation in $GIT_DIR
 - path.c: group git_path(), git_pathdup() and strbuf_git_path() together
 - path.c: rename vsnpath() to do_git_path()
 - git_snpath(): retire and replace with strbuf_git_path()
 - path.c: make get_pathname() call sites return const char *
 - path.c: make get_pathname() return strbuf instead of static buffer

 A replacement for contrib/workdir/git-new-workdir that does not
 rely on symbolic links and make sharing of objects and refs safer
 by making the borrowee and borrowers aware of each other.

 Will hold.


* ks/tree-diff-nway (2014-04-09) 20 commits
  (merged to 'next' on 2014-04-09 at c17228e)
 + mingw: activate alloca
  (merged to 'next' on 2014-04-08 at 6b74773)
 + combine-diff: speed it up, by using multiparent diff tree-walker directly
 + tree-diff: rework diff_tree() to generate diffs for multiparent cases as well
 + Portable alloca for Git
  (merged to 'next' on 2014-03-31 at 16a7bd4)
 + tree-diff: reuse base str(buf) memory on sub-tree recursion
 + tree-diff: no need to call "full" diff_tree_sha1 from show_path()
 + tree-diff: rework diff_tree interface to be sha1 based
 + tree-diff: diff_tree() should now be static
 + tree-diff: remove special-case diff-emitting code for empty-tree cases
  (merged to 'next' on 2014-03-25 at cfcbdac)
 + tree-diff: simplify tree_entry_pathcmp
 + tree-diff: show_path prototype is not needed anymore
 + tree-diff: rename compare_tree_entry -> tree_entry_pathcmp
 + tree-diff: move all action-taking code out of compare_tree_entry()
 + tree-diff: don't assume compare_tree_entry() returns -1,0,1
  (merged to 'next' on 2014-03-21 at d872679)
 + tree-diff: consolidate code for emitting diffs and recursion in one place
 + tree-diff: show_tree() is not needed
 + tree-diff: no need to pass match to skip_uninteresting()
 + tree-diff: no need to manually verify that there is no mode change for a path
 + combine-diff: move changed-paths scanning logic into its own function
 + combine-diff: move show_log_first logic/action out of paths scanning

 Instead of running N pair-wise diff-trees when inspecting a
 N-parent merge, find the set of paths that were touched by walking
 N+1 trees in parallel.  These set of paths can then be turned into
 N pair-wise diff-tree results to be processed through rename
 detections and such.  And N=2 case nicely degenerates to the usual
 2-way diff-tree, which is very nice.

 Will keep in 'next' for the remainder of the cycle.


* cc/interpret-trailers (2014-04-07) 12 commits
 - trailer: add blank line before the trailers if needed
 - Documentation: add documentation for 'git interpret-trailers'
 - trailer: add tests for commands in config file
 - trailer: execute command from 'trailer.<name>.command'
 - trailer: add tests for "git interpret-trailers"
 - trailer: add interpret-trailers command
 - trailer: put all the processing together and print
 - trailer: parse trailers from stdin
 - trailer: process command line trailer arguments
 - trailer: read and process config information
 - trailer: process trailers from stdin and arguments
 - trailer: add data structures and basic functions

 A new filter to programatically edit the tail end of the commit log
 messages.

 I was planning to merge it to 'next' and keep it there for the
 remainder of the cycle, but it appears that there still will be
 another round of reroll, at least for the documentation?

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Apr 2014, #04; Tue, 15)
@ 2014-04-15 22:12  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2014-04-15 22:12 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.

The number of topics cooking in 'next' has been shrinking, and the
cycle is getting long. Hopefully we will have -rc0 late this week to
close the 'master' branch and a few rounds of -rc iterations until
2.0 final. Other topics under discussion may continue to flow to
'next', as usual, during that time, to be pushed out early in the
next cycle.

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[New Topics]

* fc/prompt-zsh-read-from-file (2014-04-14) 1 commit
 - prompt: fix missing file errors in zsh

 Will merge to 'next' and to 'master'.


* fc/transport-helper-sync-error-fix (2014-04-14) 5 commits
 - transport-helper: fix sync issue on crashes
 - transport-helper: trivial cleanup
 - transport-helper: propagate recvline() error pushing
 - remote-helpers: make recvline return an error
 - transport-helper: remove barely used xchgline()

 Make sure the marks are not written out when the transport helper
 did not finish happily, to avoid marks file that is out of sync
 with the reality.

 As I had to resolve some conflicts with the recent code, will wait
 until getting an OK from Felipe on the conflict resolution and then
 hopefully can be merged to 'next' and then later to 'master'.


* km/avoid-non-function-return-in-rebase (2014-04-14) 2 commits
 - Revert "rebase: fix run_specific_rebase's use of "return" on FreeBSD"
 - rebase: avoid non-function use of "return" on FreeBSD

 Work around /bin/sh that does not like "return" at the top-level
 of a file that is dot-sourced from inside a function definition.

 Will merge to 'next'.

 We may want to merge it to 'master' by -rc1 if no regressions are
 reported.


* db/make-with-curl (2014-04-15) 2 commits
 - Makefile: allow static linking against libcurl
 - Makefile: use curl-config to determine curl flags

 Ask curl-config how to link with the curl library, instead of
 having only a limited configurability knobs in the Makefile.

 Will merge to 'next'.

 We may want to merge it to 'master' by -rc1 if no regressions are
 reported.

--------------------------------------------------
[Stalled]

* tr/merge-recursive-index-only (2014-02-05) 3 commits
 - merge-recursive: -Xindex-only to leave worktree unchanged
 - merge-recursive: internal flag to avoid touching the worktree
 - merge-recursive: remove dead conditional in update_stages()
 (this branch is used by tr/remerge-diff.)

 Will hold.


* tr/remerge-diff (2014-02-26) 5 commits
 . log --remerge-diff: show what the conflict resolution changed
 . name-hash: allow dir hashing even when !ignore_case
 . merge-recursive: allow storing conflict hunks in index
 . revision: fold all merge diff variants into an enum merge_diff_mode
 . combine-diff: do not pass revs->dense_combined_merges redundantly
 (this branch uses tr/merge-recursive-index-only.)

 "log -p" output learns a new way to let users inspect a merge
 commit by showing the differences between the automerged result
 with conflicts the person who recorded the merge would have seen
 and the final conflict resolution that was recorded in the merge.

 Needs to be rebased, now kb/fast-hashmap topic is in.


* bc/blame-crlf-test (2014-02-18) 1 commit
 - blame: add a failing test for a CRLF issue.

 I have a feeling that a fix for this should be fairly isolated and
 trivial (it should be just the matter of paying attention to the
 crlf settings when synthesizing the fake commit)---perhaps somebody
 can squash in a fix to this?


* jk/makefile (2014-02-05) 16 commits
 - FIXUP
 - move LESS/LV pager environment to Makefile
 - Makefile: teach scripts to include make variables
 - FIXUP
 - Makefile: auto-build C strings from make variables
 - Makefile: drop *_SQ variables
 - FIXUP
 - Makefile: add c-quote helper function
 - Makefile: introduce sq function for shell-quoting
 - Makefile: always create files via make-var
 - Makefile: store GIT-* sentinel files in MAKE/
 - Makefile: prefer printf to echo for GIT-*
 - Makefile: use tempfile/mv strategy for GIT-*
 - Makefile: introduce make-var helper function
 - Makefile: fix git-instaweb dependency on gitweb
 - Makefile: drop USE_GETTEXT_SCHEME from GIT-CFLAGS

 Simplify the Makefile rules and macros that exist primarily for
 quoting purposes, and make it easier to robustly express the
 dependency rules.

 Expecting a reroll.


* po/everyday-doc (2014-01-27) 1 commit
 - Make 'git help everyday' work

 This may make the said command to emit something, but the source is
 not meant to be formatted into a manual pages to begin with, and
 also its contents are a bit stale.  It may be a good first step in
 the right direction, but needs more work to at least get the
 mark-up right before public consumption.

 Will hold.


* jk/branch-at-publish-rebased (2014-01-17) 5 commits
 . t1507 (rev-parse-upstream): fix typo in test title
 . implement @{publish} shorthand
 . branch_get: provide per-branch pushremote pointers
 . branch_get: return early on error
 . sha1_name: refactor upstream_mark

 Give an easier access to the tracking branches from "other" side in
 a triangular workflow by introducing B@{publish} that works in a
 similar way to how B@{upstream} does.

 Meant to be used as a basis for whatever Ram wants to build on.

 Ejected from 'pu' to make room for fc/publish-vs-upstream topic.


* rb/merge-prepare-commit-msg-hook (2014-01-10) 4 commits
 - merge: drop unused arg from abort_commit method signature
 - merge: make prepare_to_commit responsible for write_merge_state
 - t7505: ensure cleanup after hook blocks merge
 - t7505: add missing &&

 Expose more merge states (e.g. $GIT_DIR/MERGE_MODE) to hooks that
 run during "git merge".  The log message stresses too much on one
 hook, prepare-commit-msg, but it would equally apply to other hooks
 like post-merge, I think.

 Waiting for a reroll.


* jl/submodule-recursive-checkout (2013-12-26) 5 commits
 - Teach checkout to recursively checkout submodules
 - submodule: teach unpack_trees() to update submodules
 - submodule: teach unpack_trees() to repopulate submodules
 - submodule: teach unpack_trees() to remove submodule contents
 - submodule: prepare for recursive checkout of submodules

 Expecting a reroll.


* jc/graph-post-root-gap (2013-12-30) 3 commits
 - WIP: document what we want at the end
 - graph: remove unused code a bit
 - graph: stuff the current commit into graph->columns[]

 This was primarily a RFH ($gmane/239580).


* np/pack-v4 (2013-09-18) 90 commits
 . packv4-parse.c: add tree offset caching
 . t1050: replace one instance of show-index with verify-pack
 . index-pack, pack-objects: allow creating .idx v2 with .pack v4
 . unpack-objects: decode v4 trees
 . unpack-objects: allow to save processed bytes to a buffer
 - ...

 Nico and Duy advancing the eternal vaporware pack-v4.  This is here
 primarily for wider distribution of the preview edition.

 Needs to be rebased, now the pack-bitmap series is in.


* tg/perf-lib-test-perf-cleanup (2013-09-19) 2 commits
 - perf-lib: add test_perf_cleanup target
 - perf-lib: split starting the test from the execution

 Add test_perf_cleanup shell function to the perf suite, that allows
 the script writers to define a test with a clean-up action.

 Will hold.


* jc/format-patch (2013-04-22) 2 commits
 - format-patch: --inline-single
 - format-patch: rename "no_inline" field

 A new option to send a single patch to the standard output to be
 appended at the bottom of a message.  I personally have no need for
 this, but it was easy enough to cobble together.  Tests, docs and
 stripping out more MIMEy stuff are left as exercises to interested
 parties.


* jc/show-branch (2014-03-24) 5 commits
 - show-branch: use commit slab to represent bitflags of arbitrary width
 - show-branch.c: remove "all_mask"
 - show-branch.c: abstract out "flags" operation
 - show-branch.c: lift all_mask/all_revs to a global static
 - show-branch.c: update comment style

 Waiting for the final step to lift the hard-limit before sending it out.

--------------------------------------------------
[Cooking]

* nd/index-pack-one-fd-per-thread (2014-04-09) 1 commit
 - index-pack: work around thread-unsafe pread()

 Enable threaded index-pack on platforms without thread-unsafe
 pread() emulation.

 The log message may need to be replaced ($gmane/246176, $gmane/246290).


* tb/unicode-6.3-zero-width (2014-04-09) 1 commit
  (merged to 'next' on 2014-04-14 at 72ce72a)
 + utf8.c: partially update to version 6.3

 Teach our display-column-counting logic about decomposed umlauts
 and friends.

 Will merge to 'master'.


* fc/complete-aliased-push (2014-04-09) 1 commit
 - completion: fix completing args of aliased "push", "fetch", etc.

 Will merge to 'next'.


* fc/remote-helper-fixes (2014-04-14) 5 commits
 - remote-bzr: trivial test fix
 - remote-bzr: include authors field in pushed commits
 - remote-bzr: add support for older versions
 - remote-hg: always normalize paths
 - remote-helpers: allow all tests running from any dir

 Will merge to 'next'.


* fc/publish-vs-upstream (2014-04-11) 8 commits
 - sha1_name: add support for @{publish} marks
 - sha1_name: simplify track finding
 - sha1_name: cleanup interpret_branch_name()
 - branch: display publish branch
 - push: add --set-publish option
 - branch: add --set-publish-to option
 - Add concept of 'publish' branch
 - t5516 (fetch-push): fix test restoration

 Add branch@{publish}; this round v3 hasn't yet seen much reviews
 yet.

 Seems to have some interactions to break t5516 when merged to 'pu'.


* ym/fix-opportunistic-index-update-race (2014-04-10) 2 commits
 - read-cache.c: verify index file before we opportunistically update it
 - wrapper.c: add xpread() similar to xread()

 Duy raised a good point that we may need to do the same for the
 normal writeout codepath, not just the "opportunistic" update
 codepath.  While that is true, nobody sane would be running two
 simultaneous operations that are clearly write-oriented competing
 with each other against the same index file.  So in that sense that
 can be done as a less urgent follow-up for this topic.

 Will merge to 'next' and keep it there for the remainder of the cycle.


* km/avoid-bs-in-shell-glob (2014-04-11) 1 commit
  (merged to 'next' on 2014-04-14 at a3d9a58)
 + test: fix t5560 on FreeBSD

 Portability fix.
 Will merge to 'master'.


* km/avoid-cp-a (2014-04-11) 1 commit
  (merged to 'next' on 2014-04-14 at be661c4)
 + test: fix t7001 cp to use POSIX options

 Portability fix.
 Will merge to 'master'.


* jl/status-added-submodule-is-never-ignored (2014-04-07) 2 commits
 - commit -m: commit staged submodules regardless of ignore config
 - status/commit: show staged submodules regardless of ignore config

 There also are a few patches Ronald Weiss and Jens are working on
 polishing around this topic, and a patch from Jens each for gitk
 and git-gui.

 Waiting for the dust to settle until picking them up all.


* mh/multimail (2014-04-07) 1 commit
  (merged to 'next' on 2014-04-15 at eaba915)
 + git-multimail: update to version 1.0.0

 Will merge to 'master'.


* mh/lockfile (2014-04-15) 25 commits
 - trim_last_path_elm(): replace last_path_elm()
 - resolve_symlink(): take a strbuf parameter
 - resolve_symlink(): use a strbuf for internal scratch space
 - change lock_file::filename into a strbuf
 - commit_lock_file(): use a strbuf to manage temporary space
 - try_merge_strategy(): use a statically-allocated lock_file object
 - try_merge_strategy(): remove redundant lock_file allocation
 - struct lock_file: declare some fields volatile
 - lockfile: avoid transitory invalid states
 - commit_lock_file(): die() if called for unlocked lockfile object
 - commit_lock_file(): inline temporary variable
 - remove_lock_file(): call rollback_lock_file()
 - lock_file(): exit early if lockfile cannot be opened
 - write_packed_entry_fn(): convert cb_data into a (const int *)
 - prepare_index(): declare return value to be (const char *)
 - delete_ref_loose(): don't muck around in the lock_file's filename
 - cache.h: define constants LOCK_SUFFIX and LOCK_SUFFIX_LEN
 - lockfile.c: document the various states of lock_file objects
 - lock_file(): always add lock_file object to lock_file_list
 - hold_lock_file_for_append(): release lock on errors
 - lockfile: unlock file if lockfile permissions cannot be adjusted
 - rollback_lock_file(): set fd to -1
 - rollback_lock_file(): do not clear filename redundantly
 - api-lockfile: expand the documentation
 - unable_to_lock_die(): rename function from unable_to_lock_index_die()

 Refactor and fix corner-case bugs in the lockfile API, all looked
 sensible.

 Still being commented on.


* mt/patch-id-stable (2014-03-31) 3 commits
  (merged to 'next' on 2014-04-08 at 0188d44)
 + patch-id-test: test --stable and --unstable flags
 + patch-id: document new behaviour
 + patch-id: make it stable against hunk reordering

 Introduce a new way to compute patch-id for a patch that is not
 affected by the order of the paths that appear in the input.

 This changes the generated patch-id unless the users add an extra
 option to their command lines, but I deliberately queued the series
 to 'next' without reverting that compatibility breakage to see if
 people complain.  It could be that we do not have to worry about
 the default flipping at all.  We'll see.

 Will keep in 'next' for the remainder of the cycle.


* mh/ref-transaction (2014-04-07) 27 commits
 - ref_transaction_commit(): work with transaction->updates in place
 - struct ref_update: add a type field
 - struct ref_update: add a lock field
 - ref_transaction_commit(): simplify code using temporary variables
 - struct ref_update: store refname as a FLEX_ARRAY
 - struct ref_update: rename field "ref_name" to "refname"
 - refs: remove API function update_refs()
 - update-ref --stdin: reimplement using reference transactions
 - refs: add a concept of a reference transaction
 - update-ref --stdin: harmonize error messages
 - update-ref --stdin: improve the error message for unexpected EOF
 - t1400: test one mistake at a time
 - update-ref --stdin -z: deprecate interpreting the empty string as zeros
 - update-ref.c: extract a new function, parse_next_sha1()
 - t1400: test that stdin -z update treats empty <newvalue> as zeros
 - update-ref --stdin: simplify error messages for missing oldvalues
 - update-ref --stdin: make error messages more consistent
 - update-ref --stdin: improve error messages for invalid values
 - update-ref.c: extract a new function, parse_refname()
 - parse_cmd_verify(): copy old_sha1 instead of evaluating <oldvalue> twice
 - update-ref --stdin: read the whole input at once
 - update_refs(): fix constness
 - refs.h: rename the action_on_err constants
 - t1400: add some more tests involving quoted arguments
 - parse_arg(): really test that argument is properly terminated
 - t1400: provide more usual input to the command
 - t1400: fix name and expected result of one test
 (this branch is used by rs/ref-closer-to-atomic.)

 Update "update-ref --stdin [-z]" and then introduce a transactional
 support for (multi-)reference updates.

 Will merge to 'next' and keep it there for the remainder of the cycle.


* jc/apply-ignore-whitespace (2014-03-26) 1 commit
  (merged to 'next' on 2014-04-04 at 53779a7)
 + apply --ignore-space-change: lines with and without leading whitespaces do not match

 "--ignore-space-change" option of "git apply" ignored the
 spaces at the beginning of line too aggressively, which is
 inconsistent with the option of the same name "diff" and "git diff"
 have.

 Will keep in 'next' for the remainder of the cycle.


* as/grep-fullname-config (2014-03-20) 1 commit
  (merged to 'next' on 2014-03-28 at 810a076)
 + grep: add grep.fullName config variable

 Add a configuration variable to force --full-name to be default for
 "git grep".

 This may cause regressions on scripted users that do not expect
 this new behaviour.

 Will keep in 'next' for the remainder of the cycle.


* nd/multiple-work-trees (2014-03-25) 28 commits
 - count-objects: report unused files in $GIT_DIR/repos/...
 - gc: support prune --repos
 - gc: style change -- no SP before closing bracket
 - prune: strategies for linked checkouts
 - checkout: detach if the branch is already checked out elsewhere
 - checkout: clean up half-prepared directories in --to mode
 - checkout: support checking out into a new working directory
 - use new wrapper write_file() for simple file writing
 - wrapper.c: wrapper to open a file, fprintf then close
 - setup.c: support multi-checkout repo setup
 - setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()
 - setup.c: convert check_repository_format_gently to use strbuf
 - setup.c: detect $GIT_COMMON_DIR in is_git_directory()
 - setup.c: convert is_git_directory() to use strbuf
 - git-stash: avoid hardcoding $GIT_DIR/logs/....
 - *.sh: avoid hardcoding $GIT_DIR/hooks/...
 - git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objects
 - $GIT_COMMON_DIR: a new environment variable
 - commit: use SEQ_DIR instead of hardcoding "sequencer"
 - fast-import: use git_path() for accessing .git dir instead of get_git_dir()
 - reflog: avoid constructing .lock path with git_path
 - *.sh: respect $GIT_INDEX_FILE
 - git_path(): be aware of file relocation in $GIT_DIR
 - path.c: group git_path(), git_pathdup() and strbuf_git_path() together
 - path.c: rename vsnpath() to do_git_path()
 - git_snpath(): retire and replace with strbuf_git_path()
 - path.c: make get_pathname() call sites return const char *
 - path.c: make get_pathname() return strbuf instead of static buffer

 A replacement for contrib/workdir/git-new-workdir that does not
 rely on symbolic links and make sharing of objects and refs safer
 by making the borrowee and borrowers aware of each other.

 Will hold.


* ks/tree-diff-nway (2014-04-09) 20 commits
  (merged to 'next' on 2014-04-09 at c17228e)
 + mingw: activate alloca
  (merged to 'next' on 2014-04-08 at 6b74773)
 + combine-diff: speed it up, by using multiparent diff tree-walker directly
 + tree-diff: rework diff_tree() to generate diffs for multiparent cases as well
 + Portable alloca for Git
  (merged to 'next' on 2014-03-31 at 16a7bd4)
 + tree-diff: reuse base str(buf) memory on sub-tree recursion
 + tree-diff: no need to call "full" diff_tree_sha1 from show_path()
 + tree-diff: rework diff_tree interface to be sha1 based
 + tree-diff: diff_tree() should now be static
 + tree-diff: remove special-case diff-emitting code for empty-tree cases
  (merged to 'next' on 2014-03-25 at cfcbdac)
 + tree-diff: simplify tree_entry_pathcmp
 + tree-diff: show_path prototype is not needed anymore
 + tree-diff: rename compare_tree_entry -> tree_entry_pathcmp
 + tree-diff: move all action-taking code out of compare_tree_entry()
 + tree-diff: don't assume compare_tree_entry() returns -1,0,1
  (merged to 'next' on 2014-03-21 at d872679)
 + tree-diff: consolidate code for emitting diffs and recursion in one place
 + tree-diff: show_tree() is not needed
 + tree-diff: no need to pass match to skip_uninteresting()
 + tree-diff: no need to manually verify that there is no mode change for a path
 + combine-diff: move changed-paths scanning logic into its own function
 + combine-diff: move show_log_first logic/action out of paths scanning

 Instead of running N pair-wise diff-trees when inspecting a
 N-parent merge, find the set of paths that were touched by walking
 N+1 trees in parallel.  These set of paths can then be turned into
 N pair-wise diff-tree results to be processed through rename
 detections and such.  And N=2 case nicely degenerates to the usual
 2-way diff-tree, which is very nice.

 Will keep in 'next' for the remainder of the cycle.


* cc/interpret-trailers (2014-04-07) 12 commits
 - trailer: add blank line before the trailers if needed
 - Documentation: add documentation for 'git interpret-trailers'
 - trailer: add tests for commands in config file
 - trailer: execute command from 'trailer.<name>.command'
 - trailer: add tests for "git interpret-trailers"
 - trailer: add interpret-trailers command
 - trailer: put all the processing together and print
 - trailer: parse trailers from stdin
 - trailer: process command line trailer arguments
 - trailer: read and process config information
 - trailer: process trailers from stdin and arguments
 - trailer: add data structures and basic functions

 A new filter to programatically edit the tail end of the commit log
 messages.

 I was planning to merge it to 'next' and keep it there for the
 remainder of the cycle, but it appears that there still will be
 another round of reroll, at least for the documentation?

--------------------------------------------------
[Discarded]

* sz/mingw-index-pack-threaded (2014-03-19) 1 commit
 . Enable index-pack threading in msysgit.

 Queued a different attempt by Duy on nd/index-pack-one-fd-per-thread


* rs/ref-closer-to-atomic (2014-04-14) 3 commits
 . refs.c: change ref_transaction_commit to run the commit loops once all work is finished
 . refs.c: split delete_ref_loose() into a separate flag-for-deletion and commit phase
 . refs.c: split writing and commiting a ref into two separate functions
 (this branch uses mh/ref-transaction.)

 Builds on top of Michael's ref-transaction series to shrink the
 race window during multiple ref updates.

 Deferred to be rerolled ($gmane/246289).

^ permalink raw reply	[relevance 1%]

* Re: [PATCH] test: fix t7001 cp to use POSIX options
  2014-04-11 19:23  5%   ` Junio C Hamano
@ 2014-04-12 21:52  6%     ` Jens Lehmann
  0 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2014-04-12 21:52 UTC (permalink / raw)
  To: Junio C Hamano, Jeff King; +Cc: Kyle J. McKay, git

Am 11.04.2014 21:23, schrieb Junio C Hamano:
> Jeff King <peff@peff.net> writes:
> 
>> On Fri, Apr 11, 2014 at 01:24:02AM -0700, Kyle J. McKay wrote:
>>
>>> Since 11502468 and 04c1ee57 (both first appearing in v1.8.5), the
>>> t7001-mv test has used "cp -a" to perform a copy in several of the
>>> tests.
>>>
>>> However, the "-a" option is not required for a POSIX cp utility and
>>> some platforms' cp utilities do not support it.
>>>
>>> The POSIX equivalent of -a is -R -P -p.
>>>
>>> Change "cp -a" to "cp -R -P -p" so that the t7001-mv test works
>>> on systems with a cp utility that only implements the POSIX
>>> required set of options and not the "-a" option.
>>
>> I wonder if the "-R" is the part that we actually care about here.
>> Including the others does not hurt in that case, but using only "-R"
>> would perhaps make it more obvious to a later reader of the code exactly
>> what we are trying to do.
> 
> These calls to "cp" are about "We know that earlier 'update' created
> the GIT_DIR of the submodule in the top-level superproject, because
> we are running a modern Git.  But we want to make sure the command
> we are testing, "git mv", would work correctly if the repository
> were made with an older Git that created the GIT_DIR embedded in the
> working tree of the submodule, so let's emulate that case."  As we
> create files and directories in GIT_DIR with explicit permission
> bits, we may care about
> 
>  (1) making sure "git mv" can actually move the directory, with some
>      paths having mode bits different from the umasked default; and
> 
>  (2) checking that the GIT_DIR after "git mv" has the permission
>      bits right.

When writing these tests I didn't care about (2), but - in addition
to the first half of (1) - I had another thing in mind:

(3) "git mv" shouldn't try to update the 'core.worktree' setting
    when the GIT_DIR is embedded in the submodule's work tree.

> and if we cared, "-R -p" would be required here, not just "-R".
> 
> If core.prefersymlinkrefs is set, GIT_DIR would have a symbolic link
> HEAD pointing at the current branch, and "-P" may become relevant,
> but manually running "cp -R .git git && ls -l git/HEAD" in such an
> old repository tells me that symbolic link HEAD is not dereferenced
> without an explicit "-L", so I dunno.
> 
> Because we do not check anything inside GIT_DIR of the moved
> submodule after "git mv" is done, the more correct use of "cp" is
> moot for the purpose of (2), but it could be possible that "git mv"
> fails to move a submodule with GIT_DIR created embedded in its
> working tree by an older version of Git, while successfully copying
> an emulated one, due to differences such as modes and symlinks.
> 
> The current implementation just does rename(2) on the whole
> submodule working tree and let its contents move together, so I do
> not think it matters at the moment for the purpose of (1); use of
> flags other than "-R" are purely for future-proofing, I would think.

Thanks for your detailed analysis and sorry to all parties involved
for the hassle caused by my knee-jerk reaction to just use "cp -a"
when I wanted to have an exact copy of 'that' directory 'there'.

Given that all other tests just use "cp -R" too in that situation
I'm all for the second version of Kyle's patch, so an "Acked-by"
from me on that one.

^ permalink raw reply	[relevance 6%]

* What's cooking in git.git (Apr 2014, #03; Fri, 11)
@ 2014-04-11 22:22  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2014-04-11 22:22 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.

The number of topics cooking in 'next' has been shrinking, and the
cycle is getting long. Hopefully we will have -rc0 late next week to
close the 'master' branch and a few rounds of -rc iterations until
2.0 final. Other topics under discussion may continue to flow to
'next', as usual, during that time, to be pushed out early in the
next cycle.

You can find the changes described here in the integration branches
of the repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[New Topics]

* nd/index-pack-one-fd-per-thread (2014-04-09) 1 commit
 - index-pack: work around thread-unsafe pread()

 Enable threaded index-pack on platforms without thread-unsafe
 pread() emulation.

 Will merge to 'next' and keep it there for the remainder of the cycle.


* tb/unicode-6.3-zero-width (2014-04-09) 1 commit
 - utf8.c: partially update to version 6.3

 Teach our display-column-counting logic about decomposed umlauts
 and friends.

 Will merge to 'next'.


* fc/complete-aliased-push (2014-04-09) 1 commit
 - completion: fix completing args of aliased "push", "fetch", etc.

 Will merge to 'next'.


* fc/remote-helper-fixes (2014-04-09) 4 commits
 - remote-bzr: include authors field in pushed commits
 - remote-bzr: add support for older versions
 - remote-hg: always normalize paths
 - remote-helpers: allow all tests running from any dir

 Will merge to 'next'.


* fc/publish-vs-upstream (2014-04-11) 8 commits
 - sha1_name: add support for @{publish} marks
 - sha1_name: simplify track finding
 - sha1_name: cleanup interpret_branch_name()
 - branch: display publish branch
 - push: add --set-publish option
 - branch: add --set-publish-to option
 - Add concept of 'publish' branch
 - t5516 (fetch-push): fix test restoration

 Add branch@{publish}; this round v3 hasn't yet seen much reviews
 yet.

 Seems to have some interactions to break tests when merged to 'pu'.


* ym/fix-opportunistic-index-update-race (2014-04-10) 2 commits
 - read-cache.c: verify index file before we opportunistically update it
 - wrapper.c: add xpread() similar to xread()

 Duy raised a good point that we may need to do the same for the
 normal writeout codepath, not just the "opportunistic" update
 codepath.  While that is true, nobody sane would be running two
 simultaneous operations that are clearly write-oriented competing
 with each other against the same index file.  So in that sense that
 can be done as a less urgent follow-up for this topic.


* km/avoid-bs-in-shell-glob (2014-04-11) 1 commit
 - test: fix t5560 on FreeBSD

 Portability fix.
 Will merge to 'next' and to 'master'.


* km/avoid-cp-a (2014-04-11) 1 commit
 - test: fix t7001 cp to use POSIX options

 Portability fix.
 Will merge to 'next' and hopefully to 'master'.


* rs/ref-closer-to-atomic (2014-04-11) 3 commits
 - refs.c: change ref_transaction_commit to run the commit loops once all work is finished
 - refs.c: split delete_ref_loose() into a separate flag-for-deletion and commit phase
 - refs.c: split writing and commiting a ref into two separate functions
 (this branch uses mh/ref-transaction.)

 Builds on top of Michael's ref-transaction series to shrink the
 race window during multiple ref updates.

 Appears to break some tests even standalone, and somewhat conflicts
 with Michael's mh/lockfile topic when merging to 'pu'.

--------------------------------------------------
[Graduated to "master"]

* ib/rev-parse-parseopt-argh (2014-04-01) 1 commit
  (merged to 'next' on 2014-04-01 at 025578d)
 + rev-parse: fix typo in example on manpage

 Finishing touch to a new topic scheduled for 2.0


* jc/rev-parse-argh-dashed-multi-words (2014-03-24) 3 commits
  (merged to 'next' on 2014-03-31 at 1c48649)
 + parse-options: make sure argh string does not have SP or _
 + update-index: teach --cacheinfo a new syntax "mode,sha1,path"
 + parse-options: multi-word argh should use dash to separate words

 Make sure that the help text given to describe the "<param>" part
 of the "git cmd --option=<param>" does not contain SP or _,
 e.g. "--gpg-sign=<key-id>" option for "git commit" is not spelled
 as "--gpg-sign=<key id>".


* jk/commit-dates-parsing-fix (2014-04-01) 2 commits
  (merged to 'next' on 2014-04-04 at c16eeb0)
 + t4212: loosen far-in-future test for AIX
 + date: recognize bogus FreeBSD gmtime output

 Finishing touches for portability.


* jk/pack-bitmap (2014-04-04) 2 commits
  (merged to 'next' on 2014-04-04 at 0306834)
 + pack-objects: do not reuse packfiles without --delta-base-offset
 + add `ignore_missing_links` mode to revwalk

 Fixes the pack-bitmap already in 'master'.


* jl/nor-or-nand-and (2014-03-31) 4 commits
  (merged to 'next' on 2014-04-04 at b5d1ac5)
 + code and test: fix misuses of "nor"
 + comments: fix misuses of "nor"
 + contrib: fix misuses of "nor"
 + Documentation: fix misuses of "nor"

 Eradicate mistaken use of "nor" (that is, essentially "nor" used
 not in "neither A nor B" ;-)) from in-code comments, command output
 strings, and documentations.


* mh/update-ref-batch-create-fix (2014-04-02) 1 commit
  (merged to 'next' on 2014-04-04 at 97e3f12)
 + update-ref: fail create operation over stdin if ref already exists

 Requesting "update-ref --stdin" to create a ref that already exists
 should have errored out, but didn't.


* mr/msvc-link-with-invalidcontinue (2014-03-28) 1 commit
  (merged to 'next' on 2014-03-31 at 051a29e)
 + MSVC: link in invalidcontinue.obj for better POSIX compatibility


* mr/opt-set-ptr (2014-03-31) 3 commits
  (merged to 'next' on 2014-04-03 at a26385b)
 + parse-options: remove unused OPT_SET_PTR
 + parse-options: add cast to correct pointer type to OPT_SET_PTR
 + MSVC: fix t0040-parse-options crash

 OPT_SET_PTR() implementation was broken on IL32P64 platforms;
 it turns out that the macro is not used by any real user.

--------------------------------------------------
[Stalled]

* tr/merge-recursive-index-only (2014-02-05) 3 commits
 - merge-recursive: -Xindex-only to leave worktree unchanged
 - merge-recursive: internal flag to avoid touching the worktree
 - merge-recursive: remove dead conditional in update_stages()
 (this branch is used by tr/remerge-diff.)

 Will hold.


* tr/remerge-diff (2014-02-26) 5 commits
 . log --remerge-diff: show what the conflict resolution changed
 . name-hash: allow dir hashing even when !ignore_case
 . merge-recursive: allow storing conflict hunks in index
 . revision: fold all merge diff variants into an enum merge_diff_mode
 . combine-diff: do not pass revs->dense_combined_merges redundantly
 (this branch uses tr/merge-recursive-index-only.)

 "log -p" output learns a new way to let users inspect a merge
 commit by showing the differences between the automerged result
 with conflicts the person who recorded the merge would have seen
 and the final conflict resolution that was recorded in the merge.

 Needs to be rebased, now kb/fast-hashmap topic is in.


* bc/blame-crlf-test (2014-02-18) 1 commit
 - blame: add a failing test for a CRLF issue.

 I have a feeling that a fix for this should be fairly isolated and
 trivial (it should be just the matter of paying attention to the
 crlf settings when synthesizing the fake commit)---perhaps somebody
 can squash in a fix to this?


* jk/makefile (2014-02-05) 16 commits
 - FIXUP
 - move LESS/LV pager environment to Makefile
 - Makefile: teach scripts to include make variables
 - FIXUP
 - Makefile: auto-build C strings from make variables
 - Makefile: drop *_SQ variables
 - FIXUP
 - Makefile: add c-quote helper function
 - Makefile: introduce sq function for shell-quoting
 - Makefile: always create files via make-var
 - Makefile: store GIT-* sentinel files in MAKE/
 - Makefile: prefer printf to echo for GIT-*
 - Makefile: use tempfile/mv strategy for GIT-*
 - Makefile: introduce make-var helper function
 - Makefile: fix git-instaweb dependency on gitweb
 - Makefile: drop USE_GETTEXT_SCHEME from GIT-CFLAGS

 Simplify the Makefile rules and macros that exist primarily for
 quoting purposes, and make it easier to robustly express the
 dependency rules.

 Expecting a reroll.


* po/everyday-doc (2014-01-27) 1 commit
 - Make 'git help everyday' work

 This may make the said command to emit something, but the source is
 not meant to be formatted into a manual pages to begin with, and
 also its contents are a bit stale.  It may be a good first step in
 the right direction, but needs more work to at least get the
 mark-up right before public consumption.

 Will hold.


* jk/branch-at-publish-rebased (2014-01-17) 5 commits
 . t1507 (rev-parse-upstream): fix typo in test title
 . implement @{publish} shorthand
 . branch_get: provide per-branch pushremote pointers
 . branch_get: return early on error
 . sha1_name: refactor upstream_mark

 Give an easier access to the tracking branches from "other" side in
 a triangular workflow by introducing B@{publish} that works in a
 similar way to how B@{upstream} does.

 Meant to be used as a basis for whatever Ram wants to build on.

 Ejected from 'pu' to make room for fc/publish-vs-upstream topic.


* rb/merge-prepare-commit-msg-hook (2014-01-10) 4 commits
 - merge: drop unused arg from abort_commit method signature
 - merge: make prepare_to_commit responsible for write_merge_state
 - t7505: ensure cleanup after hook blocks merge
 - t7505: add missing &&

 Expose more merge states (e.g. $GIT_DIR/MERGE_MODE) to hooks that
 run during "git merge".  The log message stresses too much on one
 hook, prepare-commit-msg, but it would equally apply to other hooks
 like post-merge, I think.

 Waiting for a reroll.


* jl/submodule-recursive-checkout (2013-12-26) 5 commits
 - Teach checkout to recursively checkout submodules
 - submodule: teach unpack_trees() to update submodules
 - submodule: teach unpack_trees() to repopulate submodules
 - submodule: teach unpack_trees() to remove submodule contents
 - submodule: prepare for recursive checkout of submodules

 Expecting a reroll.


* jc/graph-post-root-gap (2013-12-30) 3 commits
 - WIP: document what we want at the end
 - graph: remove unused code a bit
 - graph: stuff the current commit into graph->columns[]

 This was primarily a RFH ($gmane/239580).


* np/pack-v4 (2013-09-18) 90 commits
 . packv4-parse.c: add tree offset caching
 . t1050: replace one instance of show-index with verify-pack
 . index-pack, pack-objects: allow creating .idx v2 with .pack v4
 . unpack-objects: decode v4 trees
 . unpack-objects: allow to save processed bytes to a buffer
 - ...

 Nico and Duy advancing the eternal vaporware pack-v4.  This is here
 primarily for wider distribution of the preview edition.

 Needs to be rebased, now the pack-bitmap series is in.


* tg/perf-lib-test-perf-cleanup (2013-09-19) 2 commits
 - perf-lib: add test_perf_cleanup target
 - perf-lib: split starting the test from the execution

 Add test_perf_cleanup shell function to the perf suite, that allows
 the script writers to define a test with a clean-up action.

 Will hold.


* jc/format-patch (2013-04-22) 2 commits
 - format-patch: --inline-single
 - format-patch: rename "no_inline" field

 A new option to send a single patch to the standard output to be
 appended at the bottom of a message.  I personally have no need for
 this, but it was easy enough to cobble together.  Tests, docs and
 stripping out more MIMEy stuff are left as exercises to interested
 parties.


* jc/show-branch (2014-03-24) 5 commits
 - show-branch: use commit slab to represent bitflags of arbitrary width
 - show-branch.c: remove "all_mask"
 - show-branch.c: abstract out "flags" operation
 - show-branch.c: lift all_mask/all_revs to a global static
 - show-branch.c: update comment style

 Waiting for the final step to lift the hard-limit before sending it out.

--------------------------------------------------
[Cooking]

* jl/status-added-submodule-is-never-ignored (2014-04-07) 2 commits
 - commit -m: commit staged submodules regardless of ignore config
 - status/commit: show staged submodules regardless of ignore config


* mh/multimail (2014-04-07) 1 commit
 - git-multimail: update to version 1.0.0


* mh/lockfile (2014-04-07) 25 commits
 - trim_last_path_elm(): replace last_path_elm()
 - resolve_symlink(): take a strbuf parameter
 - resolve_symlink(): use a strbuf for internal scratch space
 - Change lock_file::filename into a strbuf
 - commit_lock_file(): use a strbuf to manage temporary space
 - try_merge_strategy(): use a statically-allocated lock_file object
 - try_merge_strategy(): remove redundant lock_file allocation
 - lockfile: avoid transitory invalid states
 - commit_lock_file(): make committing an unlocked lockfile a NOP
 - commit_lock_file(): inline temporary variable
 - remove_lock_file(): call rollback_lock_file()
 - lock_file(): exit early if lockfile cannot be opened
 - write_packed_entry_fn(): convert cb_data into a (const int *)
 - prepare_index(): declare return value to be (const char *)
 - delete_ref_loose(): don't muck around in the lock_file's filename
 - lockfile: define a constant LOCK_SUFFIX_LEN
 - lockfile.c: document the various states of lock_file objects
 - struct lock_file: replace on_list field with flags field
 - lock_file(): always add lock_file object to lock_file_list
 - hold_lock_file_for_append(): release lock on errors
 - lockfile: unlock file if lockfile permissions cannot be adjusted
 - rollback_lock_file(): set fd to -1
 - rollback_lock_file(): do not clear filename redundantly
 - unable_to_lock_die(): rename function from unable_to_lock_index_die()
 - api-lockfile: expand the documentation

 Refactor and fix corner-case bugs in the lockfile API.


* mt/patch-id-stable (2014-03-31) 3 commits
  (merged to 'next' on 2014-04-08 at 0188d44)
 + patch-id-test: test --stable and --unstable flags
 + patch-id: document new behaviour
 + patch-id: make it stable against hunk reordering

 Introduce a new way to compute patch-id for a patch that is not
 affected by the order of the paths that appear in the input.

 This changes the generated patch-id unless the users add an extra
 option to their command lines, but I deliberately queued the series
 to 'next' without reverting that compatibility breakage to see if
 people complain.  It could be that we do not have to worry about
 the default flipping at all.  We'll see.

 Will keep in 'next' for the remainder of this cycle.


* mh/ref-transaction (2014-04-07) 27 commits
 - ref_transaction_commit(): work with transaction->updates in place
 - struct ref_update: add a type field
 - struct ref_update: add a lock field
 - ref_transaction_commit(): simplify code using temporary variables
 - struct ref_update: store refname as a FLEX_ARRAY
 - struct ref_update: rename field "ref_name" to "refname"
 - refs: remove API function update_refs()
 - update-ref --stdin: reimplement using reference transactions
 - refs: add a concept of a reference transaction
 - update-ref --stdin: harmonize error messages
 - update-ref --stdin: improve the error message for unexpected EOF
 - t1400: test one mistake at a time
 - update-ref --stdin -z: deprecate interpreting the empty string as zeros
 - update-ref.c: extract a new function, parse_next_sha1()
 - t1400: test that stdin -z update treats empty <newvalue> as zeros
 - update-ref --stdin: simplify error messages for missing oldvalues
 - update-ref --stdin: make error messages more consistent
 - update-ref --stdin: improve error messages for invalid values
 - update-ref.c: extract a new function, parse_refname()
 - parse_cmd_verify(): copy old_sha1 instead of evaluating <oldvalue> twice
 - update-ref --stdin: read the whole input at once
 - update_refs(): fix constness
 - refs.h: rename the action_on_err constants
 - t1400: add some more tests involving quoted arguments
 - parse_arg(): really test that argument is properly terminated
 - t1400: provide more usual input to the command
 - t1400: fix name and expected result of one test
 (this branch is used by rs/ref-closer-to-atomic.)

 Update "update-ref --stdin [-z]" and then introduce a transactional
 support for (multi-)reference updates.

 Is this ready to be merged to 'next' for wider exposure?


* jc/apply-ignore-whitespace (2014-03-26) 1 commit
  (merged to 'next' on 2014-04-04 at 53779a7)
 + apply --ignore-space-change: lines with and without leading whitespaces do not match

 "--ignore-space-change" option of "git apply" ignored the
 spaces at the beginning of line too aggressively, which is
 inconsistent with the option of the same name "diff" and "git diff"
 have.

 Will keep in 'next' for the remainder of this cycle.


* as/grep-fullname-config (2014-03-20) 1 commit
  (merged to 'next' on 2014-03-28 at 810a076)
 + grep: add grep.fullName config variable

 Add a configuration variable to force --full-name to be default for
 "git grep".

 This may cause regressions on scripted users that do not expect
 this new behaviour.

 Will keep in 'next' for the remainder of this cycle.


* nd/multiple-work-trees (2014-03-25) 28 commits
 - count-objects: report unused files in $GIT_DIR/repos/...
 - gc: support prune --repos
 - gc: style change -- no SP before closing bracket
 - prune: strategies for linked checkouts
 - checkout: detach if the branch is already checked out elsewhere
 - checkout: clean up half-prepared directories in --to mode
 - checkout: support checking out into a new working directory
 - use new wrapper write_file() for simple file writing
 - wrapper.c: wrapper to open a file, fprintf then close
 - setup.c: support multi-checkout repo setup
 - setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()
 - setup.c: convert check_repository_format_gently to use strbuf
 - setup.c: detect $GIT_COMMON_DIR in is_git_directory()
 - setup.c: convert is_git_directory() to use strbuf
 - git-stash: avoid hardcoding $GIT_DIR/logs/....
 - *.sh: avoid hardcoding $GIT_DIR/hooks/...
 - git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objects
 - $GIT_COMMON_DIR: a new environment variable
 - commit: use SEQ_DIR instead of hardcoding "sequencer"
 - fast-import: use git_path() for accessing .git dir instead of get_git_dir()
 - reflog: avoid constructing .lock path with git_path
 - *.sh: respect $GIT_INDEX_FILE
 - git_path(): be aware of file relocation in $GIT_DIR
 - path.c: group git_path(), git_pathdup() and strbuf_git_path() together
 - path.c: rename vsnpath() to do_git_path()
 - git_snpath(): retire and replace with strbuf_git_path()
 - path.c: make get_pathname() call sites return const char *
 - path.c: make get_pathname() return strbuf instead of static buffer

 A replacement for contrib/workdir/git-new-workdir that does not
 rely on symbolic links and make sharing of objects and refs safer
 by making the borrowee and borrowers aware of each other.

 Will hold.


* ks/tree-diff-nway (2014-04-09) 20 commits
  (merged to 'next' on 2014-04-09 at c17228e)
 + mingw: activate alloca
  (merged to 'next' on 2014-04-08 at 6b74773)
 + combine-diff: speed it up, by using multiparent diff tree-walker directly
 + tree-diff: rework diff_tree() to generate diffs for multiparent cases as well
 + Portable alloca for Git
  (merged to 'next' on 2014-03-31 at 16a7bd4)
 + tree-diff: reuse base str(buf) memory on sub-tree recursion
 + tree-diff: no need to call "full" diff_tree_sha1 from show_path()
 + tree-diff: rework diff_tree interface to be sha1 based
 + tree-diff: diff_tree() should now be static
 + tree-diff: remove special-case diff-emitting code for empty-tree cases
  (merged to 'next' on 2014-03-25 at cfcbdac)
 + tree-diff: simplify tree_entry_pathcmp
 + tree-diff: show_path prototype is not needed anymore
 + tree-diff: rename compare_tree_entry -> tree_entry_pathcmp
 + tree-diff: move all action-taking code out of compare_tree_entry()
 + tree-diff: don't assume compare_tree_entry() returns -1,0,1
  (merged to 'next' on 2014-03-21 at d872679)
 + tree-diff: consolidate code for emitting diffs and recursion in one place
 + tree-diff: show_tree() is not needed
 + tree-diff: no need to pass match to skip_uninteresting()
 + tree-diff: no need to manually verify that there is no mode change for a path
 + combine-diff: move changed-paths scanning logic into its own function
 + combine-diff: move show_log_first logic/action out of paths scanning

 Instead of running N pair-wise diff-trees when inspecting a
 N-parent merge, find the set of paths that were touched by walking
 N+1 trees in parallel.  These set of paths can then be turned into
 N pair-wise diff-tree results to be processed through rename
 detections and such.  And N=2 case nicely degenerates to the usual
 2-way diff-tree, which is very nice.

 Will keep in 'next' for the remainder of this cycle.


* cc/interpret-trailers (2014-04-07) 12 commits
 - trailer: add blank line before the trailers if needed
 - Documentation: add documentation for 'git interpret-trailers'
 - trailer: add tests for commands in config file
 - trailer: execute command from 'trailer.<name>.command'
 - trailer: add tests for "git interpret-trailers"
 - trailer: add interpret-trailers command
 - trailer: put all the processing together and print
 - trailer: parse trailers from stdin
 - trailer: process command line trailer arguments
 - trailer: read and process config information
 - trailer: process trailers from stdin and arguments
 - trailer: add data structures and basic functions

 A new filter to programatically edit the tail end of the commit log
 messages.

 I was planning to merge it to 'next' and keep it there for the
 remainder of this cycle, but it appears that there still will be
 another round of reroll, at least for the documentation?

--------------------------------------------------
[Discarded]

* sz/mingw-index-pack-threaded (2014-03-19) 1 commit
 . Enable index-pack threading in msysgit.

 Queued a different attempt by Duy on nd/index-pack-one-fd-per-thread

^ permalink raw reply	[relevance 1%]

* Re: [PATCH] test: fix t7001 cp to use POSIX options
  2014-04-11 11:43  6% ` Jeff King
  2014-04-11 13:44 18%   ` Kyle J. McKay
@ 2014-04-11 19:23  5%   ` Junio C Hamano
  2014-04-12 21:52  6%     ` Jens Lehmann
  1 sibling, 1 reply; 200+ results
From: Junio C Hamano @ 2014-04-11 19:23 UTC (permalink / raw)
  To: Jeff King; +Cc: Kyle J. McKay, git, Jens Lehmann

Jeff King <peff@peff.net> writes:

> On Fri, Apr 11, 2014 at 01:24:02AM -0700, Kyle J. McKay wrote:
>
>> Since 11502468 and 04c1ee57 (both first appearing in v1.8.5), the
>> t7001-mv test has used "cp -a" to perform a copy in several of the
>> tests.
>> 
>> However, the "-a" option is not required for a POSIX cp utility and
>> some platforms' cp utilities do not support it.
>> 
>> The POSIX equivalent of -a is -R -P -p.
>> 
>> Change "cp -a" to "cp -R -P -p" so that the t7001-mv test works
>> on systems with a cp utility that only implements the POSIX
>> required set of options and not the "-a" option.
>
> I wonder if the "-R" is the part that we actually care about here.
> Including the others does not hurt in that case, but using only "-R"
> would perhaps make it more obvious to a later reader of the code exactly
> what we are trying to do.

These calls to "cp" are about "We know that earlier 'update' created
the GIT_DIR of the submodule in the top-level superproject, because
we are running a modern Git.  But we want to make sure the command
we are testing, "git mv", would work correctly if the repository
were made with an older Git that created the GIT_DIR embedded in the
working tree of the submodule, so let's emulate that case."  As we
create files and directories in GIT_DIR with explicit permission
bits, we may care about

 (1) making sure "git mv" can actually move the directory, with some
     paths having mode bits different from the umasked default; and

 (2) checking that the GIT_DIR after "git mv" has the permission
     bits right.

and if we cared, "-R -p" would be required here, not just "-R".

If core.prefersymlinkrefs is set, GIT_DIR would have a symbolic link
HEAD pointing at the current branch, and "-P" may become relevant,
but manually running "cp -R .git git && ls -l git/HEAD" in such an
old repository tells me that symbolic link HEAD is not dereferenced
without an explicit "-L", so I dunno.

Because we do not check anything inside GIT_DIR of the moved
submodule after "git mv" is done, the more correct use of "cp" is
moot for the purpose of (2), but it could be possible that "git mv"
fails to move a submodule with GIT_DIR created embedded in its
working tree by an older version of Git, while successfully copying
an emulated one, due to differences such as modes and symlinks.

The current implementation just does rename(2) on the whole
submodule working tree and let its contents move together, so I do
not think it matters at the moment for the purpose of (1); use of
flags other than "-R" are purely for future-proofing, I would think.

^ permalink raw reply	[relevance 5%]

* Re: [PATCH] test: fix t7001 cp to use POSIX options
  2014-04-11 11:43  6% ` Jeff King
@ 2014-04-11 13:44 18%   ` Kyle J. McKay
  2014-04-11 19:23  5%   ` Junio C Hamano
  1 sibling, 0 replies; 200+ results
From: Kyle J. McKay @ 2014-04-11 13:44 UTC (permalink / raw)
  To: Jeff King; +Cc: git, Junio C Hamano, Jens Lehmann

On Apr 11, 2014, at 04:43, Jeff King wrote:
> On Fri, Apr 11, 2014 at 01:24:02AM -0700, Kyle J. McKay wrote:
>
>> Since 11502468 and 04c1ee57 (both first appearing in v1.8.5), the
>> t7001-mv test has used "cp -a" to perform a copy in several of the
>> tests.
>>
>> However, the "-a" option is not required for a POSIX cp utility and
>> some platforms' cp utilities do not support it.
>>
>> The POSIX equivalent of -a is -R -P -p.
>>
>> Change "cp -a" to "cp -R -P -p" so that the t7001-mv test works
>> on systems with a cp utility that only implements the POSIX
>> required set of options and not the "-a" option.
>
> I wonder if the "-R" is the part that we actually care about here.
> Including the others does not hurt in that case, but using only "-R"
> would perhaps make it more obvious to a later reader of the code  
> exactly
> what we are trying to do.

I was wondering the same thing myself, but Jens is on the Cc: list and  
added both of those, so I'm hoping he'll pipe in here about that.  I  
did notice that the other test scripts seem to only use -R, so that  
would definitely be a more consistent change to match the rest of the  
tests.

In any case v2 of the patch with just -R is attached below.  It seems
to pass the tests so it's probably fine.

--Kyle

---- 8< ----

Subject: [PATCH v2] test: fix t7001 cp to use POSIX options

Since 11502468 and 04c1ee57 (both first appearing in v1.8.5), the
t7001-mv test has used "cp -a" to perform a copy in several of the
tests.

However, the "-a" option is not required for a POSIX cp utility and
some platforms' cp utilities do not support it.

The POSIX equivalent of -a is -R -P -p, but the only option we
actually care about for the test is -R.

Change "cp -a" to "cp -R" so that the t7001-mv test works
on systems with a cp utility that only implements the POSIX
required set of options and not the "-a" option.

Signed-off-by: Kyle J. McKay <mackyle@gmail.com>

---
 t/t7001-mv.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 215d43d6..675ca5bd 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -308,7 +308,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm
 	(
 		cd sub &&
 		rm -f .git &&
-		cp -a ../.git/modules/sub .git &&
+		cp -R ../.git/modules/sub .git &&
 		GIT_WORK_TREE=. git config --unset core.worktree
 	) &&
 	mkdir mod &&
@@ -331,7 +331,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu
 	(
 		cd sub &&
 		rm -f .git &&
-		cp -a ../.git/modules/sub .git &&
+		cp -R ../.git/modules/sub .git &&
 		GIT_WORK_TREE=. git config --unset core.worktree
 	) &&
 	mkdir mod &&
-- 
tg: (0bc85abb..) t/t7001-posix-cp (depends on: maint)

^ permalink raw reply related	[relevance 18%]

* Re: [PATCH] test: fix t7001 cp to use POSIX options
  2014-04-11  8:24 19% [PATCH] test: fix t7001 cp to use POSIX options Kyle J. McKay
@ 2014-04-11 11:43  6% ` Jeff King
  2014-04-11 13:44 18%   ` Kyle J. McKay
  2014-04-11 19:23  5%   ` Junio C Hamano
  0 siblings, 2 replies; 200+ results
From: Jeff King @ 2014-04-11 11:43 UTC (permalink / raw)
  To: Kyle J. McKay; +Cc: git, Junio C Hamano, Jens Lehmann

On Fri, Apr 11, 2014 at 01:24:02AM -0700, Kyle J. McKay wrote:

> Since 11502468 and 04c1ee57 (both first appearing in v1.8.5), the
> t7001-mv test has used "cp -a" to perform a copy in several of the
> tests.
> 
> However, the "-a" option is not required for a POSIX cp utility and
> some platforms' cp utilities do not support it.
> 
> The POSIX equivalent of -a is -R -P -p.
> 
> Change "cp -a" to "cp -R -P -p" so that the t7001-mv test works
> on systems with a cp utility that only implements the POSIX
> required set of options and not the "-a" option.

I wonder if the "-R" is the part that we actually care about here.
Including the others does not hurt in that case, but using only "-R"
would perhaps make it more obvious to a later reader of the code exactly
what we are trying to do.

-Peff

^ permalink raw reply	[relevance 6%]

* [PATCH] test: fix t7001 cp to use POSIX options
@ 2014-04-11  8:24 19% Kyle J. McKay
  2014-04-11 11:43  6% ` Jeff King
  0 siblings, 1 reply; 200+ results
From: Kyle J. McKay @ 2014-04-11  8:24 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Jens Lehmann

Since 11502468 and 04c1ee57 (both first appearing in v1.8.5), the
t7001-mv test has used "cp -a" to perform a copy in several of the
tests.

However, the "-a" option is not required for a POSIX cp utility and
some platforms' cp utilities do not support it.

The POSIX equivalent of -a is -R -P -p.

Change "cp -a" to "cp -R -P -p" so that the t7001-mv test works
on systems with a cp utility that only implements the POSIX
required set of options and not the "-a" option.

Signed-off-by: Kyle J. McKay <mackyle@gmail.com>

---
 t/t7001-mv.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 215d43d6..c8ff9115 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -308,7 +308,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm
 	(
 		cd sub &&
 		rm -f .git &&
-		cp -a ../.git/modules/sub .git &&
+		cp -R -P -p ../.git/modules/sub .git &&
 		GIT_WORK_TREE=. git config --unset core.worktree
 	) &&
 	mkdir mod &&
@@ -331,7 +331,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu
 	(
 		cd sub &&
 		rm -f .git &&
-		cp -a ../.git/modules/sub .git &&
+		cp -R -P -p ../.git/modules/sub .git &&
 		GIT_WORK_TREE=. git config --unset core.worktree
 	) &&
 	mkdir mod &&
-- 
tg: (0bc85abb..) t/t7001-posix-cp (depends on: maint)

^ permalink raw reply related	[relevance 19%]

* Patch Series v3 for "use the $( ... ) construct for command substitution"
@ 2014-04-04 16:52  2% Elia Pinto
  0 siblings, 0 replies; 200+ results
From: Elia Pinto @ 2014-04-04 16:52 UTC (permalink / raw)
  To: git@vger.kernel.org; +Cc: Matthieu Moy, Eric Sunshine

This patch series contain the

 use the $( ... ) construct for command substitution

patches not already merged in ep/shell-command-substitution
in the mantainer repository. It is the version 3 of the
patch series.

I changed the commit message in accordance with those approved,
and I have rebased the patches to the master branch, adjusting where
necessary any conflicts. The patches can be applied also to pu and next.

I hope this is a better way to send the (a long) patch series to git.

Best Regards

------

The following changes since commit 82edd396632501b3dd1901d0f3ae5aa72759b5fb:

  Update draft release notes to 2.0 (2014-04-03 13:40:59 -0700)

are available in the git repository at:

  git@github.com:devzero2000/git-core.git ep/shell-command-substitution-v3

for you to fetch changes up to a4f27b5de27b9848c0720ac2c74a3b82c2531122:

  t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for
command substitution (2014-04-04 08:03:33 -0700)

----------------------------------------------------------------
Elia Pinto (140):
      howto-index.sh: use the $( ... ) construct for command substitution
      install-webdoc.sh: use the $( ... ) construct for command substitution
      git-checkout.sh: use the $( ... ) construct for command substitution
      git-clone.sh: use the $( ... ) construct for command substitution
      git-commit.sh: use the $( ... ) construct for command substitution
      git-fetch.sh: use the $( ... ) construct for command substitution
      git-ls-remote.sh: use the $( ... ) construct for command substitution
      git-merge.sh: use the $( ... ) construct for command substitution
      git-repack.sh: use the $( ... ) construct for command substitution
      git-resolve.sh: use the $( ... ) construct for command substitution
      git-revert.sh: use the $( ... ) construct for command substitution
      git-tag.sh: use the $( ... ) construct for command substitution
      t9360-mw-to-git-clone.sh: use the $( ... ) construct for command
substitution
      t9362-mw-to-git-utf8.sh: use the $( ... ) construct for command
substitution
      t9365-continuing-queries.sh: use the $( ... ) construct for
command substitution
      test-gitmw-lib.sh: use the $( ... ) construct for command substitution
      t7900-subtree.sh: use the $( ... ) construct for command substitution
      appp.sh: use the $( ... ) construct for command substitution
      txt-to-pot.sh: use the $( ... ) construct for command substitution
      git-pull.sh: use the $( ... ) construct for command substitution
      git-rebase--merge.sh: use the $( ... ) construct for command substitution
      git-rebase.sh: use the $( ... ) construct for command substitution
      git-stash.sh: use the $( ... ) construct for command substitution
      git-web--browse.sh: use the $( ... ) construct for command substitution
      lib-credential.sh: use the $( ... ) construct for command substitution
      lib-cvs.sh: use the $( ... ) construct for command substitution
      lib-gpg.sh: use the $( ... ) construct for command substitution
      p5302-pack-index.sh: use the $( ... ) construct for command substitution
      t0001-init.sh: use the $( ... ) construct for command substitution
      t0010-racy-git.sh: use the $( ... ) construct for command substitution
      t0020-crlf.sh: use the $( ... ) construct for command substitution
      t0025-crlf-auto.sh: use the $( ... ) construct for command substitution
      t0026-eol-config.sh: use the $( ... ) construct for command substitution
      t0030-stripspace.sh: use the $( ... ) construct for command substitution
      t0300-credentials.sh: use the $( ... ) construct for command substitution
      t1000-read-tree-m-3way.sh: use the $( ... ) construct for
command substitution
      t1001-read-tree-m-2way.sh: use the $( ... ) construct for
command substitution
      t1002-read-tree-m-u-2way.sh: use the $( ... ) construct for
command substitution
      t1003-read-tree-prefix.sh: use the $( ... ) construct for
command substitution
      t1004-read-tree-m-u-wf.sh: use the $( ... ) construct for
command substitution
      t1020-subdirectory.sh: use the $( ... ) construct for command substitution
      t1050-large.sh: use the $( ... ) construct for command substitution
      t1100-commit-tree-options.sh: use the $( ... ) construct for
command substitution
      t1401-symbolic-ref.sh: use the $( ... ) construct for command substitution
      t1410-reflog.sh: use the $( ... ) construct for command substitution
      t1511-rev-parse-caret.sh: use the $( ... ) construct for command
substitution
      t1512-rev-parse-disambiguation.sh: use the $( ... ) construct
for command substitution
      t2102-update-index-symlinks.sh: use the $( ... ) construct for
command substitution
      t3030-merge-recursive.sh: use the $( ... ) construct for command
substitution
      t3100-ls-tree-restrict.sh: use the $( ... ) construct for
command substitution
      t3101-ls-tree-dirname.sh: use the $( ... ) construct for command
substitution
      t3210-pack-refs.sh: use the $( ... ) construct for command substitution
      t3403-rebase-skip.sh: use the $( ... ) construct for command substitution
      t3511-cherry-pick-x.sh: use the $( ... ) construct for command
substitution
      t3600-rm.sh: use the $( ... ) construct for command substitution
      t3700-add.sh: use the $( ... ) construct for command substitution
      t3905-stash-include-untracked.sh: use the $( ... ) construct for
command substitution
      t3910-mac-os-precompose.sh: use the $( ... ) construct for
command substitution
      t4006-diff-mode.sh: use the $( ... ) construct for command substitution
      t4010-diff-pathspec.sh: use the $( ... ) construct for command
substitution
      t4012-diff-binary.sh: use the $( ... ) construct for command substitution
      t4013-diff-various.sh: use the $( ... ) construct for command substitution
      t4014-format-patch.sh: use the $( ... ) construct for command substitution
      t4036-format-patch-signer-mime.sh: use the $( ... ) construct
for command substitution
      t4038-diff-combined.sh: use the $( ... ) construct for command
substitution
      t4057-diff-combined-paths.sh: use the $( ... ) construct for
command substitution
      t4116-apply-reverse.sh: use the $( ... ) construct for command
substitution
      t4119-apply-config.sh: use the $( ... ) construct for command substitution
      t4204-patch-id.sh: use the $( ... ) construct for command substitution
      t5000-tar-tree.sh: use the $( ... ) construct for command substitution
      t5003-archive-zip.sh: use the $( ... ) construct for command substitution
      t5100-mailinfo.sh: use the $( ... ) construct for command substitution
      t5300-pack-object.sh: use the $( ... ) construct for command substitution
      t5301-sliding-window.sh: use the $( ... ) construct for command
substitution
      t5302-pack-index.sh: use the $( ... ) construct for command substitution
      t5303-pack-corruption-resilience.sh: use the $( ... ) construct
for command substitution
      t5304-prune.sh: use the $( ... ) construct for command substitution
      t5305-include-tag.sh: use the $( ... ) construct for command substitution
      t5500-fetch-pack.sh: use the $( ... ) construct for command substitution
      t5505-remote.sh: use the $( ... ) construct for command substitution
      t5506-remote-groups.sh: use the $( ... ) construct for command
substitution
      t5510-fetch.sh: use the $( ... ) construct for command substitution
      t5515-fetch-merge-logic.sh: use the $( ... ) construct for
command substitution
      t5516-fetch-push.sh: use the $( ... ) construct for command substitution
      t5517-push-mirror.sh: use the $( ... ) construct for command substitution
      t5520-pull.sh: use the $( ... ) construct for command substitution
      t5522-pull-symlink.sh: use the $( ... ) construct for command substitution
      t5530-upload-pack-error.sh: use the $( ... ) construct for
command substitution
      t5537-fetch-shallow.sh: use the $( ... ) construct for command
substitution
      t5538-push-shallow.sh: use the $( ... ) construct for command substitution
      t5550-http-fetch-dumb.sh: use the $( ... ) construct for command
substitution
      t5551-http-fetch-smart.sh: use the $( ... ) construct for
command substitution
      t5570-git-daemon.sh: use the $( ... ) construct for command substitution
      t5601-clone.sh: use the $( ... ) construct for command substitution
      t5700-clone-reference.sh: use the $( ... ) construct for command
substitution
      t5710-info-alternate.sh: use the $( ... ) construct for command
substitution
      t5900-repo-selection.sh: use the $( ... ) construct for command
substitution
      t6001-rev-list-graft.sh: use the $( ... ) construct for command
substitution
      t6002-rev-list-bisect.sh: use the $( ... ) construct for command
substitution
      t6015-rev-list-show-all-parents.sh: use the $( ... ) construct
for command substitution
      t6032-merge-large-rename.sh: use the $( ... ) construct for
command substitution
      t6034-merge-rename-nocruft.sh: use the $( ... ) construct for
command substitution
      t6132-pathspec-exclude.sh: use the $( ... ) construct for
command substitution
      t7001-mv.sh: use the $( ... ) construct for command substitution
      t7003-filter-branch.sh: use the $( ... ) construct for command
substitution
      t7004-tag.sh: use the $( ... ) construct for command substitution
      t7006-pager.sh: use the $( ... ) construct for command substitution
      t7103-reset-bare.sh: use the $( ... ) construct for command substitution
      t7406-submodule-update.sh: use the $( ... ) construct for
command substitution
      t7408-submodule-reference.sh: use the $( ... ) construct for
command substitution
      t7504-commit-msg-hook.sh: use the $( ... ) construct for command
substitution
      t7602-merge-octopus-many.sh: use the $( ... ) construct for
command substitution
      t7700-repack.sh: use the $( ... ) construct for command substitution
      t8003-blame-corner-cases.sh: use the $( ... ) construct for
command substitution
      t9001-send-email.sh: use the $( ... ) construct for command substitution
      t9100-git-svn-basic.sh: use the $( ... ) construct for command
substitution
      t9101-git-svn-props.sh: use the $( ... ) construct for command
substitution
      t9104-git-svn-follow-parent.sh: use the $( ... ) construct for
command substitution
      t9105-git-svn-commit-diff.sh: use the $( ... ) construct for
command substitution
      t9107-git-svn-migrate.sh: use the $( ... ) construct for command
substitution
      t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
      t9109-git-svn-multi-glob.sh: use the $( ... ) construct for
command substitution
      t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for
command substitution
      t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for
command substitution
      t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct
for command substitution
      t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
      t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct
for command substitution
      t9130-git-svn-authors-file.sh: use the $( ... ) construct for
command substitution
      t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for
command substitution
      t9137-git-svn-dcommit-clobber-series.sh: use the $( ... )
construct for command substitution
      t9138-git-svn-authors-prog.sh: use the $( ... ) construct for
command substitution
      t9145-git-svn-master-branch.sh: use the $( ... ) construct for
command substitution
      t9150-svk-mergetickets.sh: use the $( ... ) construct for
command substitution
      t9300-fast-import.sh: use the $( ... ) construct for command substitution
      t9350-fast-export.sh: use the $( ... ) construct for command substitution
      t9501-gitweb-standalone-http-status.sh: use the $( ... )
construct for command substitution
      t9901-git-web--browse.sh: use the $( ... ) construct for command
substitution
      test-lib-functions.sh: use the $( ... ) construct for command substitution
      unimplemented.sh: use the $( ... ) construct for command substitution
      t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for
command substitution

 Documentation/howto-index.sh                    |   12 ++--
 Documentation/install-webdoc.sh                 |    6 +-
 contrib/examples/git-checkout.sh                |    8 +--
 contrib/examples/git-clone.sh                   |   20 +++----
 contrib/examples/git-commit.sh                  |   10 ++--
 contrib/examples/git-fetch.sh                   |    6 +-
 contrib/examples/git-ls-remote.sh               |    4 +-
 contrib/examples/git-merge.sh                   |    4 +-
contrib/examples/git-repack.sh                  |    2 +-
 contrib/examples/git-resolve.sh                 |    2 +-
 contrib/examples/git-revert.sh                  |    2 +-
 contrib/examples/git-tag.sh                     |    2 +-
 contrib/mw-to-git/t/t9360-mw-to-git-clone.sh    |   14 ++---
 contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh     |    4 +-
 contrib/mw-to-git/t/t9365-continuing-queries.sh |    2 +-
 contrib/mw-to-git/t/test-gitmw-lib.sh           |    6 +-
 contrib/subtree/t/t7900-subtree.sh              |    2 +-
 contrib/thunderbird-patch-inline/appp.sh        |   14 ++---
 git-gui/po/glossary/txt-to-pot.sh               |    4 +-
 git-pull.sh                                     |    2 +-
 git-rebase--merge.sh                            |    4 +-
 git-rebase.sh                                   |    8 +--
 git-stash.sh                                    |    2 +-
 git-web--browse.sh                              |    6 +-
 t/lib-credential.sh                             |    2 +-
 t/lib-cvs.sh                                    |    2 +-
 t/lib-gpg.sh                                    |    2 +-
 t/perf/p5302-pack-index.sh                      |    2 +-
 t/t0001-init.sh                                 |   12 ++--
 t/t0010-racy-git.sh                             |    4 +-
 t/t0020-crlf.sh                                 |   42 +++++++-------
 t/t0025-crlf-auto.sh                            |   38 ++++++-------
 t/t0026-eol-config.sh                           |   20 +++----
 t/t0030-stripspace.sh                           |   20 +++----
 t/t0300-credentials.sh                          |    2 +-
 t/t1000-read-tree-m-3way.sh                     |    4 +-
 t/t1001-read-tree-m-2way.sh                     |   18 +++---
 t/t1002-read-tree-m-u-2way.sh                   |   10 ++--
 t/t1003-read-tree-prefix.sh                     |    2 +-
 t/t1004-read-tree-m-u-wf.sh                     |    8 +--
 t/t1020-subdirectory.sh                         |   22 ++++----
 t/t1050-large.sh                                |    4 +-
 t/t1100-commit-tree-options.sh                  |    4 +-
 t/t1401-symbolic-ref.sh                         |    2 +-
 t/t1410-reflog.sh                               |   24 ++++----
 t/t1511-rev-parse-caret.sh                      |    4 +-
 t/t1512-rev-parse-disambiguation.sh             |    8 +--
 t/t2102-update-index-symlinks.sh                |    2 +-
 t/t3030-merge-recursive.sh                      |    2 +-
 t/t3100-ls-tree-restrict.sh                     |    2 +-
 t/t3101-ls-tree-dirname.sh                      |    2 +-
 t/t3210-pack-refs.sh                            |    2 +-
 t/t3403-rebase-skip.sh                          |    2 +-
 t/t3511-cherry-pick-x.sh                        |   14 ++---
 t/t3600-rm.sh                                   |    4 +-
 t/t3700-add.sh                                  |   16 +++---
 t/t3905-stash-include-untracked.sh              |    4 +-
 t/t3910-mac-os-precompose.sh                    |   16 +++---
 t/t4006-diff-mode.sh                            |    2 +-
 t/t4010-diff-pathspec.sh                        |    4 +-
 t/t4012-diff-binary.sh                          |   16 +++---
 t/t4013-diff-various.sh                         |    6 +-
 t/t4014-format-patch.sh                         |   10 ++--
 t/t4036-format-patch-signer-mime.sh             |    2 +-
 t/t4038-diff-combined.sh                        |    2 +-
 t/t4057-diff-combined-paths.sh                  |    2 +-
 t/t4116-apply-reverse.sh                        |   12 ++--
 t/t4119-apply-config.sh                         |    2 +-
t/t4204-patch-id.sh                             |    4 +-
 t/t5000-tar-tree.sh                             |    6 +-
 t/t5003-archive-zip.sh                          |    2 +-
 t/t5100-mailinfo.sh                             |   12 ++--
 t/t5300-pack-object.sh                          |   18 +++---
 t/t5301-sliding-window.sh                       |   14 ++---
 t/t5302-pack-index.sh                           |   34 ++++++------
 t/t5303-pack-corruption-resilience.sh           |    8 +--
 t/t5304-prune.sh                                |    2 +-
 t/t5305-include-tag.sh                          |    8 +--
 t/t5500-fetch-pack.sh                           |   16 +++---
 t/t5505-remote.sh                               |    2 +-
 t/t5506-remote-groups.sh                        |    2 +-
 t/t5510-fetch.sh                                |   10 ++--
 t/t5515-fetch-merge-logic.sh                    |    4 +-
 t/t5516-fetch-push.sh                           |    4 +-
 t/t5517-push-mirror.sh                          |    2 +-
 t/t5520-pull.sh                                 |   10 ++--
 t/t5522-pull-symlink.sh                         |    2 +-
 t/t5530-upload-pack-error.sh                    |    2 +-
 t/t5537-fetch-shallow.sh                        |    4 +-
 t/t5538-push-shallow.sh                         |    4 +-
 t/t5550-http-fetch-dumb.sh                      |    8 +--
 t/t5551-http-fetch-smart.sh                     |    2 +-
 t/t5570-git-daemon.sh                           |    8 +--
 t/t5601-clone.sh                                |    2 +-
 t/t5700-clone-reference.sh                      |    2 +-
 t/t5710-info-alternate.sh                       |    2 +-
 t/t5900-repo-selection.sh                       |    2 +-
 t/t6001-rev-list-graft.sh                       |   12 ++--
 t/t6002-rev-list-bisect.sh                      |    6 +-
 t/t6015-rev-list-show-all-parents.sh            |    6 +-
 t/t6032-merge-large-rename.sh                   |    2 +-
 t/t6034-merge-rename-nocruft.sh                 |    2 +-
 t/t6132-pathspec-exclude.sh                     |    2 +-
 t/t7001-mv.sh                                   |    4 +-
 t/t7003-filter-branch.sh                        |    6 +-
 t/t7004-tag.sh                                  |   16 +++---
 t/t7006-pager.sh                                |    2 +-
 t/t7103-reset-bare.sh                           |    2 +-
 t/t7406-submodule-update.sh                     |    4 +-
 t/t7408-submodule-reference.sh                  |    2 +-
 t/t7504-commit-msg-hook.sh                      |    2 +-
 t/t7505-prepare-commit-msg-hook.sh              |   32 +++++------
 t/t7602-merge-octopus-many.sh                   |    8 +--
 t/t7700-repack.sh                               |    4 +-
 t/t8003-blame-corner-cases.sh                   |    4 +-
 t/t9001-send-email.sh                           |   10 ++--
 t/t9100-git-svn-basic.sh                        |   24 ++++----
 t/t9101-git-svn-props.sh                        |   30 +++++-----
 t/t9104-git-svn-follow-parent.sh                |   48 ++++++++--------
 t/t9105-git-svn-commit-diff.sh                  |    4 +-
 t/t9107-git-svn-migrate.sh                      |   16 +++---
 t/t9108-git-svn-glob.sh                         |   20 +++----
 t/t9109-git-svn-multi-glob.sh                   |   32 +++++------
 t/t9110-git-svn-use-svm-props.sh                |    2 +-
 t/t9114-git-svn-dcommit-merge.sh                |   12 ++--
 t/t9118-git-svn-funky-branch-names.sh           |    2 +-
 t/t9119-git-svn-info.sh                         |    2 +-
 t/t9129-git-svn-i18n-commitencoding.sh          |    4 +-
 t/t9130-git-svn-authors-file.sh                 |   12 ++--
 t/t9132-git-svn-broken-symlink.sh               |    4 +-
 t/t9137-git-svn-dcommit-clobber-series.sh       |   24 ++++----
 t/t9138-git-svn-authors-prog.sh                 |    2 +-
 t/t9145-git-svn-master-branch.sh                |    4 +-
 t/t9150-svk-mergetickets.sh                     |    2 +-
 t/t9300-fast-import.sh                          |   68 +++++++++++------------
 t/t9350-fast-export.sh                          |    6 +-
 t/t9501-gitweb-standalone-http-status.sh        |    6 +-
 t/t9901-git-web--browse.sh                      |    2 +-
 t/test-lib-functions.sh                         |    8 +--
 unimplemented.sh                                |    2 +-
 140 files changed, 592 insertions(+), 592 deletions(-)

^ permalink raw reply	[relevance 2%]

* Re: [PATCH 2/2] Don't rely on strerror text when testing rmdir failure
  2014-03-29 15:48  0%   ` Jens Lehmann
@ 2014-03-31 17:35  0%     ` Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2014-03-31 17:35 UTC (permalink / raw)
  To: Jens Lehmann; +Cc: Charles Bailey, git

Jens Lehmann <Jens.Lehmann@web.de> writes:

> Am 29.03.2014 16:39, schrieb Charles Bailey:
>> AIX doesn't make a distiction between EEXIST and ENOTEMPTY so relying on
>> the strerror string for the rmdir failure is fragile. Just test that the
>> start of the string matches the Git controlled "failed to rmdir..."
>> error. The exact text of the OS generated error string isn't important
>> to the test.
>
> Makes sense.
>
>> Signed-off-by: Charles Bailey <cbailey32@bloomberg.net>
>> ---
>>  t/t3600-rm.sh | 5 ++---
>>  t/t7001-mv.sh | 3 +--
>>  2 files changed, 3 insertions(+), 5 deletions(-)
>> 
>> diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
>> index 3d30581..23eed17 100755
>> --- a/t/t3600-rm.sh
>> +++ b/t/t3600-rm.sh
>> @@ -709,10 +709,9 @@ test_expect_success 'checking out a commit after submodule removal needs manual
>>  	git commit -m "submodule removal" submod &&
>>  	git checkout HEAD^ &&
>>  	git submodule update &&
>> -	git checkout -q HEAD^ 2>actual &&
>> +	git checkout -q HEAD^ 2>/dev/null &&
>
> Isn't this unrelated to the strerror issue you are fixing here?
> Why not just drop the redirection completely? But maybe I'm just
> being to pedantic here ;-)

No, that sounds like a very reasonable suggestion.  Especially given
that the redirection destination is overwritten immediately after.

In general tests should not have to squelch their standard error
output with 2>/dev/null; that is a job for the test harness, and
they will be shown in the output of "./t3600-rm -v" to serve as
anchor point while finding where a test goes wrong, which is a good
thing.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 2/2] Don't rely on strerror text when testing rmdir failure
  2014-03-29 15:39 12% ` [PATCH 2/2] Don't rely on strerror text when testing rmdir failure Charles Bailey
@ 2014-03-29 15:48  0%   ` Jens Lehmann
  2014-03-31 17:35  0%     ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Jens Lehmann @ 2014-03-29 15:48 UTC (permalink / raw)
  To: Charles Bailey, git

Am 29.03.2014 16:39, schrieb Charles Bailey:
> AIX doesn't make a distiction between EEXIST and ENOTEMPTY so relying on
> the strerror string for the rmdir failure is fragile. Just test that the
> start of the string matches the Git controlled "failed to rmdir..."
> error. The exact text of the OS generated error string isn't important
> to the test.

Makes sense.

> Signed-off-by: Charles Bailey <cbailey32@bloomberg.net>
> ---
>  t/t3600-rm.sh | 5 ++---
>  t/t7001-mv.sh | 3 +--
>  2 files changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
> index 3d30581..23eed17 100755
> --- a/t/t3600-rm.sh
> +++ b/t/t3600-rm.sh
> @@ -709,10 +709,9 @@ test_expect_success 'checking out a commit after submodule removal needs manual
>  	git commit -m "submodule removal" submod &&
>  	git checkout HEAD^ &&
>  	git submodule update &&
> -	git checkout -q HEAD^ 2>actual &&
> +	git checkout -q HEAD^ 2>/dev/null &&

Isn't this unrelated to the strerror issue you are fixing here?
Why not just drop the redirection completely? But maybe I'm just
being to pedantic here ;-)

>  	git checkout -q master 2>actual &&
> -	echo "warning: unable to rmdir submod: Directory not empty" >expected &&
> -	test_i18ncmp expected actual &&
> +	test_i18ngrep "^warning: unable to rmdir submod:" actual &&
>  	git status -s submod >actual &&
>  	echo "?? submod/" >expected &&
>  	test_cmp expected actual &&
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index 215d43d..34fb1af 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -447,8 +447,7 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
>  	git mv sub sub2 &&
>  	git commit -m "moved sub to sub2" &&
>  	git checkout -q HEAD^ 2>actual &&
> -	echo "warning: unable to rmdir sub2: Directory not empty" >expected &&
> -	test_i18ncmp expected actual &&
> +	test_i18ngrep "^warning: unable to rmdir sub2:" actual &&
>  	git status -s sub2 >actual &&
>  	echo "?? sub2/" >expected &&
>  	test_cmp expected actual &&
> 

^ permalink raw reply	[relevance 0%]

* [PATCH 2/2] Don't rely on strerror text when testing rmdir failure
  @ 2014-03-29 15:39 12% ` Charles Bailey
  2014-03-29 15:48  0%   ` Jens Lehmann
  0 siblings, 1 reply; 200+ results
From: Charles Bailey @ 2014-03-29 15:39 UTC (permalink / raw)
  To: git; +Cc: Charles Bailey

AIX doesn't make a distiction between EEXIST and ENOTEMPTY so relying on
the strerror string for the rmdir failure is fragile. Just test that the
start of the string matches the Git controlled "failed to rmdir..."
error. The exact text of the OS generated error string isn't important
to the test.

Signed-off-by: Charles Bailey <cbailey32@bloomberg.net>
---
 t/t3600-rm.sh | 5 ++---
 t/t7001-mv.sh | 3 +--
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 3d30581..23eed17 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -709,10 +709,9 @@ test_expect_success 'checking out a commit after submodule removal needs manual
 	git commit -m "submodule removal" submod &&
 	git checkout HEAD^ &&
 	git submodule update &&
-	git checkout -q HEAD^ 2>actual &&
+	git checkout -q HEAD^ 2>/dev/null &&
 	git checkout -q master 2>actual &&
-	echo "warning: unable to rmdir submod: Directory not empty" >expected &&
-	test_i18ncmp expected actual &&
+	test_i18ngrep "^warning: unable to rmdir submod:" actual &&
 	git status -s submod >actual &&
 	echo "?? submod/" >expected &&
 	test_cmp expected actual &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 215d43d..34fb1af 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -447,8 +447,7 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
 	git mv sub sub2 &&
 	git commit -m "moved sub to sub2" &&
 	git checkout -q HEAD^ 2>actual &&
-	echo "warning: unable to rmdir sub2: Directory not empty" >expected &&
-	test_i18ncmp expected actual &&
+	test_i18ngrep "^warning: unable to rmdir sub2:" actual &&
 	git status -s sub2 >actual &&
 	echo "?? sub2/" >expected &&
 	test_cmp expected actual &&
-- 
1.8.5.1.2.ge5d1dab

^ permalink raw reply related	[relevance 12%]

* [PATCH v2 000/142] Use the $( ... ) construct for command substitution instead of using the back-quotes
@ 2014-03-25 17:22  2% Elia Pinto
  2014-03-25 17:23 20% ` [PATCH v2 084/142] t7001-mv.sh: use the $( ... ) construct for command substitution Elia Pinto
  0 siblings, 1 reply; 200+ results
From: Elia Pinto @ 2014-03-25 17:22 UTC (permalink / raw)
  To: git; +Cc: Elia Pinto


This patch series changes everywhere the back-quotes construct for command
substitution with the $( ... ).  The Git CodingGuidelines prefer 
the $( ... ) construct for command substitution instead of using the back-quotes
, or grave accents (`..`).
    
The backquoted form is the historical method for command substitution,
and is supported by POSIX. However, all but the simplest uses become
complicated quickly. In particular, embedded command substitutions
and/or the use of double quotes require careful escaping with the backslash
character. Because of this the POSIX shell adopted the $(…) feature from
the Korn shell. Because this construct uses distinct
opening and closing delimiters, it is much easier to follow. 
Also now the embedded double quotes no longer need escaping.

The patch is simple but involves a large number of files with different authors. 
Being simple I think it is wasteful to cc a large number of different people
for doing a review. 

This is a second reroll after the 
Matthieu Moy review. Changes from v1:

- Dropped the silly patches to t6111-rev-list-treesame.sh, 
  t0204-gettext-reencode-sanity.sh.

- Simple reformatting of the commit message.

- added the toy script used for doing the patch.

Elia Pinto (142):
  check-builtins.sh: use the $( ... ) construct for command
    substitution
  git-am.sh: use the $( ... ) construct for command substitution
  git-pull.sh: use the $( ... ) construct for command substitution
  git-rebase--merge.sh: use the $( ... ) construct for command
    substitution
  git-rebase.sh: use the $( ... ) construct for command substitution
  git-stash.sh: use the $( ... ) construct for command substitution
  git-web--browse.sh: use the $( ... ) construct for command
    substitution
  unimplemented.sh: use the $( ... ) construct for command substitution
  t0001-init.sh: use the $( ... ) construct for command substitution
  t0010-racy-git.sh: use the $( ... ) construct for command
    substitution
  t0020-crlf.sh: use the $( ... ) construct for command substitution
  t0025-crlf-auto.sh: use the $( ... ) construct for command
    substitution
  t0026-eol-config.sh: use the $( ... ) construct for command
    substitution
  t0030-stripspace.sh: use the $( ... ) construct for command
    substitution
  t0300-credentials.sh: use the $( ... ) construct for command
    substitution
  t1000-read-tree-m-3way.sh: use the $( ... ) construct for command
    substitution
  t1001-read-tree-m-2way.sh: use the $( ... ) construct for command
    substitution
  t1002-read-tree-m-u-2way.sh: use the $( ... ) construct for command
    substitution
  t1003-read-tree-prefix.sh: use the $( ... ) construct for command
    substitution
  t1004-read-tree-m-u-wf.sh: use the $( ... ) construct for command
    substitution
  t1020-subdirectory.sh: use the $( ... ) construct for command
    substitution
  t1050-large.sh: use the $( ... ) construct for command substitution
  t1100-commit-tree-options.sh: use the $( ... ) construct for command
    substitution
  t1401-symbolic-ref.sh: use the $( ... ) construct for command
    substitution
  t1410-reflog.sh: use the $( ... ) construct for command substitution
  t1511-rev-parse-caret.sh: use the $( ... ) construct for command
    substitution
  t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for
    command substitution
  t2102-update-index-symlinks.sh: use the $( ... ) construct for
    command substitution
  t3030-merge-recursive.sh: use the $( ... ) construct for command
    substitution
  t3100-ls-tree-restrict.sh: use the $( ... ) construct for command
    substitution
  t3101-ls-tree-dirname.sh: use the $( ... ) construct for command
    substitution
  t3210-pack-refs.sh: use the $( ... ) construct for command
    substitution
  t3403-rebase-skip.sh: use the $( ... ) construct for command
    substitution
  t3511-cherry-pick-x.sh: use the $( ... ) construct for command
    substitution
  t3600-rm.sh: use the $( ... ) construct for command substitution
  t3700-add.sh: use the $( ... ) construct for command substitution
  t3905-stash-include-untracked.sh: use the $( ... ) construct for
    command substitution
  t3910-mac-os-precompose.sh: use the $( ... ) construct for command
    substitution
  t4006-diff-mode.sh: use the $( ... ) construct for command
    substitution
  t4010-diff-pathspec.sh: use the $( ... ) construct for command
    substitution
  t4012-diff-binary.sh: use the $( ... ) construct for command
    substitution
  t4013-diff-various.sh: use the $( ... ) construct for command
    substitution
  t4014-format-patch.sh: use the $( ... ) construct for command
    substitution
  t4036-format-patch-signer-mime.sh: use the $( ... ) construct for
    command substitution
  t4038-diff-combined.sh: use the $( ... ) construct for command
    substitution
  t4057-diff-combined-paths.sh: use the $( ... ) construct for command
    substitution
  t4116-apply-reverse.sh: use the $( ... ) construct for command
    substitution
  t4119-apply-config.sh: use the $( ... ) construct for command
    substitution
  t4204-patch-id.sh: use the $( ... ) construct for command
    substitution
  t5000-tar-tree.sh: use the $( ... ) construct for command
    substitution
  t5003-archive-zip.sh: use the $( ... ) construct for command
    substitution
  t5100-mailinfo.sh: use the $( ... ) construct for command
    substitution
  t5300-pack-object.sh: use the $( ... ) construct for command
    substitution
  t5301-sliding-window.sh: use the $( ... ) construct for command
    substitution
  t5302-pack-index.sh: use the $( ... ) construct for command
    substitution
  t5303-pack-corruption-resilience.sh: use the $( ... ) construct for
    command substitution
  t5304-prune.sh: use the $( ... ) construct for command substitution
  t5305-include-tag.sh: use the $( ... ) construct for command
    substitution
  t5500-fetch-pack.sh: use the $( ... ) construct for command
    substitution
  t5505-remote.sh: use the $( ... ) construct for command substitution
  t5506-remote-groups.sh: use the $( ... ) construct for command
    substitution
  t5510-fetch.sh: use the $( ... ) construct for command substitution
  t5515-fetch-merge-logic.sh: use the $( ... ) construct for command
    substitution
  t5516-fetch-push.sh: use the $( ... ) construct for command
    substitution
  t5517-push-mirror.sh: use the $( ... ) construct for command
    substitution
  t5520-pull.sh: use the $( ... ) construct for command substitution
  t5522-pull-symlink.sh: use the $( ... ) construct for command
    substitution
  t5530-upload-pack-error.sh: use the $( ... ) construct for command
    substitution
  t5537-fetch-shallow.sh: use the $( ... ) construct for command
    substitution
  t5538-push-shallow.sh: use the $( ... ) construct for command
    substitution
  t5550-http-fetch-dumb.sh: use the $( ... ) construct for command
    substitution
  t5551-http-fetch-smart.sh: use the $( ... ) construct for command
    substitution
  t5570-git-daemon.sh: use the $( ... ) construct for command
    substitution
  t5601-clone.sh: use the $( ... ) construct for command substitution
  t5700-clone-reference.sh: use the $( ... ) construct for command
    substitution
  t5710-info-alternate.sh: use the $( ... ) construct for command
    substitution
  t5900-repo-selection.sh: use the $( ... ) construct for command
    substitution
  t6001-rev-list-graft.sh: use the $( ... ) construct for command
    substitution
  t6002-rev-list-bisect.sh: use the $( ... ) construct for command
    substitution
  t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for
    command substitution
  t6032-merge-large-rename.sh: use the $( ... ) construct for command
    substitution
  t6034-merge-rename-nocruft.sh: use the $( ... ) construct for command
    substitution
  t6132-pathspec-exclude.sh: use the $( ... ) construct for command
    substitution
  t7001-mv.sh: use the $( ... ) construct for command substitution
  t7003-filter-branch.sh: use the $( ... ) construct for command
    substitution
  t7004-tag.sh: use the $( ... ) construct for command substitution
  t7006-pager.sh: use the $( ... ) construct for command substitution
  t7103-reset-bare.sh: use the $( ... ) construct for command
    substitution
  t7406-submodule-update.sh: use the $( ... ) construct for command
    substitution
  t7408-submodule-reference.sh: use the $( ... ) construct for command
    substitution
  t7504-commit-msg-hook.sh: use the $( ... ) construct for command
    substitution
  t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for
    command substitution
  t7602-merge-octopus-many.sh: use the $( ... ) construct for command
    substitution
  t7700-repack.sh: use the $( ... ) construct for command substitution
  t8003-blame-corner-cases.sh: use the $( ... ) construct for command
    substitution
  t9001-send-email.sh: use the $( ... ) construct for command
    substitution
  t9101-git-svn-props.sh: use the $( ... ) construct for command
    substitution
  t9104-git-svn-follow-parent.sh: use the $( ... ) construct for
    command substitution
  t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command
    substitution
  t9107-git-svn-migrate.sh: use the $( ... ) construct for command
    substitution
  t9108-git-svn-glob.sh: use the $( ... ) construct for command
    substitution
  t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command
    substitution
  t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for
    command substitution
  t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for
    command substitution
  t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for
    command substitution
  t9119-git-svn-info.sh: use the $( ... ) construct for command
    substitution
  t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for
    command substitution
  t9130-git-svn-authors-file.sh: use the $( ... ) construct for command
    substitution
  t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for
    command substitution
  t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct
    for command substitution
  t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command
    substitution
  t9145-git-svn-master-branch.sh: use the $( ... ) construct for
    command substitution
  t9150-svk-mergetickets.sh: use the $( ... ) construct for command
    substitution
  t9300-fast-import.sh: use the $( ... ) construct for command
    substitution
  t9350-fast-export.sh: use the $( ... ) construct for command
    substitution
  t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct
    for command substitution
  t9901-git-web--browse.sh: use the $( ... ) construct for command
    substitution
  test-lib-functions.sh: use the $( ... ) construct for command
    substitution
  lib-credential.sh: use the $( ... ) construct for command
    substitution
  lib-cvs.sh: use the $( ... ) construct for command substitution
  lib-gpg.sh: use the $( ... ) construct for command substitution
  p5302-pack-index.sh: use the $( ... ) construct for command
    substitution
  howto-index.sh: use the $( ... ) construct for command substitution
  install-webdoc.sh: use the $( ... ) construct for command
    substitution
  git-checkout.sh: use the $( ... ) construct for command substitution
  git-clone.sh: use the $( ... ) construct for command substitution
  git-commit.sh: use the $( ... ) construct for command substitution
  git-fetch.sh: use the $( ... ) construct for command substitution
  git-ls-remote.sh: use the $( ... ) construct for command substitution
  git-merge.sh: use the $( ... ) construct for command substitution
  git-repack.sh: use the $( ... ) construct for command substitution
  git-resolve.sh: use the $( ... ) construct for command substitution
  git-revert.sh: use the $( ... ) construct for command substitution
  git-tag.sh: use the $( ... ) construct for command substitution
  t9360-mw-to-git-clone.sh: use the $( ... ) construct for command
    substitution
  t9362-mw-to-git-utf8.sh: use the $( ... ) construct for command
    substitution
  t9365-continuing-queries.sh: use the $( ... ) construct for command
    substitution
  test-gitmw-lib.sh: use the $( ... ) construct for command
    substitution
  t7900-subtree.sh: use the $( ... ) construct for command substitution
  appp.sh: use the $( ... ) construct for command substitution
  txt-to-pot.sh: use the $( ... ) construct for command substitution
  t9100-git-svn-basic.sh: use the $( ... ) construct for command
    substitution

 Documentation/howto-index.sh                    |   12 ++--
 Documentation/install-webdoc.sh                 |    6 +-
 check-builtins.sh                               |    4 +-
 contrib/examples/git-checkout.sh                |    8 +--
 contrib/examples/git-clone.sh                   |   20 +++----
 contrib/examples/git-commit.sh                  |   10 ++--
 contrib/examples/git-fetch.sh                   |    6 +-
 contrib/examples/git-ls-remote.sh               |    4 +-
 contrib/examples/git-merge.sh                   |    4 +-
 contrib/examples/git-repack.sh                  |    2 +-
 contrib/examples/git-resolve.sh                 |    2 +-
 contrib/examples/git-revert.sh                  |    2 +-
 contrib/examples/git-tag.sh                     |    2 +-
 contrib/mw-to-git/t/t9360-mw-to-git-clone.sh    |   14 ++---
 contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh     |    4 +-
 contrib/mw-to-git/t/t9365-continuing-queries.sh |    2 +-
 contrib/mw-to-git/t/test-gitmw-lib.sh           |    6 +-
 contrib/subtree/t/t7900-subtree.sh              |    2 +-
 contrib/thunderbird-patch-inline/appp.sh        |   14 ++---
 git-am.sh                                       |   30 +++++-----
 git-gui/po/glossary/txt-to-pot.sh               |    4 +-
 git-pull.sh                                     |    2 +-
 git-rebase--merge.sh                            |    4 +-
 git-rebase.sh                                   |    8 +--
 git-stash.sh                                    |    2 +-
 git-web--browse.sh                              |    6 +-
 t/lib-credential.sh                             |    2 +-
 t/lib-cvs.sh                                    |    2 +-
 t/lib-gpg.sh                                    |    2 +-
 t/perf/p5302-pack-index.sh                      |    2 +-
 t/t0001-init.sh                                 |   12 ++--
 t/t0010-racy-git.sh                             |    4 +-
 t/t0020-crlf.sh                                 |   42 +++++++-------
 t/t0025-crlf-auto.sh                            |   38 ++++++-------
 t/t0026-eol-config.sh                           |   20 +++----
 t/t0030-stripspace.sh                           |   20 +++----
 t/t0300-credentials.sh                          |    2 +-
 t/t1000-read-tree-m-3way.sh                     |    4 +-
 t/t1001-read-tree-m-2way.sh                     |   18 +++---
 t/t1002-read-tree-m-u-2way.sh                   |   10 ++--
 t/t1003-read-tree-prefix.sh                     |    2 +-
 t/t1004-read-tree-m-u-wf.sh                     |    8 +--
 t/t1020-subdirectory.sh                         |   22 ++++----
 t/t1050-large.sh                                |    4 +-
 t/t1100-commit-tree-options.sh                  |    4 +-
 t/t1401-symbolic-ref.sh                         |    2 +-
 t/t1410-reflog.sh                               |   24 ++++----
 t/t1511-rev-parse-caret.sh                      |    4 +-
 t/t1512-rev-parse-disambiguation.sh             |    8 +--
 t/t2102-update-index-symlinks.sh                |    2 +-
 t/t3030-merge-recursive.sh                      |    2 +-
 t/t3100-ls-tree-restrict.sh                     |    2 +-
 t/t3101-ls-tree-dirname.sh                      |    2 +-
 t/t3210-pack-refs.sh                            |    2 +-
 t/t3403-rebase-skip.sh                          |    2 +-
 t/t3511-cherry-pick-x.sh                        |   14 ++---
 t/t3600-rm.sh                                   |    4 +-
 t/t3700-add.sh                                  |   16 +++---
 t/t3905-stash-include-untracked.sh              |    4 +-
 t/t3910-mac-os-precompose.sh                    |   16 +++---
 t/t4006-diff-mode.sh                            |    2 +-
 t/t4010-diff-pathspec.sh                        |    4 +-
 t/t4012-diff-binary.sh                          |   16 +++---
 t/t4013-diff-various.sh                         |    6 +-
 t/t4014-format-patch.sh                         |   10 ++--
 t/t4036-format-patch-signer-mime.sh             |    2 +-
 t/t4038-diff-combined.sh                        |    2 +-
 t/t4057-diff-combined-paths.sh                  |    2 +-
 t/t4116-apply-reverse.sh                        |   12 ++--
 t/t4119-apply-config.sh                         |    2 +-
 t/t4204-patch-id.sh                             |    4 +-
 t/t5000-tar-tree.sh                             |    6 +-
 t/t5003-archive-zip.sh                          |    2 +-
 t/t5100-mailinfo.sh                             |   12 ++--
 t/t5300-pack-object.sh                          |   18 +++---
 t/t5301-sliding-window.sh                       |   14 ++---
 t/t5302-pack-index.sh                           |   34 ++++++------
 t/t5303-pack-corruption-resilience.sh           |    8 +--
 t/t5304-prune.sh                                |    2 +-
 t/t5305-include-tag.sh                          |    8 +--
 t/t5500-fetch-pack.sh                           |   16 +++---
 t/t5505-remote.sh                               |    2 +-
 t/t5506-remote-groups.sh                        |    2 +-
 t/t5510-fetch.sh                                |   10 ++--
 t/t5515-fetch-merge-logic.sh                    |    4 +-
 t/t5516-fetch-push.sh                           |    4 +-
 t/t5517-push-mirror.sh                          |    2 +-
 t/t5520-pull.sh                                 |   10 ++--
 t/t5522-pull-symlink.sh                         |    2 +-
 t/t5530-upload-pack-error.sh                    |    2 +-
 t/t5537-fetch-shallow.sh                        |    4 +-
 t/t5538-push-shallow.sh                         |    4 +-
 t/t5550-http-fetch-dumb.sh                      |    8 +--
 t/t5551-http-fetch-smart.sh                     |    2 +-
 t/t5570-git-daemon.sh                           |    8 +--
 t/t5601-clone.sh                                |    2 +-
 t/t5700-clone-reference.sh                      |    2 +-
 t/t5710-info-alternate.sh                       |    2 +-
 t/t5900-repo-selection.sh                       |    2 +-
 t/t6001-rev-list-graft.sh                       |   12 ++--
 t/t6002-rev-list-bisect.sh                      |    6 +-
 t/t6015-rev-list-show-all-parents.sh            |    6 +-
 t/t6032-merge-large-rename.sh                   |    2 +-
 t/t6034-merge-rename-nocruft.sh                 |    2 +-
 t/t6132-pathspec-exclude.sh                     |    2 +-
 t/t7001-mv.sh                                   |    4 +-
 t/t7003-filter-branch.sh                        |    6 +-
 t/t7004-tag.sh                                  |   16 +++---
 t/t7006-pager.sh                                |    2 +-
 t/t7103-reset-bare.sh                           |    2 +-
 t/t7406-submodule-update.sh                     |    4 +-
 t/t7408-submodule-reference.sh                  |    2 +-
 t/t7504-commit-msg-hook.sh                      |    2 +-
 t/t7505-prepare-commit-msg-hook.sh              |   32 +++++------
 t/t7602-merge-octopus-many.sh                   |    8 +--
 t/t7700-repack.sh                               |    4 +-
 t/t8003-blame-corner-cases.sh                   |    4 +-
 t/t9001-send-email.sh                           |   10 ++--
 t/t9100-git-svn-basic.sh                        |   24 ++++----
 t/t9101-git-svn-props.sh                        |   30 +++++-----
 t/t9104-git-svn-follow-parent.sh                |   48 ++++++++--------
 t/t9105-git-svn-commit-diff.sh                  |    4 +-
 t/t9107-git-svn-migrate.sh                      |   16 +++---
 t/t9108-git-svn-glob.sh                         |   20 +++----
 t/t9109-git-svn-multi-glob.sh                   |   32 +++++------
 t/t9110-git-svn-use-svm-props.sh                |    2 +-
 t/t9114-git-svn-dcommit-merge.sh                |   12 ++--
 t/t9118-git-svn-funky-branch-names.sh           |    2 +-
 t/t9119-git-svn-info.sh                         |    2 +-
 t/t9129-git-svn-i18n-commitencoding.sh          |    4 +-
 t/t9130-git-svn-authors-file.sh                 |   12 ++--
 t/t9132-git-svn-broken-symlink.sh               |    4 +-
 t/t9137-git-svn-dcommit-clobber-series.sh       |   24 ++++----
 t/t9138-git-svn-authors-prog.sh                 |    2 +-
 t/t9145-git-svn-master-branch.sh                |    4 +-
 t/t9150-svk-mergetickets.sh                     |    2 +-
 t/t9300-fast-import.sh                          |   68 +++++++++++------------
 t/t9350-fast-export.sh                          |    6 +-
 t/t9501-gitweb-standalone-http-status.sh        |    6 +-
 t/t9901-git-web--browse.sh                      |    2 +-
 t/test-lib-functions.sh                         |    8 +--
 unimplemented.sh                                |    2 +-
 142 files changed, 609 insertions(+), 609 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[relevance 2%]

* [PATCH v2 084/142] t7001-mv.sh: use the $( ... ) construct for command substitution
  2014-03-25 17:22  2% [PATCH v2 000/142] Use the $( ... ) construct for command substitution instead of using the back-quotes Elia Pinto
@ 2014-03-25 17:23 20% ` Elia Pinto
  0 siblings, 0 replies; 200+ results
From: Elia Pinto @ 2014-03-25 17:23 UTC (permalink / raw)
  To: git; +Cc: Elia Pinto

The Git CodingGuidelines prefer the $( ... ) construct for command
substitution instead of using the back-quotes, or grave accents (`..`).

The backquoted form is the historical method for command substitution,
and is supported by POSIX. However, all but the simplest uses become
complicated quickly. In particular, embedded command substitutions
and/or the use of double quotes require careful escaping with the backslash
character. Because of this the POSIX shell adopted the $(…) feature from
the Korn shell.

The patch was generated by the simple script

for _f in $(find . -name "*.sh")
do
  sed -i 's@`\(.*\)`@$(\1)@g' ${_f}
done

Signed-off-by: Elia Pinto <gitter.spiros@gmail.com>
---
 t/t7001-mv.sh |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e3c8c2c..23564bf 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -156,11 +156,11 @@ test_expect_success "Michael Cassar's test case" '
 	echo b > partA/outline.txt &&
 	echo c > papers/unsorted/_another &&
 	git add papers partA &&
-	T1=`git write-tree` &&
+	T1=$(git write-tree) &&
 
 	git mv papers/unsorted/Thesis.pdf papers/all-papers/moo-blah.pdf &&
 
-	T=`git write-tree` &&
+	T=$(git write-tree) &&
 	git ls-tree -r $T | grep partA/outline.txt || {
 		git ls-tree -r $T
 		(exit 1)
-- 
1.7.10.4

^ permalink raw reply related	[relevance 20%]

* [PATCH 000/144] Use the $( ... ) construct for command substitution instead of using the back-quotes
@ 2014-03-25  8:24  2% Elia Pinto
  2014-03-25  8:25 20% ` [PATCH 086/144] t7001-mv.sh: use the $( ... ) construct for command substitution Elia Pinto
  0 siblings, 1 reply; 200+ results
From: Elia Pinto @ 2014-03-25  8:24 UTC (permalink / raw)
  To: git; +Cc: Elia Pinto

This patch series changes everywhere the back-quotes construct for command
substitution with the $( ... ).  The Git CodingGuidelines prefer 
the $( ... ) construct for command substitution instead of using the back-quotes
, or grave accents (`..`).
    
The backquoted form is the historical method for command substitution,
and is supported by POSIX. However,all but the simplest uses become
complicated quickly. In particular,embedded command substitutions
and/or the use of double quotes require careful escaping with the backslash
character. Because of this the POSIX shell adopted the $(…) feature from
the Korn shell. Because this construct uses distinct
opening and closing delimiters, it is much easier to follow. 
Also now the embedded double quotes no longer need escaping.

The patch is simple but involves a large number of files with different authors. 
Being simple I think it is wasteful to cc a large number of different people
for doing a review. 

Elia Pinto (144):
  check-builtins.sh: use the $( ... ) construct for command
    substitution
  git-am.sh: use the $( ... ) construct for command substitution
  git-pull.sh: use the $( ... ) construct for command substitution
  git-rebase--merge.sh: use the $( ... ) construct for command
    substitution
  git-rebase.sh: use the $( ... ) construct for command substitution
  git-stash.sh: use the $( ... ) construct for command substitution
  git-web--browse.sh: use the $( ... ) construct for command
    substitution
  unimplemented.sh: use the $( ... ) construct for command substitution
  t0001-init.sh: use the $( ... ) construct for command substitution
  t0010-racy-git.sh: use the $( ... ) construct for command
    substitution
  t0020-crlf.sh: use the $( ... ) construct for command substitution
  t0025-crlf-auto.sh: use the $( ... ) construct for command
    substitution
  t0026-eol-config.sh: use the $( ... ) construct for command
    substitution
  t0030-stripspace.sh: use the $( ... ) construct for command
    substitution
  t0204-gettext-reencode-sanity.sh: use the $( ... ) construct for
    command substitution
  t0300-credentials.sh: use the $( ... ) construct for command
    substitution
  t1000-read-tree-m-3way.sh: use the $( ... ) construct for command
    substitution
  t1001-read-tree-m-2way.sh: use the $( ... ) construct for command
    substitution
  t1002-read-tree-m-u-2way.sh: use the $( ... ) construct for command
    substitution
  t1003-read-tree-prefix.sh: use the $( ... ) construct for command
    substitution
  t1004-read-tree-m-u-wf.sh: use the $( ... ) construct for command
    substitution
  t1020-subdirectory.sh: use the $( ... ) construct for command
    substitution
  t1050-large.sh: use the $( ... ) construct for command substitution
  t1100-commit-tree-options.sh: use the $( ... ) construct for command
    substitution
  t1401-symbolic-ref.sh: use the $( ... ) construct for command
    substitution
  t1410-reflog.sh: use the $( ... ) construct for command substitution
  t1511-rev-parse-caret.sh: use the $( ... ) construct for command
    substitution
  t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for
    command substitution
  t2102-update-index-symlinks.sh: use the $( ... ) construct for
    command substitution
  t3030-merge-recursive.sh: use the $( ... ) construct for command
    substitution
  t3100-ls-tree-restrict.sh: use the $( ... ) construct for command
    substitution
  t3101-ls-tree-dirname.sh: use the $( ... ) construct for command
    substitution
  t3210-pack-refs.sh: use the $( ... ) construct for command
    substitution
  t3403-rebase-skip.sh: use the $( ... ) construct for command
    substitution
  t3511-cherry-pick-x.sh: use the $( ... ) construct for command
    substitution
  t3600-rm.sh: use the $( ... ) construct for command substitution
  t3700-add.sh: use the $( ... ) construct for command substitution
  t3905-stash-include-untracked.sh: use the $( ... ) construct for
    command substitution
  t3910-mac-os-precompose.sh: use the $( ... ) construct for command
    substitution
  t4006-diff-mode.sh: use the $( ... ) construct for command
    substitution
  t4010-diff-pathspec.sh: use the $( ... ) construct for command
    substitution
  t4012-diff-binary.sh: use the $( ... ) construct for command
    substitution
  t4013-diff-various.sh: use the $( ... ) construct for command
    substitution
  t4014-format-patch.sh: use the $( ... ) construct for command
    substitution
  t4036-format-patch-signer-mime.sh: use the $( ... ) construct for
    command substitution
  t4038-diff-combined.sh: use the $( ... ) construct for command
    substitution
  t4057-diff-combined-paths.sh: use the $( ... ) construct for command
    substitution
  t4116-apply-reverse.sh: use the $( ... ) construct for command
    substitution
  t4119-apply-config.sh: use the $( ... ) construct for command
    substitution
  t4204-patch-id.sh: use the $( ... ) construct for command
    substitution
  t5000-tar-tree.sh: use the $( ... ) construct for command
    substitution
  t5003-archive-zip.sh: use the $( ... ) construct for command
    substitution
  t5100-mailinfo.sh: use the $( ... ) construct for command
    substitution
  t5300-pack-object.sh: use the $( ... ) construct for command
    substitution
  t5301-sliding-window.sh: use the $( ... ) construct for command
    substitution
  t5302-pack-index.sh: use the $( ... ) construct for command
    substitution
  t5303-pack-corruption-resilience.sh: use the $( ... ) construct for
    command substitution
  t5304-prune.sh: use the $( ... ) construct for command substitution
  t5305-include-tag.sh: use the $( ... ) construct for command
    substitution
  t5500-fetch-pack.sh: use the $( ... ) construct for command
    substitution
  t5505-remote.sh: use the $( ... ) construct for command substitution
  t5506-remote-groups.sh: use the $( ... ) construct for command
    substitution
  t5510-fetch.sh: use the $( ... ) construct for command substitution
  t5515-fetch-merge-logic.sh: use the $( ... ) construct for command
    substitution
  t5516-fetch-push.sh: use the $( ... ) construct for command
    substitution
  t5517-push-mirror.sh: use the $( ... ) construct for command
    substitution
  t5520-pull.sh: use the $( ... ) construct for command substitution
  t5522-pull-symlink.sh: use the $( ... ) construct for command
    substitution
  t5530-upload-pack-error.sh: use the $( ... ) construct for command
    substitution
  t5537-fetch-shallow.sh: use the $( ... ) construct for command
    substitution
  t5538-push-shallow.sh: use the $( ... ) construct for command
    substitution
  t5550-http-fetch-dumb.sh: use the $( ... ) construct for command
    substitution
  t5551-http-fetch-smart.sh: use the $( ... ) construct for command
    substitution
  t5570-git-daemon.sh: use the $( ... ) construct for command
    substitution
  t5601-clone.sh: use the $( ... ) construct for command substitution
  t5700-clone-reference.sh: use the $( ... ) construct for command
    substitution
  t5710-info-alternate.sh: use the $( ... ) construct for command
    substitution
  t5900-repo-selection.sh: use the $( ... ) construct for command
    substitution
  t6001-rev-list-graft.sh: use the $( ... ) construct for command
    substitution
  t6002-rev-list-bisect.sh: use the $( ... ) construct for command
    substitution
  t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for
    command substitution
  t6032-merge-large-rename.sh: use the $( ... ) construct for command
    substitution
  t6034-merge-rename-nocruft.sh: use the $( ... ) construct for command
    substitution
  t6111-rev-list-treesame.sh: use the $( ... ) construct for command
    substitution
  t6132-pathspec-exclude.sh: use the $( ... ) construct for command
    substitution
  t7001-mv.sh: use the $( ... ) construct for command substitution
  t7003-filter-branch.sh: use the $( ... ) construct for command
    substitution
  t7004-tag.sh: use the $( ... ) construct for command substitution
  t7006-pager.sh: use the $( ... ) construct for command substitution
  t7103-reset-bare.sh: use the $( ... ) construct for command
    substitution
  t7406-submodule-update.sh: use the $( ... ) construct for command
    substitution
  t7408-submodule-reference.sh: use the $( ... ) construct for command
    substitution
  t7504-commit-msg-hook.sh: use the $( ... ) construct for command
    substitution
  t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for
    command substitution
  t7602-merge-octopus-many.sh: use the $( ... ) construct for command
    substitution
  t7700-repack.sh: use the $( ... ) construct for command substitution
  t8003-blame-corner-cases.sh: use the $( ... ) construct for command
    substitution
  t9001-send-email.sh: use the $( ... ) construct for command
    substitution
  t9101-git-svn-props.sh: use the $( ... ) construct for command
    substitution
  t9104-git-svn-follow-parent.sh: use the $( ... ) construct for
    command substitution
  t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command
    substitution
  t9107-git-svn-migrate.sh: use the $( ... ) construct for command
    substitution
  t9108-git-svn-glob.sh: use the $( ... ) construct for command
    substitution
  t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command
    substitution
  t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for
    command substitution
  t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for
    command substitution
  t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for
    command substitution
  t9119-git-svn-info.sh: use the $( ... ) construct for command
    substitution
  t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for
    command substitution
  t9130-git-svn-authors-file.sh: use the $( ... ) construct for command
    substitution
  t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for
    command substitution
  t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct
    for command substitution
  t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command
    substitution
  t9145-git-svn-master-branch.sh: use the $( ... ) construct for
    command substitution
  t9150-svk-mergetickets.sh: use the $( ... ) construct for command
    substitution
  t9300-fast-import.sh: use the $( ... ) construct for command
    substitution
  t9350-fast-export.sh: use the $( ... ) construct for command
    substitution
  t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct
    for command substitution
  t9901-git-web--browse.sh: use the $( ... ) construct for command
    substitution
  test-lib-functions.sh: use the $( ... ) construct for command
    substitution
  lib-credential.sh: use the $( ... ) construct for command
    substitution
  lib-cvs.sh: use the $( ... ) construct for command substitution
  lib-gpg.sh: use the $( ... ) construct for command substitution
  p5302-pack-index.sh: use the $( ... ) construct for command
    substitution
  howto-index.sh: use the $( ... ) construct for command substitution
  install-webdoc.sh: use the $( ... ) construct for command
    substitution
  git-checkout.sh: use the $( ... ) construct for command substitution
  git-clone.sh: use the $( ... ) construct for command substitution
  git-commit.sh: use the $( ... ) construct for command substitution
  git-fetch.sh: use the $( ... ) construct for command substitution
  git-ls-remote.sh: use the $( ... ) construct for command substitution
  git-merge.sh: use the $( ... ) construct for command substitution
  git-repack.sh: use the $( ... ) construct for command substitution
  git-resolve.sh: use the $( ... ) construct for command substitution
  git-revert.sh: use the $( ... ) construct for command substitution
  git-tag.sh: use the $( ... ) construct for command substitution
  t9360-mw-to-git-clone.sh: use the $( ... ) construct for command
    substitution
  t9362-mw-to-git-utf8.sh: use the $( ... ) construct for command
    substitution
  t9365-continuing-queries.sh: use the $( ... ) construct for command
    substitution
  test-gitmw-lib.sh: use the $( ... ) construct for command
    substitution
  t7900-subtree.sh: use the $( ... ) construct for command substitution
  appp.sh: use the $( ... ) construct for command substitution
  txt-to-pot.sh: use the $( ... ) construct for command substitution
  t9100-git-svn-basic.sh: use the $( ... ) construct for command
    substitution

 Documentation/howto-index.sh                    |   12 ++--
 Documentation/install-webdoc.sh                 |    6 +-
 check-builtins.sh                               |    4 +-
 contrib/examples/git-checkout.sh                |    8 +--
 contrib/examples/git-clone.sh                   |   20 +++----
 contrib/examples/git-commit.sh                  |   10 ++--
 contrib/examples/git-fetch.sh                   |    6 +-
 contrib/examples/git-ls-remote.sh               |    4 +-
 contrib/examples/git-merge.sh                   |    4 +-
 contrib/examples/git-repack.sh                  |    2 +-
 contrib/examples/git-resolve.sh                 |    2 +-
 contrib/examples/git-revert.sh                  |    2 +-
 contrib/examples/git-tag.sh                     |    2 +-
 contrib/mw-to-git/t/t9360-mw-to-git-clone.sh    |   14 ++---
 contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh     |    4 +-
 contrib/mw-to-git/t/t9365-continuing-queries.sh |    2 +-
 contrib/mw-to-git/t/test-gitmw-lib.sh           |    6 +-
 contrib/subtree/t/t7900-subtree.sh              |    2 +-
 contrib/thunderbird-patch-inline/appp.sh        |   14 ++---
 git-am.sh                                       |   30 +++++-----
 git-gui/po/glossary/txt-to-pot.sh               |    4 +-
 git-pull.sh                                     |    2 +-
 git-rebase--merge.sh                            |    4 +-
 git-rebase.sh                                   |    8 +--
 git-stash.sh                                    |    2 +-
 git-web--browse.sh                              |    6 +-
 t/lib-credential.sh                             |    2 +-
 t/lib-cvs.sh                                    |    2 +-
 t/lib-gpg.sh                                    |    2 +-
 t/perf/p5302-pack-index.sh                      |    2 +-
 t/t0001-init.sh                                 |   12 ++--
 t/t0010-racy-git.sh                             |    4 +-
 t/t0020-crlf.sh                                 |   42 +++++++-------
 t/t0025-crlf-auto.sh                            |   38 ++++++-------
 t/t0026-eol-config.sh                           |   20 +++----
 t/t0030-stripspace.sh                           |   20 +++----
 t/t0204-gettext-reencode-sanity.sh              |    2 +-
 t/t0300-credentials.sh                          |    2 +-
 t/t1000-read-tree-m-3way.sh                     |    4 +-
 t/t1001-read-tree-m-2way.sh                     |   18 +++---
 t/t1002-read-tree-m-u-2way.sh                   |   10 ++--
 t/t1003-read-tree-prefix.sh                     |    2 +-
 t/t1004-read-tree-m-u-wf.sh                     |    8 +--
 t/t1020-subdirectory.sh                         |   22 ++++----
 t/t1050-large.sh                                |    4 +-
 t/t1100-commit-tree-options.sh                  |    4 +-
 t/t1401-symbolic-ref.sh                         |    2 +-
 t/t1410-reflog.sh                               |   24 ++++----
 t/t1511-rev-parse-caret.sh                      |    4 +-
 t/t1512-rev-parse-disambiguation.sh             |    8 +--
 t/t2102-update-index-symlinks.sh                |    2 +-
 t/t3030-merge-recursive.sh                      |    2 +-
 t/t3100-ls-tree-restrict.sh                     |    2 +-
 t/t3101-ls-tree-dirname.sh                      |    2 +-
 t/t3210-pack-refs.sh                            |    2 +-
 t/t3403-rebase-skip.sh                          |    2 +-
 t/t3511-cherry-pick-x.sh                        |   14 ++---
 t/t3600-rm.sh                                   |    4 +-
 t/t3700-add.sh                                  |   16 +++---
 t/t3905-stash-include-untracked.sh              |    4 +-
 t/t3910-mac-os-precompose.sh                    |   16 +++---
 t/t4006-diff-mode.sh                            |    2 +-
 t/t4010-diff-pathspec.sh                        |    4 +-
 t/t4012-diff-binary.sh                          |   16 +++---
 t/t4013-diff-various.sh                         |    6 +-
 t/t4014-format-patch.sh                         |   10 ++--
 t/t4036-format-patch-signer-mime.sh             |    2 +-
 t/t4038-diff-combined.sh                        |    2 +-
 t/t4057-diff-combined-paths.sh                  |    2 +-
 t/t4116-apply-reverse.sh                        |   12 ++--
 t/t4119-apply-config.sh                         |    2 +-
 t/t4204-patch-id.sh                             |    4 +-
 t/t5000-tar-tree.sh                             |    6 +-
 t/t5003-archive-zip.sh                          |    2 +-
 t/t5100-mailinfo.sh                             |   12 ++--
 t/t5300-pack-object.sh                          |   18 +++---
 t/t5301-sliding-window.sh                       |   14 ++---
 t/t5302-pack-index.sh                           |   34 ++++++------
 t/t5303-pack-corruption-resilience.sh           |    8 +--
 t/t5304-prune.sh                                |    2 +-
 t/t5305-include-tag.sh                          |    8 +--
 t/t5500-fetch-pack.sh                           |   16 +++---
 t/t5505-remote.sh                               |    2 +-
 t/t5506-remote-groups.sh                        |    2 +-
 t/t5510-fetch.sh                                |   10 ++--
 t/t5515-fetch-merge-logic.sh                    |    4 +-
 t/t5516-fetch-push.sh                           |    4 +-
 t/t5517-push-mirror.sh                          |    2 +-
 t/t5520-pull.sh                                 |   10 ++--
 t/t5522-pull-symlink.sh                         |    2 +-
 t/t5530-upload-pack-error.sh                    |    2 +-
 t/t5537-fetch-shallow.sh                        |    4 +-
 t/t5538-push-shallow.sh                         |    4 +-
 t/t5550-http-fetch-dumb.sh                      |    8 +--
 t/t5551-http-fetch-smart.sh                     |    2 +-
 t/t5570-git-daemon.sh                           |    8 +--
 t/t5601-clone.sh                                |    2 +-
 t/t5700-clone-reference.sh                      |    2 +-
 t/t5710-info-alternate.sh                       |    2 +-
 t/t5900-repo-selection.sh                       |    2 +-
 t/t6001-rev-list-graft.sh                       |   12 ++--
 t/t6002-rev-list-bisect.sh                      |    6 +-
 t/t6015-rev-list-show-all-parents.sh            |    6 +-
 t/t6032-merge-large-rename.sh                   |    2 +-
 t/t6034-merge-rename-nocruft.sh                 |    2 +-
 t/t6111-rev-list-treesame.sh                    |    2 +-
 t/t6132-pathspec-exclude.sh                     |    2 +-
 t/t7001-mv.sh                                   |    4 +-
 t/t7003-filter-branch.sh                        |    6 +-
 t/t7004-tag.sh                                  |   16 +++---
 t/t7006-pager.sh                                |    2 +-
 t/t7103-reset-bare.sh                           |    2 +-
 t/t7406-submodule-update.sh                     |    4 +-
 t/t7408-submodule-reference.sh                  |    2 +-
 t/t7504-commit-msg-hook.sh                      |    2 +-
 t/t7505-prepare-commit-msg-hook.sh              |   32 +++++------
 t/t7602-merge-octopus-many.sh                   |    8 +--
 t/t7700-repack.sh                               |    4 +-
 t/t8003-blame-corner-cases.sh                   |    4 +-
 t/t9001-send-email.sh                           |   10 ++--
 t/t9100-git-svn-basic.sh                        |   24 ++++----
 t/t9101-git-svn-props.sh                        |   30 +++++-----
 t/t9104-git-svn-follow-parent.sh                |   48 ++++++++--------
 t/t9105-git-svn-commit-diff.sh                  |    4 +-
 t/t9107-git-svn-migrate.sh                      |   16 +++---
 t/t9108-git-svn-glob.sh                         |   20 +++----
 t/t9109-git-svn-multi-glob.sh                   |   32 +++++------
 t/t9110-git-svn-use-svm-props.sh                |    2 +-
 t/t9114-git-svn-dcommit-merge.sh                |   12 ++--
 t/t9118-git-svn-funky-branch-names.sh           |    2 +-
 t/t9119-git-svn-info.sh                         |    2 +-
 t/t9129-git-svn-i18n-commitencoding.sh          |    4 +-
 t/t9130-git-svn-authors-file.sh                 |   12 ++--
 t/t9132-git-svn-broken-symlink.sh               |    4 +-
 t/t9137-git-svn-dcommit-clobber-series.sh       |   24 ++++----
 t/t9138-git-svn-authors-prog.sh                 |    2 +-
 t/t9145-git-svn-master-branch.sh                |    4 +-
 t/t9150-svk-mergetickets.sh                     |    2 +-
 t/t9300-fast-import.sh                          |   68 +++++++++++------------
 t/t9350-fast-export.sh                          |    6 +-
 t/t9501-gitweb-standalone-http-status.sh        |    6 +-
 t/t9901-git-web--browse.sh                      |    2 +-
 t/test-lib-functions.sh                         |    8 +--
 unimplemented.sh                                |    2 +-
 144 files changed, 611 insertions(+), 611 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[relevance 2%]

* [PATCH 086/144] t7001-mv.sh: use the $( ... ) construct for command substitution
  2014-03-25  8:24  2% Elia Pinto
@ 2014-03-25  8:25 20% ` Elia Pinto
  0 siblings, 0 replies; 200+ results
From: Elia Pinto @ 2014-03-25  8:25 UTC (permalink / raw)
  To: git; +Cc: Elia Pinto

The Git CodingGuidelines prefer the $( ... ) construct for command
substitution instead of using the back-quotes, or grave accents (`..`).

The backquoted form is the historical method for command substitution,
and is supported by POSIX. However,all but the simplest uses become
complicated quickly. In particular,embedded command substitutions
and/or the use of double quotes require careful escaping with the backslash
character. Because of this the POSIX shell adopted the $(…) feature from
the Korn shell.

Signed-off-by: Elia Pinto <gitter.spiros@gmail.com>
---
 t/t7001-mv.sh |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e3c8c2c..23564bf 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -156,11 +156,11 @@ test_expect_success "Michael Cassar's test case" '
 	echo b > partA/outline.txt &&
 	echo c > papers/unsorted/_another &&
 	git add papers partA &&
-	T1=`git write-tree` &&
+	T1=$(git write-tree) &&
 
 	git mv papers/unsorted/Thesis.pdf papers/all-papers/moo-blah.pdf &&
 
-	T=`git write-tree` &&
+	T=$(git write-tree) &&
 	git ls-tree -r $T | grep partA/outline.txt || {
 		git ls-tree -r $T
 		(exit 1)
-- 
1.7.10.4

^ permalink raw reply related	[relevance 20%]

* [PATCH 000/144] Use the $( ... ) construct for command substitution instead of using the back-quotes
@ 2014-03-24 16:56  2% Elia Pinto
  0 siblings, 0 replies; 200+ results
From: Elia Pinto @ 2014-03-24 16:56 UTC (permalink / raw)
  To: git; +Cc: Elia Pinto

This patch series changes everywhere the back-quotes construct for command
substitution with the $( ... ).  The Git CodingGuidelines prefer 
the $( ... ) construct for command substitution instead of using the back-quotes
, or grave accents (`..`).
    
The backquoted form is the historical method for command substitution,
and is supported by POSIX. However,all but the simplest uses become
complicated quickly. In particular,embedded command substitutions
and/or the use of double quotes require careful escaping with the backslash
character. Because of this the POSIX shell adopted the $(…) feature from
the Korn shell. Because this construct uses distinct
opening and closing delimiters, it is much easier to follow. 
Also now the embedded double quotes no longer need escaping.

The patch is simple but involves a large number of files with different authors. 
Being simple I think it is wasteful to cc a large number of different people
for doing a review. 

Elia Pinto (144):
  check-builtins.sh: use the $( ... ) construct for command
    substitution
  git-am.sh: use the $( ... ) construct for command substitution
  git-pull.sh: use the $( ... ) construct for command substitution
  git-rebase--merge.sh: use the $( ... ) construct for command
    substitution
  git-rebase.sh: use the $( ... ) construct for command substitution
  git-stash.sh: use the $( ... ) construct for command substitution
  git-web--browse.sh: use the $( ... ) construct for command
    substitution
  unimplemented.sh: use the $( ... ) construct for command substitution
  t0001-init.sh: use the $( ... ) construct for command substitution
  t0010-racy-git.sh: use the $( ... ) construct for command
    substitution
  t0020-crlf.sh: use the $( ... ) construct for command substitution
  t0025-crlf-auto.sh: use the $( ... ) construct for command
    substitution
  t0026-eol-config.sh: use the $( ... ) construct for command
    substitution
  t0030-stripspace.sh: use the $( ... ) construct for command
    substitution
  t0204-gettext-reencode-sanity.sh: use the $( ... ) construct for
    command substitution
  t0300-credentials.sh: use the $( ... ) construct for command
    substitution
  t1000-read-tree-m-3way.sh: use the $( ... ) construct for command
    substitution
  t1001-read-tree-m-2way.sh: use the $( ... ) construct for command
    substitution
  t1002-read-tree-m-u-2way.sh: use the $( ... ) construct for command
    substitution
  t1003-read-tree-prefix.sh: use the $( ... ) construct for command
    substitution
  t1004-read-tree-m-u-wf.sh: use the $( ... ) construct for command
    substitution
  t1020-subdirectory.sh: use the $( ... ) construct for command
    substitution
  t1050-large.sh: use the $( ... ) construct for command substitution
  t1100-commit-tree-options.sh: use the $( ... ) construct for command
    substitution
  t1401-symbolic-ref.sh: use the $( ... ) construct for command
    substitution
  t1410-reflog.sh: use the $( ... ) construct for command substitution
  t1511-rev-parse-caret.sh: use the $( ... ) construct for command
    substitution
  t1512-rev-parse-disambiguation.sh: use the $( ... ) construct for
    command substitution
  t2102-update-index-symlinks.sh: use the $( ... ) construct for
    command substitution
  t3030-merge-recursive.sh: use the $( ... ) construct for command
    substitution
  t3100-ls-tree-restrict.sh: use the $( ... ) construct for command
    substitution
  t3101-ls-tree-dirname.sh: use the $( ... ) construct for command
    substitution
  t3210-pack-refs.sh: use the $( ... ) construct for command
    substitution
  t3403-rebase-skip.sh: use the $( ... ) construct for command
    substitution
  t3511-cherry-pick-x.sh: use the $( ... ) construct for command
    substitution
  t3600-rm.sh: use the $( ... ) construct for command substitution
  t3700-add.sh: use the $( ... ) construct for command substitution
  t3905-stash-include-untracked.sh: use the $( ... ) construct for
    command substitution
  t3910-mac-os-precompose.sh: use the $( ... ) construct for command
    substitution
  t4006-diff-mode.sh: use the $( ... ) construct for command
    substitution
  t4010-diff-pathspec.sh: use the $( ... ) construct for command
    substitution
  t4012-diff-binary.sh: use the $( ... ) construct for command
    substitution
  t4013-diff-various.sh: use the $( ... ) construct for command
    substitution
  t4014-format-patch.sh: use the $( ... ) construct for command
    substitution
  t4036-format-patch-signer-mime.sh: use the $( ... ) construct for
    command substitution
  t4038-diff-combined.sh: use the $( ... ) construct for command
    substitution
  t4057-diff-combined-paths.sh: use the $( ... ) construct for command
    substitution
  t4116-apply-reverse.sh: use the $( ... ) construct for command
    substitution
  t4119-apply-config.sh: use the $( ... ) construct for command
    substitution
  t4204-patch-id.sh: use the $( ... ) construct for command
    substitution
  t5000-tar-tree.sh: use the $( ... ) construct for command
    substitution
  t5003-archive-zip.sh: use the $( ... ) construct for command
    substitution
  t5100-mailinfo.sh: use the $( ... ) construct for command
    substitution
  t5300-pack-object.sh: use the $( ... ) construct for command
    substitution
  t5301-sliding-window.sh: use the $( ... ) construct for command
    substitution
  t5302-pack-index.sh: use the $( ... ) construct for command
    substitution
  t5303-pack-corruption-resilience.sh: use the $( ... ) construct for
    command substitution
  t5304-prune.sh: use the $( ... ) construct for command substitution
  t5305-include-tag.sh: use the $( ... ) construct for command
    substitution
  t5500-fetch-pack.sh: use the $( ... ) construct for command
    substitution
  t5505-remote.sh: use the $( ... ) construct for command substitution
  t5506-remote-groups.sh: use the $( ... ) construct for command
    substitution
  t5510-fetch.sh: use the $( ... ) construct for command substitution
  t5515-fetch-merge-logic.sh: use the $( ... ) construct for command
    substitution
  t5516-fetch-push.sh: use the $( ... ) construct for command
    substitution
  t5517-push-mirror.sh: use the $( ... ) construct for command
    substitution
  t5520-pull.sh: use the $( ... ) construct for command substitution
  t5522-pull-symlink.sh: use the $( ... ) construct for command
    substitution
  t5530-upload-pack-error.sh: use the $( ... ) construct for command
    substitution
  t5537-fetch-shallow.sh: use the $( ... ) construct for command
    substitution
  t5538-push-shallow.sh: use the $( ... ) construct for command
    substitution
  t5550-http-fetch-dumb.sh: use the $( ... ) construct for command
    substitution
  t5551-http-fetch-smart.sh: use the $( ... ) construct for command
    substitution
  t5570-git-daemon.sh: use the $( ... ) construct for command
    substitution
  t5601-clone.sh: use the $( ... ) construct for command substitution
  t5700-clone-reference.sh: use the $( ... ) construct for command
    substitution
  t5710-info-alternate.sh: use the $( ... ) construct for command
    substitution
  t5900-repo-selection.sh: use the $( ... ) construct for command
    substitution
  t6001-rev-list-graft.sh: use the $( ... ) construct for command
    substitution
  t6002-rev-list-bisect.sh: use the $( ... ) construct for command
    substitution
  t6015-rev-list-show-all-parents.sh: use the $( ... ) construct for
    command substitution
  t6032-merge-large-rename.sh: use the $( ... ) construct for command
    substitution
  t6034-merge-rename-nocruft.sh: use the $( ... ) construct for command
    substitution
  t6111-rev-list-treesame.sh: use the $( ... ) construct for command
    substitution
  t6132-pathspec-exclude.sh: use the $( ... ) construct for command
    substitution
  t7001-mv.sh: use the $( ... ) construct for command substitution
  t7003-filter-branch.sh: use the $( ... ) construct for command
    substitution
  t7004-tag.sh: use the $( ... ) construct for command substitution
  t7006-pager.sh: use the $( ... ) construct for command substitution
  t7103-reset-bare.sh: use the $( ... ) construct for command
    substitution
  t7406-submodule-update.sh: use the $( ... ) construct for command
    substitution
  t7408-submodule-reference.sh: use the $( ... ) construct for command
    substitution
  t7504-commit-msg-hook.sh: use the $( ... ) construct for command
    substitution
  t7505-prepare-commit-msg-hook.sh: use the $( ... ) construct for
    command substitution
  t7602-merge-octopus-many.sh: use the $( ... ) construct for command
    substitution
  t7700-repack.sh: use the $( ... ) construct for command substitution
  t8003-blame-corner-cases.sh: use the $( ... ) construct for command
    substitution
  t9001-send-email.sh: use the $( ... ) construct for command
    substitution
  t9101-git-svn-props.sh: use the $( ... ) construct for command
    substitution
  t9104-git-svn-follow-parent.sh: use the $( ... ) construct for
    command substitution
  t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command
    substitution
  t9107-git-svn-migrate.sh: use the $( ... ) construct for command
    substitution
  t9108-git-svn-glob.sh: use the $( ... ) construct for command
    substitution
  t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command
    substitution
  t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for
    command substitution
  t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for
    command substitution
  t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for
    command substitution
  t9119-git-svn-info.sh: use the $( ... ) construct for command
    substitution
  t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for
    command substitution
  t9130-git-svn-authors-file.sh: use the $( ... ) construct for command
    substitution
  t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for
    command substitution
  t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct
    for command substitution
  t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command
    substitution
  t9145-git-svn-master-branch.sh: use the $( ... ) construct for
    command substitution
  t9150-svk-mergetickets.sh: use the $( ... ) construct for command
    substitution
  t9300-fast-import.sh: use the $( ... ) construct for command
    substitution
  t9350-fast-export.sh: use the $( ... ) construct for command
    substitution
  t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct
    for command substitution
  t9901-git-web--browse.sh: use the $( ... ) construct for command
    substitution
  test-lib-functions.sh: use the $( ... ) construct for command
    substitution
  lib-credential.sh: use the $( ... ) construct for command
    substitution
  lib-cvs.sh: use the $( ... ) construct for command substitution
  lib-gpg.sh: use the $( ... ) construct for command substitution
  p5302-pack-index.sh: use the $( ... ) construct for command
    substitution
  howto-index.sh: use the $( ... ) construct for command substitution
  install-webdoc.sh: use the $( ... ) construct for command
    substitution
  git-checkout.sh: use the $( ... ) construct for command substitution
  git-clone.sh: use the $( ... ) construct for command substitution
  git-commit.sh: use the $( ... ) construct for command substitution
  git-fetch.sh: use the $( ... ) construct for command substitution
  git-ls-remote.sh: use the $( ... ) construct for command substitution
  git-merge.sh: use the $( ... ) construct for command substitution
  git-repack.sh: use the $( ... ) construct for command substitution
  git-resolve.sh: use the $( ... ) construct for command substitution
  git-revert.sh: use the $( ... ) construct for command substitution
  git-tag.sh: use the $( ... ) construct for command substitution
  t9360-mw-to-git-clone.sh: use the $( ... ) construct for command
    substitution
  t9362-mw-to-git-utf8.sh: use the $( ... ) construct for command
    substitution
  t9365-continuing-queries.sh: use the $( ... ) construct for command
    substitution
  test-gitmw-lib.sh: use the $( ... ) construct for command
    substitution
  t7900-subtree.sh: use the $( ... ) construct for command substitution
  appp.sh: use the $( ... ) construct for command substitution
  txt-to-pot.sh: use the $( ... ) construct for command substitution
  t9100-git-svn-basic.sh: use the $( ... ) construct for command
    substitution

 Documentation/howto-index.sh                    |   12 ++--
 Documentation/install-webdoc.sh                 |    6 +-
 check-builtins.sh                               |    4 +-
 contrib/examples/git-checkout.sh                |    8 +--
 contrib/examples/git-clone.sh                   |   20 +++----
 contrib/examples/git-commit.sh                  |   10 ++--
 contrib/examples/git-fetch.sh                   |    6 +-
 contrib/examples/git-ls-remote.sh               |    4 +-
 contrib/examples/git-merge.sh                   |    4 +-
 contrib/examples/git-repack.sh                  |    2 +-
 contrib/examples/git-resolve.sh                 |    2 +-
 contrib/examples/git-revert.sh                  |    2 +-
 contrib/examples/git-tag.sh                     |    2 +-
 contrib/mw-to-git/t/t9360-mw-to-git-clone.sh    |   14 ++---
 contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh     |    4 +-
 contrib/mw-to-git/t/t9365-continuing-queries.sh |    2 +-
 contrib/mw-to-git/t/test-gitmw-lib.sh           |    6 +-
 contrib/subtree/t/t7900-subtree.sh              |    2 +-
 contrib/thunderbird-patch-inline/appp.sh        |   14 ++---
 git-am.sh                                       |   30 +++++-----
 git-gui/po/glossary/txt-to-pot.sh               |    4 +-
 git-pull.sh                                     |    2 +-
 git-rebase--merge.sh                            |    4 +-
 git-rebase.sh                                   |    8 +--
 git-stash.sh                                    |    2 +-
 git-web--browse.sh                              |    6 +-
 t/lib-credential.sh                             |    2 +-
 t/lib-cvs.sh                                    |    2 +-
 t/lib-gpg.sh                                    |    2 +-
 t/perf/p5302-pack-index.sh                      |    2 +-
 t/t0001-init.sh                                 |   12 ++--
 t/t0010-racy-git.sh                             |    4 +-
 t/t0020-crlf.sh                                 |   42 +++++++-------
 t/t0025-crlf-auto.sh                            |   38 ++++++-------
 t/t0026-eol-config.sh                           |   20 +++----
 t/t0030-stripspace.sh                           |   20 +++----
 t/t0204-gettext-reencode-sanity.sh              |    2 +-
 t/t0300-credentials.sh                          |    2 +-
 t/t1000-read-tree-m-3way.sh                     |    4 +-
 t/t1001-read-tree-m-2way.sh                     |   18 +++---
 t/t1002-read-tree-m-u-2way.sh                   |   10 ++--
 t/t1003-read-tree-prefix.sh                     |    2 +-
 t/t1004-read-tree-m-u-wf.sh                     |    8 +--
 t/t1020-subdirectory.sh                         |   22 ++++----
 t/t1050-large.sh                                |    4 +-
 t/t1100-commit-tree-options.sh                  |    4 +-
 t/t1401-symbolic-ref.sh                         |    2 +-
 t/t1410-reflog.sh                               |   24 ++++----
 t/t1511-rev-parse-caret.sh                      |    4 +-
 t/t1512-rev-parse-disambiguation.sh             |    8 +--
 t/t2102-update-index-symlinks.sh                |    2 +-
 t/t3030-merge-recursive.sh                      |    2 +-
 t/t3100-ls-tree-restrict.sh                     |    2 +-
 t/t3101-ls-tree-dirname.sh                      |    2 +-
 t/t3210-pack-refs.sh                            |    2 +-
 t/t3403-rebase-skip.sh                          |    2 +-
 t/t3511-cherry-pick-x.sh                        |   14 ++---
 t/t3600-rm.sh                                   |    4 +-
 t/t3700-add.sh                                  |   16 +++---
 t/t3905-stash-include-untracked.sh              |    4 +-
 t/t3910-mac-os-precompose.sh                    |   16 +++---
 t/t4006-diff-mode.sh                            |    2 +-
 t/t4010-diff-pathspec.sh                        |    4 +-
 t/t4012-diff-binary.sh                          |   16 +++---
 t/t4013-diff-various.sh                         |    6 +-
 t/t4014-format-patch.sh                         |   10 ++--
 t/t4036-format-patch-signer-mime.sh             |    2 +-
 t/t4038-diff-combined.sh                        |    2 +-
 t/t4057-diff-combined-paths.sh                  |    2 +-
 t/t4116-apply-reverse.sh                        |   12 ++--
 t/t4119-apply-config.sh                         |    2 +-
 t/t4204-patch-id.sh                             |    4 +-
 t/t5000-tar-tree.sh                             |    6 +-
 t/t5003-archive-zip.sh                          |    2 +-
 t/t5100-mailinfo.sh                             |   12 ++--
 t/t5300-pack-object.sh                          |   18 +++---
 t/t5301-sliding-window.sh                       |   14 ++---
 t/t5302-pack-index.sh                           |   34 ++++++------
 t/t5303-pack-corruption-resilience.sh           |    8 +--
 t/t5304-prune.sh                                |    2 +-
 t/t5305-include-tag.sh                          |    8 +--
 t/t5500-fetch-pack.sh                           |   16 +++---
 t/t5505-remote.sh                               |    2 +-
 t/t5506-remote-groups.sh                        |    2 +-
 t/t5510-fetch.sh                                |   10 ++--
 t/t5515-fetch-merge-logic.sh                    |    4 +-
 t/t5516-fetch-push.sh                           |    4 +-
 t/t5517-push-mirror.sh                          |    2 +-
 t/t5520-pull.sh                                 |   10 ++--
 t/t5522-pull-symlink.sh                         |    2 +-
 t/t5530-upload-pack-error.sh                    |    2 +-
 t/t5537-fetch-shallow.sh                        |    4 +-
 t/t5538-push-shallow.sh                         |    4 +-
 t/t5550-http-fetch-dumb.sh                      |    8 +--
 t/t5551-http-fetch-smart.sh                     |    2 +-
 t/t5570-git-daemon.sh                           |    8 +--
 t/t5601-clone.sh                                |    2 +-
 t/t5700-clone-reference.sh                      |    2 +-
 t/t5710-info-alternate.sh                       |    2 +-
 t/t5900-repo-selection.sh                       |    2 +-
 t/t6001-rev-list-graft.sh                       |   12 ++--
 t/t6002-rev-list-bisect.sh                      |    6 +-
 t/t6015-rev-list-show-all-parents.sh            |    6 +-
 t/t6032-merge-large-rename.sh                   |    2 +-
 t/t6034-merge-rename-nocruft.sh                 |    2 +-
 t/t6111-rev-list-treesame.sh                    |    2 +-
 t/t6132-pathspec-exclude.sh                     |    2 +-
 t/t7001-mv.sh                                   |    4 +-
 t/t7003-filter-branch.sh                        |    6 +-
 t/t7004-tag.sh                                  |   16 +++---
 t/t7006-pager.sh                                |    2 +-
 t/t7103-reset-bare.sh                           |    2 +-
 t/t7406-submodule-update.sh                     |    4 +-
 t/t7408-submodule-reference.sh                  |    2 +-
 t/t7504-commit-msg-hook.sh                      |    2 +-
 t/t7505-prepare-commit-msg-hook.sh              |   32 +++++------
 t/t7602-merge-octopus-many.sh                   |    8 +--
 t/t7700-repack.sh                               |    4 +-
 t/t8003-blame-corner-cases.sh                   |    4 +-
 t/t9001-send-email.sh                           |   10 ++--
 t/t9100-git-svn-basic.sh                        |   24 ++++----
 t/t9101-git-svn-props.sh                        |   30 +++++-----
 t/t9104-git-svn-follow-parent.sh                |   48 ++++++++--------
 t/t9105-git-svn-commit-diff.sh                  |    4 +-
 t/t9107-git-svn-migrate.sh                      |   16 +++---
 t/t9108-git-svn-glob.sh                         |   20 +++----
 t/t9109-git-svn-multi-glob.sh                   |   32 +++++------
 t/t9110-git-svn-use-svm-props.sh                |    2 +-
 t/t9114-git-svn-dcommit-merge.sh                |   12 ++--
 t/t9118-git-svn-funky-branch-names.sh           |    2 +-
 t/t9119-git-svn-info.sh                         |    2 +-
 t/t9129-git-svn-i18n-commitencoding.sh          |    4 +-
 t/t9130-git-svn-authors-file.sh                 |   12 ++--
 t/t9132-git-svn-broken-symlink.sh               |    4 +-
 t/t9137-git-svn-dcommit-clobber-series.sh       |   24 ++++----
 t/t9138-git-svn-authors-prog.sh                 |    2 +-
 t/t9145-git-svn-master-branch.sh                |    4 +-
 t/t9150-svk-mergetickets.sh                     |    2 +-
 t/t9300-fast-import.sh                          |   68 +++++++++++------------
 t/t9350-fast-export.sh                          |    6 +-
 t/t9501-gitweb-standalone-http-status.sh        |    6 +-
 t/t9901-git-web--browse.sh                      |    2 +-
 t/test-lib-functions.sh                         |    8 +--
 unimplemented.sh                                |    2 +-
 144 files changed, 611 insertions(+), 611 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[relevance 2%]

* [PATCH v2] mv: prevent mismatched data when ignoring errors.
  @ 2014-03-15 18:56 12% ` brian m. carlson
  0 siblings, 0 replies; 200+ results
From: brian m. carlson @ 2014-03-15 18:56 UTC (permalink / raw)
  To: git; +Cc: Jens Lehmann, John Keeping, Junio C Hamano, Guillaume Gelin

We shrink the source and destination arrays, but not the modes or
submodule_gitfile arrays, resulting in potentially mismatched data.  Shrink
all the arrays at the same time to prevent this.  Add tests to ensure the
problem does not recur.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---

I attempted to come up with a second patch that would refactor out the
four different arrays into one array of struct, as Jeff suggested, but
it became very ugly very quickly.  So this patch simply fixes the
problem and adds tests.

 builtin/mv.c  |  5 +++++
 t/t7001-mv.sh | 13 ++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index f99c91e..09bbc63 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -230,6 +230,11 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 					memmove(destination + i,
 						destination + i + 1,
 						(argc - i) * sizeof(char *));
+					memmove(modes + i, modes + i + 1,
+						(argc - i) * sizeof(enum update_mode));
+					memmove(submodule_gitfile + i,
+						submodule_gitfile + i + 1,
+						(argc - i) * sizeof(char *));
 					i--;
 				}
 			} else
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e3c8c2c..215d43d 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -294,7 +294,8 @@ test_expect_success 'setup submodule' '
 	git submodule add ./. sub &&
 	echo content >file &&
 	git add file &&
-	git commit -m "added sub and file"
+	git commit -m "added sub and file" &&
+	git branch submodule
 '
 
 test_expect_success 'git mv cannot move a submodule in a file' '
@@ -463,4 +464,14 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
 	! test -s actual
 '
 
+test_expect_success 'mv -k does not accidentally destroy submodules' '
+	git checkout submodule &&
+	mkdir dummy dest &&
+	git mv -k dummy sub dest &&
+	git status --porcelain >actual &&
+	grep "^R  sub -> dest/sub" actual &&
+	git reset --hard &&
+	git checkout .
+'
+
 test_done
-- 
1.9.0.1010.g6633b85.dirty

^ permalink raw reply related	[relevance 12%]

* [PATCH 0/2] solaris test fixups
@ 2014-01-23 19:54  5% Jeff King
  0 siblings, 0 replies; 200+ results
From: Jeff King @ 2014-01-23 19:54 UTC (permalink / raw)
  To: git

Due to the alignment bug in another thread, I had the pleasure of
visiting my old friend Solaris 9 today. The tests _almost_ all run out
of the box.

This series features two minor fixes:

  [1/2]: t7501: fix "empty commit" test with NO_PERL
  [2/2]: t7700: do not use "touch -r"

I had a few other failures related to encodings; I suspect the problem
is simply that the machine in question doesn't have eucJP support at
all.

The big one that I did not fix is in t7001-mv. We do this:

  test_must_fail git mv some-file no-such-dir/

and assume that it will fail. It doesn't. Solaris happily renames
some-file to a regular file named "no-such-dir". So we fail later during
the index-update, complaining about adding the entry "no-such-dir/", but
still exit(0) at the end. I'm mostly willing to just call Solaris crazy
for allowing the rename (Linux returns ENOTDIR), but I do wonder if
the index codepath could be improved (and especially to return an
error).

-Peff

^ permalink raw reply	[relevance 5%]

* [PATCH v2 1/2] mv: better document side effects when moving a submodule
  2014-01-07 21:30  5%         ` [PATCH v2 0/2] better document side effects when [re]moving " Jens Lehmann
@ 2014-01-07 21:31 11%           ` Jens Lehmann
  0 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2014-01-07 21:31 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: George Papanikolaou, git

The "Submodules" section of the "git mv" documentation mentions what will
happen when a submodule with a gitfile gets moved with newer git. But it
doesn't talk about what happens when the user changes between commits
before and after the move, which does not update the work tree like using
the mv command did the first time.

Explain what happens and what the user has to do manually to fix that in
the new BUGS section. Also document this behavior in a new test.

Reported-by: George Papanikolaou <g3orge.app@gmail.com>
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
 Documentation/git-mv.txt | 12 ++++++++++++
 t/t7001-mv.sh            | 21 +++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index b1f7988..e453132 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -52,6 +52,18 @@ core.worktree setting to make the submodule work in the new location.
 It also will attempt to update the submodule.<name>.path setting in
 the linkgit:gitmodules[5] file and stage that file (unless -n is used).

+BUGS
+----
+Each time a superproject update moves a populated submodule (e.g. when
+switching between commits before and after the move) a stale submodule
+checkout will remain in the old location and an empty directory will
+appear in the new location. To populate the submodule again in the new
+location the user will have to run "git submodule update"
+afterwards. Removing the old directory is only safe when it uses a
+gitfile, as otherwise the history of the submodule will be deleted
+too. Both steps will be obsolete when recursive submodule update has
+been implemented.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 3bfdfed..e3c8c2c 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -442,4 +442,25 @@ test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
 	git diff-files --quiet -- sub .gitmodules
 '

+test_expect_success 'checking out a commit before submodule moved needs manual updates' '
+	git mv sub sub2 &&
+	git commit -m "moved sub to sub2" &&
+	git checkout -q HEAD^ 2>actual &&
+	echo "warning: unable to rmdir sub2: Directory not empty" >expected &&
+	test_i18ncmp expected actual &&
+	git status -s sub2 >actual &&
+	echo "?? sub2/" >expected &&
+	test_cmp expected actual &&
+	! test -f sub/.git &&
+	test -f sub2/.git &&
+	git submodule update &&
+	test -f sub/.git &&
+	rm -rf sub2 &&
+	git diff-index --exit-code HEAD &&
+	git update-index --refresh &&
+	git diff-files --quiet -- sub .gitmodules &&
+	git status -s sub2 >actual &&
+	! test -s actual
+'
+
 test_done
-- 
1.8.5.2.231.gfc86eb1

^ permalink raw reply related	[relevance 11%]

* [PATCH v2 0/2] better document side effects when [re]moving a submodule
  2014-01-07 17:57  0%       ` Jens Lehmann
@ 2014-01-07 21:30  5%         ` Jens Lehmann
  2014-01-07 21:31 11%           ` [PATCH v2 1/2] mv: better document side effects when moving " Jens Lehmann
  0 siblings, 1 reply; 200+ results
From: Jens Lehmann @ 2014-01-07 21:30 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: George Papanikolaou, git

Am 07.01.2014 18:57, schrieb Jens Lehmann:
> Am 06.01.2014 23:40, schrieb Junio C Hamano:
>> Jens Lehmann <Jens.Lehmann@web.de> writes:
>>> Does this new paragraph make it clearer?
>>
>> Don't we have bugs section that we can use to list the known
>> limitations like this?
> 
> Right, will change accordingly in v2.

Changes from v1:

- Document side effects under the BUGS section

- Add similar documentation for "git rm"


Jens Lehmann (2):
  mv: better document side effects when moving a submodule
  rm: better document side effects when removing a submodule

 Documentation/git-mv.txt | 12 ++++++++++++
 Documentation/git-rm.txt |  9 +++++++++
 t/t3600-rm.sh            | 16 ++++++++++++++++
 t/t7001-mv.sh            | 21 +++++++++++++++++++++
 4 files changed, 58 insertions(+)

-- 
1.8.5.2.231.gfc86eb1

^ permalink raw reply	[relevance 5%]

* Re: [PATCH] mv: better document side effects when moving a submodule
  2014-01-06 22:40  0%     ` Junio C Hamano
@ 2014-01-07 17:57  0%       ` Jens Lehmann
  2014-01-07 21:30  5%         ` [PATCH v2 0/2] better document side effects when [re]moving " Jens Lehmann
  0 siblings, 1 reply; 200+ results
From: Jens Lehmann @ 2014-01-07 17:57 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: George Papanikolaou, git

Am 06.01.2014 23:40, schrieb Junio C Hamano:
> Jens Lehmann <Jens.Lehmann@web.de> writes:
>> Does this new paragraph make it clearer?
> 
> Don't we have bugs section that we can use to list the known
> limitations like this?

Right, will change accordingly in v2.

>>  Documentation/git-mv.txt | 10 ++++++++++
>>  t/t7001-mv.sh            | 21 +++++++++++++++++++++
> 
> It also may make sense to express the test as "this is what we would
> like to see happen eventually" in the form of test_expect_failure;
> it is not a big deal though.

We'll get the "what we would like to see happen eventually" test for
free from the recursive submodule update framework I'm currently
implementing, so I propose we don't implement this exepected failure
in this patch.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] mv: better document side effects when moving a submodule
  2014-01-06 19:21 11%   ` [PATCH] mv: better document side effects when moving a submodule Jens Lehmann
@ 2014-01-06 22:40  0%     ` Junio C Hamano
  2014-01-07 17:57  0%       ` Jens Lehmann
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2014-01-06 22:40 UTC (permalink / raw)
  To: Jens Lehmann; +Cc: George Papanikolaou, git

Jens Lehmann <Jens.Lehmann@web.de> writes:

> The "Submodules" section of the "git mv" documentation mentions what will
> happen when a submodule with a gitfile gets moved with newer git. But it
> doesn't talk about what happens when the user changes between commits
> before and after the move, which does not update the work tree like using
> the mv command did the first time.
>
> Explain what happens and what the user has to do manually to fix that.
> Also document this in a new test.
>
> Reported-by: George Papanikolaou <g3orge.app@gmail.com>
> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
> ---
>
> Am 09.12.2013 18:49, schrieb Jens Lehmann:
>> Am 09.12.2013 11:59, schrieb George Papanikolaou:
>>> Also after mv you need to run 'submodule update' and I think this should be
>>> documented somewhere.
>> 
>> You're right, this should be mentioned in the mv man page. I'll
>> prepare a patch for that.
>
> Does this new paragraph make it clearer?

Don't we have bugs section that we can use to list the known
limitations like this?

>  Documentation/git-mv.txt | 10 ++++++++++
>  t/t7001-mv.sh            | 21 +++++++++++++++++++++

It also may make sense to express the test as "this is what we would
like to see happen eventually" in the form of test_expect_failure;
it is not a big deal though.

>  2 files changed, 31 insertions(+)
>
> diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
> index b1f7988..c9e8568 100644
> --- a/Documentation/git-mv.txt
> +++ b/Documentation/git-mv.txt
> @@ -52,6 +52,16 @@ core.worktree setting to make the submodule work in the new location.
>  It also will attempt to update the submodule.<name>.path setting in
>  the linkgit:gitmodules[5] file and stage that file (unless -n is used).
>
> +Please note that each time a superproject update moves a populated
> +submodule (e.g. when switching between commits before and after the
> +move) a stale submodule checkout will remain in the old location
> +and an empty directory will appear in the new location. To populate
> +the submodule again in the new location the user will have to run
> +"git submodule update" afterwards. Removing the old directory is
> +only safe when it uses a gitfile, as otherwise the history of the
> +submodule will be deleted too. Both steps will be obsolete when
> +recursive submodule update has been implemented.
> +
>  GIT
>  ---
>  Part of the linkgit:git[1] suite
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index 3bfdfed..e3c8c2c 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -442,4 +442,25 @@ test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
>  	git diff-files --quiet -- sub .gitmodules
>  '
>
> +test_expect_success 'checking out a commit before submodule moved needs manual updates' '
> +	git mv sub sub2 &&
> +	git commit -m "moved sub to sub2" &&
> +	git checkout -q HEAD^ 2>actual &&
> +	echo "warning: unable to rmdir sub2: Directory not empty" >expected &&
> +	test_i18ncmp expected actual &&
> +	git status -s sub2 >actual &&
> +	echo "?? sub2/" >expected &&
> +	test_cmp expected actual &&
> +	! test -f sub/.git &&
> +	test -f sub2/.git &&
> +	git submodule update &&
> +	test -f sub/.git &&
> +	rm -rf sub2 &&
> +	git diff-index --exit-code HEAD &&
> +	git update-index --refresh &&
> +	git diff-files --quiet -- sub .gitmodules &&
> +	git status -s sub2 >actual &&
> +	! test -s actual
> +'
> +
>  test_done

^ permalink raw reply	[relevance 0%]

* [PATCH] mv: better document side effects when moving a submodule
  @ 2014-01-06 19:21 11%   ` Jens Lehmann
  2014-01-06 22:40  0%     ` Junio C Hamano
  0 siblings, 1 reply; 200+ results
From: Jens Lehmann @ 2014-01-06 19:21 UTC (permalink / raw)
  To: George Papanikolaou; +Cc: git, Junio C Hamano

The "Submodules" section of the "git mv" documentation mentions what will
happen when a submodule with a gitfile gets moved with newer git. But it
doesn't talk about what happens when the user changes between commits
before and after the move, which does not update the work tree like using
the mv command did the first time.

Explain what happens and what the user has to do manually to fix that.
Also document this in a new test.

Reported-by: George Papanikolaou <g3orge.app@gmail.com>
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---

Am 09.12.2013 18:49, schrieb Jens Lehmann:
> Am 09.12.2013 11:59, schrieb George Papanikolaou:
>> Also after mv you need to run 'submodule update' and I think this should be
>> documented somewhere.
> 
> You're right, this should be mentioned in the mv man page. I'll
> prepare a patch for that.

Does this new paragraph make it clearer?


 Documentation/git-mv.txt | 10 ++++++++++
 t/t7001-mv.sh            | 21 +++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index b1f7988..c9e8568 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -52,6 +52,16 @@ core.worktree setting to make the submodule work in the new location.
 It also will attempt to update the submodule.<name>.path setting in
 the linkgit:gitmodules[5] file and stage that file (unless -n is used).

+Please note that each time a superproject update moves a populated
+submodule (e.g. when switching between commits before and after the
+move) a stale submodule checkout will remain in the old location
+and an empty directory will appear in the new location. To populate
+the submodule again in the new location the user will have to run
+"git submodule update" afterwards. Removing the old directory is
+only safe when it uses a gitfile, as otherwise the history of the
+submodule will be deleted too. Both steps will be obsolete when
+recursive submodule update has been implemented.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 3bfdfed..e3c8c2c 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -442,4 +442,25 @@ test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
 	git diff-files --quiet -- sub .gitmodules
 '

+test_expect_success 'checking out a commit before submodule moved needs manual updates' '
+	git mv sub sub2 &&
+	git commit -m "moved sub to sub2" &&
+	git checkout -q HEAD^ 2>actual &&
+	echo "warning: unable to rmdir sub2: Directory not empty" >expected &&
+	test_i18ncmp expected actual &&
+	git status -s sub2 >actual &&
+	echo "?? sub2/" >expected &&
+	test_cmp expected actual &&
+	! test -f sub/.git &&
+	test -f sub2/.git &&
+	git submodule update &&
+	test -f sub/.git &&
+	rm -rf sub2 &&
+	git diff-index --exit-code HEAD &&
+	git update-index --refresh &&
+	git diff-files --quiet -- sub .gitmodules &&
+	git status -s sub2 >actual &&
+	! test -s actual
+'
+
 test_done
-- 
1.8.5.2.230.g9325930

^ permalink raw reply related	[relevance 11%]

* Re: [PATCH] mv: let 'git mv file no-such-dir/' error out
  2013-12-04 17:44  5%       ` [PATCH] " Junio C Hamano
@ 2013-12-04 17:48  0%         ` Matthieu Moy
  0 siblings, 0 replies; 200+ results
From: Matthieu Moy @ 2013-12-04 17:48 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Duy Nguyen, Git Mailing List

Junio C Hamano <gitster@pobox.com> writes:

> It seems that t7001 needs some face-lifting, by the way.  Perhaps
> after this patch solidifies.

Yes. I followed the style of surrounding code, but it could be
reformatted to follow the current standard. I have no time for it now.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] mv: let 'git mv file no-such-dir/' error out
    2013-12-04 17:37 10%       ` [PATCH v2] " Matthieu Moy
@ 2013-12-04 17:44  5%       ` Junio C Hamano
  2013-12-04 17:48  0%         ` Matthieu Moy
  1 sibling, 1 reply; 200+ results
From: Junio C Hamano @ 2013-12-04 17:44 UTC (permalink / raw)
  To: Duy Nguyen; +Cc: Matthieu Moy, Git Mailing List

Duy Nguyen <pclouds@gmail.com> writes:

> On Wed, Dec 4, 2013 at 3:44 PM, Matthieu Moy
> <Matthieu.Moy@grenoble-inp.fr> wrote:
>> Duy Nguyen <pclouds@gmail.com> writes:
>>
>>> On Tue, Dec 3, 2013 at 3:32 PM, Matthieu Moy <Matthieu.Moy@imag.fr> wrote:
>>> There's something we probably should check. In d78b0f3 ([PATCH]
>>> git-mv: add more path normalization - 2006-08-16), it mentions about
>>>
>>> git mv something/ somewhere/
>>>
>>> there's no test in that commit so I don't know the actual input and
>>> expected outcome.
>>
>> To me, the expected outcome is "behave like Unix's mv" (which works with
>> or without the trailing slash if somewhere exists).
>>
>>> If "somewhere" is a directory, it errors out with this patch and works
>>> without it.
>>
>> I can't reproduce. I've added this to my patch (indeed, the area wasn't
>> well tested), and the tests pass.
>
> Now I can't either. Probably some mis-setups or some local bugs in my
> tree. Good that we have more tests.

OK, I was also scratching my head after seeing your response.

It seems that t7001 needs some face-lifting, by the way.  Perhaps
after this patch solidifies.

^ permalink raw reply	[relevance 5%]

* [PATCH v2] mv: let 'git mv file no-such-dir/' error out
  @ 2013-12-04 17:37 10%       ` Matthieu Moy
  2013-12-04 17:44  5%       ` [PATCH] " Junio C Hamano
  1 sibling, 0 replies; 200+ results
From: Matthieu Moy @ 2013-12-04 17:37 UTC (permalink / raw)
  To: git, gitster; +Cc: Duy Nguyen, Matthieu Moy

Git used to trim the trailing slash, and make the command equivalent to
'git mv file no-such-dir', which created the file no-such-dir (while the
trailing slash explicitly stated that it could only be a directory).

This patch skips the trailing slash removal for the destination path. The
path with its trailing slash is passed to rename(2), which errors out
with the appropriate message:

  $ git mv file no-such-dir/
  fatal: renaming 'file' failed: Not a directory

Original-patch-by: Duy Nguyen <pclouds@gmail.com>
Tests, tweaks and commit message by: Matthieu Moy <Matthieu.Moy@imag.fr>

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
So, this patch adds more tests, as suggested by Duy. They all pass
without modifying the code.

 builtin/mv.c  | 23 ++++++++++++++++-------
 t/t7001-mv.sh | 29 +++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 2e0e61b..08fbc03 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -16,9 +16,12 @@ static const char * const builtin_mv_usage[] = {
 	NULL
 };
 
+#define DUP_BASENAME 1
+#define KEEP_TRAILING_SLASH 2
+
 static const char **internal_copy_pathspec(const char *prefix,
 					   const char **pathspec,
-					   int count, int base_name)
+					   int count, unsigned flags)
 {
 	int i;
 	const char **result = xmalloc((count + 1) * sizeof(const char *));
@@ -27,11 +30,12 @@ static const char **internal_copy_pathspec(const char *prefix,
 	for (i = 0; i < count; i++) {
 		int length = strlen(result[i]);
 		int to_copy = length;
-		while (to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
+		while (!(flags & KEEP_TRAILING_SLASH) &&
+		       to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
 			to_copy--;
-		if (to_copy != length || base_name) {
+		if (to_copy != length || flags & DUP_BASENAME) {
 			char *it = xmemdupz(result[i], to_copy);
-			if (base_name) {
+			if (flags & DUP_BASENAME) {
 				result[i] = xstrdup(basename(it));
 				free(it);
 			} else
@@ -87,16 +91,21 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 	source = internal_copy_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
-	dest_path = internal_copy_pathspec(prefix, argv + argc, 1, 0);
+	/*
+	 * Keep trailing slash, needed to let
+	 * "git mv file no-such-dir/" error out.
+	 */
+	dest_path = internal_copy_pathspec(prefix, argv + argc, 1,
+					   KEEP_TRAILING_SLASH);
 	submodule_gitfile = xcalloc(argc, sizeof(char *));
 
 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	else if (!lstat(dest_path[0], &st) &&
 			S_ISDIR(st.st_mode)) {
 		dest_path[0] = add_slash(dest_path[0]);
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	} else {
 		if (argc != 1)
 			die("destination '%s' is not a directory", dest_path[0]);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index b90e985..2f82478 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -70,6 +70,35 @@ test_expect_success \
 rm -f idontexist untracked1 untracked2 \
      path0/idontexist path0/untracked1 path0/untracked2 \
      .git/index.lock
+rmdir path1
+
+test_expect_success \
+    'moving to absent target with trailing slash' \
+    'test_must_fail git mv path0/COPYING no-such-dir/ &&
+     test_must_fail git mv path0/COPYING no-such-dir// &&
+     git mv path0/ no-such-dir/ &&
+     test_path_is_dir no-such-dir/'
+
+test_expect_success \
+    'clean up' \
+    'git reset --hard'
+
+test_expect_success \
+    'moving to existing untracked target with trailing slash' \
+    'mkdir path1 &&
+     git mv path0/ path1/ &&
+     test_path_is_dir path1/path0/'
+
+test_expect_success \
+    'moving to existing tracked target with trailing slash' \
+    'mkdir path2 &&
+     >path2/file && git add path2/file &&
+     git mv path1/path0/ path2/ &&
+     test_path_is_dir path2/path0/'
+
+test_expect_success \
+    'clean up' \
+    'git reset --hard'
 
 test_expect_success \
     'adding another file' \
-- 
1.8.5.rc3.4.g8bd3721

^ permalink raw reply related	[relevance 10%]

* Re: [PATCH] mv: let 'git mv file no-such-dir/' error out
  2013-12-03 10:06  0% ` Duy Nguyen
@ 2013-12-04  8:44 12%   ` Matthieu Moy
    0 siblings, 1 reply; 200+ results
From: Matthieu Moy @ 2013-12-04  8:44 UTC (permalink / raw)
  To: Duy Nguyen; +Cc: Git Mailing List, Junio C Hamano

Duy Nguyen <pclouds@gmail.com> writes:

> On Tue, Dec 3, 2013 at 3:32 PM, Matthieu Moy <Matthieu.Moy@imag.fr> wrote:
>> Git used to trim the trailing slash, and make the command equivalent to
>> 'git mv file no-such-dir', which created the file no-such-dir (while the
>> trailing slash explicitly stated that it could only be a directory).
>>
>> This patch skips the trailing slash removal for the destination path. The
>> path with its trailing slash is passed to rename(2), which errors out
>> with the appropriate message:
>>
>>   $ git mv file no-such-dir/
>>   fatal: renaming 'file' failed: Not a directory
>
> There's something we probably should check. In d78b0f3 ([PATCH]
> git-mv: add more path normalization - 2006-08-16), it mentions about
>
> git mv something/ somewhere/
>
> there's no test in that commit so I don't know the actual input and
> expected outcome.

To me, the expected outcome is "behave like Unix's mv" (which works with
or without the trailing slash if somewhere exists).

> If "somewhere" is a directory, it errors out with this patch and works
> without it.

I can't reproduce. I've added this to my patch (indeed, the area wasn't
well tested), and the tests pass.

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e5c8084..3bfdfed 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -70,12 +70,31 @@ test_expect_success \
 rm -f idontexist untracked1 untracked2 \
      path0/idontexist path0/untracked1 path0/untracked2 \
      .git/index.lock
+rmdir path1
 
 test_expect_success \
-    'moving to target with trailing slash' \
+    'moving to absent target with trailing slash' \
     'test_must_fail git mv path0/COPYING no-such-dir/ &&
      test_must_fail git mv path0/COPYING no-such-dir// &&
-     git mv path0/ no-such-dir/'
+     git mv path0/ no-such-dir/ &&
+     test_path_is_dir no-such-dir'
+
+test_expect_success \
+    'clean up' \
+    'git reset --hard'
+
+test_expect_success \
+    'moving to existing untracked target with trailing slash' \
+    'mkdir path1 &&
+     git mv path0/ path1/ &&
+     test_path_is_dir path1/path0/'
+
+test_expect_success \
+    'moving to existing tracked target with trailing slash' \
+    'mkdir path2 &&
+     >path2/file && git add path2/file &&
+     git mv path1/path0/ path2/ &&
+     test_path_is_dir path2/path0/'
 
 test_expect_success \
     'clean up' \

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply related	[relevance 12%]

* Re: [PATCH] mv: let 'git mv file no-such-dir/' error out
  2013-12-03  8:32 11% [PATCH] mv: let 'git mv file no-such-dir/' error out Matthieu Moy
@ 2013-12-03 10:06  0% ` Duy Nguyen
  2013-12-04  8:44 12%   ` Matthieu Moy
  0 siblings, 1 reply; 200+ results
From: Duy Nguyen @ 2013-12-03 10:06 UTC (permalink / raw)
  To: Matthieu Moy; +Cc: Git Mailing List, Junio C Hamano

On Tue, Dec 3, 2013 at 3:32 PM, Matthieu Moy <Matthieu.Moy@imag.fr> wrote:
> Git used to trim the trailing slash, and make the command equivalent to
> 'git mv file no-such-dir', which created the file no-such-dir (while the
> trailing slash explicitly stated that it could only be a directory).
>
> This patch skips the trailing slash removal for the destination path. The
> path with its trailing slash is passed to rename(2), which errors out
> with the appropriate message:
>
>   $ git mv file no-such-dir/
>   fatal: renaming 'file' failed: Not a directory

There's something we probably should check. In d78b0f3 ([PATCH]
git-mv: add more path normalization - 2006-08-16), it mentions about

git mv something/ somewhere/

there's no test in that commit so I don't know the actual input and
expected outcome. If "somewhere" is a directory, it errors out with
this patch and works without it. If "somewhere" does not exist, it
seems to work like Linux "mv" with or without the patch.

> Original-patch-by: Duy Nguyen <pclouds@gmail.com>
> Tests, tweaks and commit message by: Matthieu Moy <Matthieu.Moy@imag.fr>
>
> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
> ---
>  builtin/mv.c  | 23 ++++++++++++++++-------
>  t/t7001-mv.sh | 10 ++++++++++
>  2 files changed, 26 insertions(+), 7 deletions(-)
>
> diff --git a/builtin/mv.c b/builtin/mv.c
> index 2e0e61b..08fbc03 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -16,9 +16,12 @@ static const char * const builtin_mv_usage[] = {
>         NULL
>  };
>
> +#define DUP_BASENAME 1
> +#define KEEP_TRAILING_SLASH 2
> +
>  static const char **internal_copy_pathspec(const char *prefix,
>                                            const char **pathspec,
> -                                          int count, int base_name)
> +                                          int count, unsigned flags)
>  {
>         int i;
>         const char **result = xmalloc((count + 1) * sizeof(const char *));
> @@ -27,11 +30,12 @@ static const char **internal_copy_pathspec(const char *prefix,
>         for (i = 0; i < count; i++) {
>                 int length = strlen(result[i]);
>                 int to_copy = length;
> -               while (to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
> +               while (!(flags & KEEP_TRAILING_SLASH) &&
> +                      to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
>                         to_copy--;
> -               if (to_copy != length || base_name) {
> +               if (to_copy != length || flags & DUP_BASENAME) {
>                         char *it = xmemdupz(result[i], to_copy);
> -                       if (base_name) {
> +                       if (flags & DUP_BASENAME) {
>                                 result[i] = xstrdup(basename(it));
>                                 free(it);
>                         } else
> @@ -87,16 +91,21 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>
>         source = internal_copy_pathspec(prefix, argv, argc, 0);
>         modes = xcalloc(argc, sizeof(enum update_mode));
> -       dest_path = internal_copy_pathspec(prefix, argv + argc, 1, 0);
> +       /*
> +        * Keep trailing slash, needed to let
> +        * "git mv file no-such-dir/" error out.
> +        */
> +       dest_path = internal_copy_pathspec(prefix, argv + argc, 1,
> +                                          KEEP_TRAILING_SLASH);
>         submodule_gitfile = xcalloc(argc, sizeof(char *));
>
>         if (dest_path[0][0] == '\0')
>                 /* special case: "." was normalized to "" */
> -               destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
> +               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
>         else if (!lstat(dest_path[0], &st) &&
>                         S_ISDIR(st.st_mode)) {
>                 dest_path[0] = add_slash(dest_path[0]);
> -               destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
> +               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
>         } else {
>                 if (argc != 1)
>                         die("destination '%s' is not a directory", dest_path[0]);
> diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
> index b90e985..e5c8084 100755
> --- a/t/t7001-mv.sh
> +++ b/t/t7001-mv.sh
> @@ -72,6 +72,16 @@ rm -f idontexist untracked1 untracked2 \
>       .git/index.lock
>
>  test_expect_success \
> +    'moving to target with trailing slash' \
> +    'test_must_fail git mv path0/COPYING no-such-dir/ &&
> +     test_must_fail git mv path0/COPYING no-such-dir// &&
> +     git mv path0/ no-such-dir/'
> +
> +test_expect_success \
> +    'clean up' \
> +    'git reset --hard'
> +
> +test_expect_success \
>      'adding another file' \
>      'cp "$TEST_DIRECTORY"/../README path0/README &&
>       git add path0/README &&
> --
> 1.8.5.rc3.4.g8bd3721
>



-- 
Duy

^ permalink raw reply	[relevance 0%]

* [PATCH] mv: let 'git mv file no-such-dir/' error out
@ 2013-12-03  8:32 11% Matthieu Moy
  2013-12-03 10:06  0% ` Duy Nguyen
  0 siblings, 1 reply; 200+ results
From: Matthieu Moy @ 2013-12-03  8:32 UTC (permalink / raw)
  To: git, gitster; +Cc: Duy Nguyen, Matthieu Moy

Git used to trim the trailing slash, and make the command equivalent to
'git mv file no-such-dir', which created the file no-such-dir (while the
trailing slash explicitly stated that it could only be a directory).

This patch skips the trailing slash removal for the destination path. The
path with its trailing slash is passed to rename(2), which errors out
with the appropriate message:

  $ git mv file no-such-dir/
  fatal: renaming 'file' failed: Not a directory

Original-patch-by: Duy Nguyen <pclouds@gmail.com>
Tests, tweaks and commit message by: Matthieu Moy <Matthieu.Moy@imag.fr>

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 builtin/mv.c  | 23 ++++++++++++++++-------
 t/t7001-mv.sh | 10 ++++++++++
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 2e0e61b..08fbc03 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -16,9 +16,12 @@ static const char * const builtin_mv_usage[] = {
 	NULL
 };
 
+#define DUP_BASENAME 1
+#define KEEP_TRAILING_SLASH 2
+
 static const char **internal_copy_pathspec(const char *prefix,
 					   const char **pathspec,
-					   int count, int base_name)
+					   int count, unsigned flags)
 {
 	int i;
 	const char **result = xmalloc((count + 1) * sizeof(const char *));
@@ -27,11 +30,12 @@ static const char **internal_copy_pathspec(const char *prefix,
 	for (i = 0; i < count; i++) {
 		int length = strlen(result[i]);
 		int to_copy = length;
-		while (to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
+		while (!(flags & KEEP_TRAILING_SLASH) &&
+		       to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
 			to_copy--;
-		if (to_copy != length || base_name) {
+		if (to_copy != length || flags & DUP_BASENAME) {
 			char *it = xmemdupz(result[i], to_copy);
-			if (base_name) {
+			if (flags & DUP_BASENAME) {
 				result[i] = xstrdup(basename(it));
 				free(it);
 			} else
@@ -87,16 +91,21 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 	source = internal_copy_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
-	dest_path = internal_copy_pathspec(prefix, argv + argc, 1, 0);
+	/*
+	 * Keep trailing slash, needed to let
+	 * "git mv file no-such-dir/" error out.
+	 */
+	dest_path = internal_copy_pathspec(prefix, argv + argc, 1,
+					   KEEP_TRAILING_SLASH);
 	submodule_gitfile = xcalloc(argc, sizeof(char *));
 
 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	else if (!lstat(dest_path[0], &st) &&
 			S_ISDIR(st.st_mode)) {
 		dest_path[0] = add_slash(dest_path[0]);
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	} else {
 		if (argc != 1)
 			die("destination '%s' is not a directory", dest_path[0]);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index b90e985..e5c8084 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -72,6 +72,16 @@ rm -f idontexist untracked1 untracked2 \
      .git/index.lock
 
 test_expect_success \
+    'moving to target with trailing slash' \
+    'test_must_fail git mv path0/COPYING no-such-dir/ &&
+     test_must_fail git mv path0/COPYING no-such-dir// &&
+     git mv path0/ no-such-dir/'
+
+test_expect_success \
+    'clean up' \
+    'git reset --hard'
+
+test_expect_success \
     'adding another file' \
     'cp "$TEST_DIRECTORY"/../README path0/README &&
      git add path0/README &&
-- 
1.8.5.rc3.4.g8bd3721

^ permalink raw reply related	[relevance 11%]

* Re: [BUG] git mv file directory/ creates the file directory
  @ 2013-12-02 17:07 11%   ` Matthieu Moy
  0 siblings, 0 replies; 200+ results
From: Matthieu Moy @ 2013-12-02 17:07 UTC (permalink / raw)
  To: Duy Nguyen; +Cc: git

Duy Nguyen <pclouds@gmail.com> writes:

> This may be a start. Does not seem to break anything..

I did not thoroughly review/test, but it does fix my case. Below is the
same patch with one test case. No time to do more right now.

Thanks,

>From 99985341ed1312cf6a7b63e14be7da0d51c701b4 Mon Sep 17 00:00:00 2001
From: Matthieu Moy <Matthieu.Moy@imag.fr>
Date: Mon, 2 Dec 2013 18:03:20 +0100
Subject: [PATCH] WIP: error out on git mv file no-such-dir/

---
 builtin/mv.c  | 18 +++++++++++-------
 t/t7001-mv.sh |  9 +++++++++
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 2e0e61b..0fcccd5 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -16,9 +16,12 @@ static const char * const builtin_mv_usage[] = {
 	NULL
 };
 
+#define DUP_BASENAME 1
+#define KEEP_TRAILING_SLASH 2
+
 static const char **internal_copy_pathspec(const char *prefix,
 					   const char **pathspec,
-					   int count, int base_name)
+					   int count, unsigned flags)
 {
 	int i;
 	const char **result = xmalloc((count + 1) * sizeof(const char *));
@@ -27,11 +30,12 @@ static const char **internal_copy_pathspec(const char *prefix,
 	for (i = 0; i < count; i++) {
 		int length = strlen(result[i]);
 		int to_copy = length;
-		while (to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
+		while (!(flags & KEEP_TRAILING_SLASH) &&
+		       to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
 			to_copy--;
-		if (to_copy != length || base_name) {
+		if (to_copy != length || flags & DUP_BASENAME) {
 			char *it = xmemdupz(result[i], to_copy);
-			if (base_name) {
+			if (flags & DUP_BASENAME) {
 				result[i] = xstrdup(basename(it));
 				free(it);
 			} else
@@ -87,16 +91,16 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 	source = internal_copy_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
-	dest_path = internal_copy_pathspec(prefix, argv + argc, 1, 0);
+	dest_path = internal_copy_pathspec(prefix, argv + argc, 1, KEEP_TRAILING_SLASH);
 	submodule_gitfile = xcalloc(argc, sizeof(char *));
 
 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	else if (!lstat(dest_path[0], &st) &&
 			S_ISDIR(st.st_mode)) {
 		dest_path[0] = add_slash(dest_path[0]);
-		destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	} else {
 		if (argc != 1)
 			die("destination '%s' is not a directory", dest_path[0]);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index b90e985..7e74bf3 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -72,6 +72,15 @@ rm -f idontexist untracked1 untracked2 \
      .git/index.lock
 
 test_expect_success \
+    'moving to target with trailing slash' \
+    'test_must_fail git mv path0/COPYING no-such-dir/ &&
+     git mv path0/ no-such-dir/'
+
+test_expect_success \
+    'clean up' \
+    'git reset --hard'
+
+test_expect_success \
     'adding another file' \
     'cp "$TEST_DIRECTORY"/../README path0/README &&
      git add path0/README &&
-- 
1.8.5.rc3.4.g8bd3721

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply related	[relevance 11%]

* Re: What's cooking in git.git (Oct 2013, #03; Wed, 16)
  2013-10-18  0:42  0%       ` Karsten Blees
@ 2013-10-18 19:37  0%         ` Jens Lehmann
  0 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-10-18 19:37 UTC (permalink / raw)
  To: Karsten Blees, Junio C Hamano; +Cc: git

Am 18.10.2013 02:42, schrieb Karsten Blees:
> Am 17.10.2013 23:07, schrieb Junio C Hamano:
>> Junio C Hamano <gitster@pobox.com> writes:
>>
>>> Karsten Blees <karsten.blees@gmail.com> writes:
>>>
>>>> Am 16.10.2013 23:43, schrieb Junio C Hamano:
>>>>> * kb/fast-hashmap (2013-09-25) 6 commits
>>>>>  - fixup! diffcore-rename.c: simplify finding exact renames
>>>>>  - diffcore-rename.c: use new hash map implementation
>>>>>  - diffcore-rename.c: simplify finding exact renames
>>>>>  - diffcore-rename.c: move code around to prepare for the next patch
>>>>>  - buitin/describe.c: use new hash map implementation
>>>>>  - add a hashtable implementation that supports O(1) removal
>>>>>
>>>>
>>>> I posted a much more complete v3 [1], but somehow missed Jonathan's fixup! commit.
>>>
>>> Thanks; I'll replace the above with v3 and squash the fix-up in.
>>
>> Interestingly, v3 applied on 'maint' and then merged to 'master'
>> seems to break t3600 and t7001 with a coredump.
>>
>> It would conflict with es/name-hash-no-trailing-slash-in-dirs that
>> has been cooking in 'next', too; the resolution might be trivial but
>> I didn't look too deeply into it.
>>
> 
> I've pushed a rebased version to https://github.com/kblees/git/commits/kb/hashmap-v3-next
> (no changes yet except for Jonathan's fixup in #04 and merge resolution).
> 
> The coredumps are caused by my patch #10, which free()s cache_entries when they are removed, in combination with submodule.c::stage_updated_gitmodules (5fee9952 "submodule.c: add .gitmodules staging helper functions"), which removes a cache_entry, then modifies and re-adds the (now) free()d memory.
> 
> Can't we just use add_file_to_cache here (which replaces cache_entries by creating a copy)?

No objections from my side. Looks like we could also copy the
cache entry just before remove_cache_entry_at() and use that
copy afterwards, but your solution is so much shorter that I
would really like to use it (unless someone more cache-savvy
than me has any objections).

And by the way: this is the last use of remove_cache_entry_at(),
would it make sense to remove that define while at it? Only the
remove_index_entry_at() function it is defined to is currently
used.

> diff --git a/submodule.c b/submodule.c
> index 1905d75..e388487 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -116,30 +116,7 @@ int remove_path_from_gitmodules(const char *path)
>  
>  void stage_updated_gitmodules(void)
>  {
> -       struct strbuf buf = STRBUF_INIT;
> -       struct stat st;
> -       int pos;
> -       struct cache_entry *ce;
> -       int namelen = strlen(".gitmodules");
> -
> -       pos = cache_name_pos(".gitmodules", namelen);
> -       if (pos < 0) {
> -               warning(_("could not find .gitmodules in index"));
> -               return;
> -       }
> -       ce = active_cache[pos];
> -       ce->ce_flags = namelen;
> -       if (strbuf_read_file(&buf, ".gitmodules", 0) < 0)
> -               die(_("reading updated .gitmodules failed"));
> -       if (lstat(".gitmodules", &st) < 0)
> -               die_errno(_("unable to stat updated .gitmodules"));
> -       fill_stat_cache_info(ce, &st);
> -       ce->ce_mode = ce_mode_from_stat(ce, st.st_mode);
> -       if (remove_cache_entry_at(pos) < 0)
> -               die(_("unable to remove .gitmodules from index"));
> -       if (write_sha1_file(buf.buf, buf.len, blob_type, ce->sha1))
> -               die(_("adding updated .gitmodules failed"));
> -       if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))
> +       if (add_file_to_cache(".gitmodules", 0))
>                 die(_("staging updated .gitmodules failed"));
>  }
> 
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[relevance 0%]

* Re: What's cooking in git.git (Oct 2013, #03; Wed, 16)
  2013-10-17 21:07  5%     ` Junio C Hamano
@ 2013-10-18  0:42  0%       ` Karsten Blees
  2013-10-18 19:37  0%         ` Jens Lehmann
  0 siblings, 1 reply; 200+ results
From: Karsten Blees @ 2013-10-18  0:42 UTC (permalink / raw)
  To: Junio C Hamano, Jens Lehmann; +Cc: git

Am 17.10.2013 23:07, schrieb Junio C Hamano:
> Junio C Hamano <gitster@pobox.com> writes:
> 
>> Karsten Blees <karsten.blees@gmail.com> writes:
>>
>>> Am 16.10.2013 23:43, schrieb Junio C Hamano:
>>>> * kb/fast-hashmap (2013-09-25) 6 commits
>>>>  - fixup! diffcore-rename.c: simplify finding exact renames
>>>>  - diffcore-rename.c: use new hash map implementation
>>>>  - diffcore-rename.c: simplify finding exact renames
>>>>  - diffcore-rename.c: move code around to prepare for the next patch
>>>>  - buitin/describe.c: use new hash map implementation
>>>>  - add a hashtable implementation that supports O(1) removal
>>>>
>>>
>>> I posted a much more complete v3 [1], but somehow missed Jonathan's fixup! commit.
>>
>> Thanks; I'll replace the above with v3 and squash the fix-up in.
> 
> Interestingly, v3 applied on 'maint' and then merged to 'master'
> seems to break t3600 and t7001 with a coredump.
> 
> It would conflict with es/name-hash-no-trailing-slash-in-dirs that
> has been cooking in 'next', too; the resolution might be trivial but
> I didn't look too deeply into it.
> 

I've pushed a rebased version to https://github.com/kblees/git/commits/kb/hashmap-v3-next
(no changes yet except for Jonathan's fixup in #04 and merge resolution).

The coredumps are caused by my patch #10, which free()s cache_entries when they are removed, in combination with submodule.c::stage_updated_gitmodules (5fee9952 "submodule.c: add .gitmodules staging helper functions"), which removes a cache_entry, then modifies and re-adds the (now) free()d memory.

Can't we just use add_file_to_cache here (which replaces cache_entries by creating a copy)?


diff --git a/submodule.c b/submodule.c
index 1905d75..e388487 100644
--- a/submodule.c
+++ b/submodule.c
@@ -116,30 +116,7 @@ int remove_path_from_gitmodules(const char *path)
 
 void stage_updated_gitmodules(void)
 {
-       struct strbuf buf = STRBUF_INIT;
-       struct stat st;
-       int pos;
-       struct cache_entry *ce;
-       int namelen = strlen(".gitmodules");
-
-       pos = cache_name_pos(".gitmodules", namelen);
-       if (pos < 0) {
-               warning(_("could not find .gitmodules in index"));
-               return;
-       }
-       ce = active_cache[pos];
-       ce->ce_flags = namelen;
-       if (strbuf_read_file(&buf, ".gitmodules", 0) < 0)
-               die(_("reading updated .gitmodules failed"));
-       if (lstat(".gitmodules", &st) < 0)
-               die_errno(_("unable to stat updated .gitmodules"));
-       fill_stat_cache_info(ce, &st);
-       ce->ce_mode = ce_mode_from_stat(ce, st.st_mode);
-       if (remove_cache_entry_at(pos) < 0)
-               die(_("unable to remove .gitmodules from index"));
-       if (write_sha1_file(buf.buf, buf.len, blob_type, ce->sha1))
-               die(_("adding updated .gitmodules failed"));
-       if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))
+       if (add_file_to_cache(".gitmodules", 0))
                die(_("staging updated .gitmodules failed"));
 }

^ permalink raw reply related	[relevance 0%]

* Re: What's cooking in git.git (Oct 2013, #03; Wed, 16)
  @ 2013-10-17 21:07  5%     ` Junio C Hamano
  2013-10-18  0:42  0%       ` Karsten Blees
  0 siblings, 1 reply; 200+ results
From: Junio C Hamano @ 2013-10-17 21:07 UTC (permalink / raw)
  To: Karsten Blees; +Cc: git

Junio C Hamano <gitster@pobox.com> writes:

> Karsten Blees <karsten.blees@gmail.com> writes:
>
>> Am 16.10.2013 23:43, schrieb Junio C Hamano:
>>> * kb/fast-hashmap (2013-09-25) 6 commits
>>>  - fixup! diffcore-rename.c: simplify finding exact renames
>>>  - diffcore-rename.c: use new hash map implementation
>>>  - diffcore-rename.c: simplify finding exact renames
>>>  - diffcore-rename.c: move code around to prepare for the next patch
>>>  - buitin/describe.c: use new hash map implementation
>>>  - add a hashtable implementation that supports O(1) removal
>>> 
>>
>> I posted a much more complete v3 [1], but somehow missed Jonathan's fixup! commit.
>
> Thanks; I'll replace the above with v3 and squash the fix-up in.

Interestingly, v3 applied on 'maint' and then merged to 'master'
seems to break t3600 and t7001 with a coredump.

It would conflict with es/name-hash-no-trailing-slash-in-dirs that
has been cooking in 'next', too; the resolution might be trivial but
I didn't look too deeply into it.

^ permalink raw reply	[relevance 5%]

* [PATCH] mv: Fix spurious warning when moving a file in presence of submodules
  @ 2013-10-13 11:52 11%   ` Jens Lehmann
  0 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-10-13 11:52 UTC (permalink / raw)
  To: Matthieu Moy, git, Jonathan Nieder, Junio C Hamano

In commit 0656781fa "git mv" learned to update the submodule path in the
.gitmodules file when moving a submodule in the work tree. But since that
commit update_path_in_gitmodules() gets called no matter if we moved a
submodule or a regular file, which is wrong and leads to a bogus warning
when moving a regular file in a repo containing a .gitmodules file:

    warning: Could not find section in .gitmodules where path=<filename>

Fix that by only calling update_path_in_gitmodules() when moving a
submodule. To achieve that, we introduce the special SUBMODULE_WITH_GITDIR
define to distinguish the cases where we also have to connect work tree
and git directory from those where we only need to update the .gitmodules
setting.

A test for submodules using a .git directory together with a .gitmodules
file has been added to t7001. Even though newer git versions will always
use a gitfile when cloning submodules, repositories cloned with older git
versions will still use this layout.

Reported-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---

Am 11.10.2013 19:53, schrieb Jens Lehmann:
> Am 11.10.2013 16:29, schrieb Matthieu Moy:
>> I'm getting this warning:
>>
>>   warning: Could not find section in .gitmodules where path=XXX
>>
>> whenever I use "git mv" to move a file in a repository containing a
>> submodule. The file is outside the submodule and is completely
>> unrelated, so I do not understand the intent of the warning.
>>
>> My understanding (without looking at the code in detail) is that Git
>> tries to be clever about submodule renames, hence checks whether the
>> source file is a submodule. But then if the lookup fails, it should just
>> silently move on to "normal file move" mode I guess...
> 
> Right. Thanks for reporting, I can reproduce that here and am currently
> looking into that.

And this is the fix for it, which I believe is stuff for maint.


 builtin/mv.c  | 13 +++++++++----
 t/t7001-mv.sh | 26 ++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index aec79d1..2e0e61b 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -55,6 +55,7 @@ static const char *add_slash(const char *path)
 }

 static struct lock_file lock_file;
+#define SUBMODULE_WITH_GITDIR ((const char *)1)

 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
@@ -132,6 +133,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf);
 				if (submodule_gitfile[i])
 					submodule_gitfile[i] = xstrdup(submodule_gitfile[i]);
+				else
+					submodule_gitfile[i] = SUBMODULE_WITH_GITDIR;
 				strbuf_release(&submodule_dotgit);
 			} else {
 				const char *src_w_slash = add_slash(src);
@@ -230,10 +233,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		if (!show_only && mode != INDEX) {
 			if (rename(src, dst) < 0 && !ignore_errors)
 				die_errno (_("renaming '%s' failed"), src);
-			if (submodule_gitfile[i])
-				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
-			if (!update_path_in_gitmodules(src, dst))
-				gitmodules_modified = 1;
+			if (submodule_gitfile[i]) {
+				if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
+					connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+				if (!update_path_in_gitmodules(src, dst))
+					gitmodules_modified = 1;
+			}
 		}

 		if (mode == WORKING_DIRECTORY)
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index d432f42..b90e985 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -293,6 +293,32 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm
 	git diff-files --quiet
 '

+test_expect_success 'git mv moves a submodule with a .git directory and .gitmodules' '
+	rm -rf mod &&
+	git reset --hard &&
+	git submodule update &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	(
+		cd sub &&
+		rm -f .git &&
+		cp -a ../.git/modules/sub .git &&
+		GIT_WORK_TREE=. git config --unset core.worktree
+	) &&
+	mkdir mod &&
+	git mv sub mod/sub &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	echo mod/sub >expected &&
+	git config -f .gitmodules submodule.sub.path >actual &&
+	test_cmp expected actual &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
 test_expect_success 'git mv moves a submodule with gitfile' '
 	rm -rf mod/sub &&
 	git reset --hard &&
-- 
1.8.4.474.g128a96c.dirty

^ permalink raw reply related	[relevance 11%]

* Re: [PATCH v4 4/5] Teach mv to update the path entry in .gitmodules for moved submodules
  2013-07-30 19:51  8% ` [PATCH v3 4/5] Teach mv to update the path entry in .gitmodules for moved submodules Jens Lehmann
@ 2013-08-06 19:15  8%   ` Jens Lehmann
  0 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-08-06 19:15 UTC (permalink / raw)
  To: Git Mailing List
  Cc: Junio C Hamano, Heiko Voigt, Nguyen Thai Ngoc Duy,
	Fredrik Gustafsson

Currently using "git mv" on a submodule moves the submodule's work tree in
that of the superproject. But the submodule's path setting in .gitmodules
is left untouched, which is now inconsistent with the work tree and makes
git commands that rely on the proper path -> name mapping (like status and
diff) behave strangely.

Let "git mv" help here by not only moving the submodule's work tree but
also updating the "submodule.<submodule name>.path" setting from the
.gitmodules file and stage both. This doesn't happen when no .gitmodules
file is found and only issues a warning when it doesn't have a section for
this submodule. This is because the user might just use plain gitlinks
without the .gitmodules file or has already updated the path setting by
hand before issuing the "git mv" command (in which case the warning
reminds him that mv would have done that for him). Only when .gitmodules
is found and contains merge conflicts the mv command will fail and tell
the user to resolve the conflict before trying again.

Also extend the man page to inform the user about this new feature.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---

This version fixes the missing strbuf_release() noticed by Frederik.


 Documentation/git-mv.txt |  2 ++
 builtin/mv.c             | 10 ++++++-
 submodule.c              | 34 ++++++++++++++++++++++
 submodule.h              |  1 +
 t/t7001-mv.sh            | 75 ++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 121 insertions(+), 1 deletion(-)

diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index 1f6fce0..b1f7988 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -49,6 +49,8 @@ SUBMODULES
 Moving a submodule using a gitfile (which means they were cloned
 with a Git version 1.7.8 or newer) will update the gitfile and
 core.worktree setting to make the submodule work in the new location.
+It also will attempt to update the submodule.<name>.path setting in
+the linkgit:gitmodules[5] file and stage that file (unless -n is used).

 GIT
 ---
diff --git a/builtin/mv.c b/builtin/mv.c
index 68b7060..7dd6bb4 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -58,7 +58,7 @@ static struct lock_file lock_file;

 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
-	int i, newfd;
+	int i, newfd, gitmodules_modified = 0;
 	int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
 	struct option builtin_mv_options[] = {
 		OPT__VERBOSE(&verbose, N_("be verbose")),
@@ -72,6 +72,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	struct stat st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;

+	gitmodules_config();
 	git_config(git_default_config, NULL);

 	argc = parse_options(argc, argv, prefix, builtin_mv_options,
@@ -125,6 +126,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				struct strbuf submodule_dotgit = STRBUF_INIT;
 				if (!S_ISGITLINK(active_cache[first]->ce_mode))
 					die (_("Huh? Directory %s is in index and no submodule?"), src);
+				if (!is_staging_gitmodules_ok())
+					die (_("Please, stage your changes to .gitmodules or stash them to proceed"));
 				strbuf_addf(&submodule_dotgit, "%s/.git", src);
 				submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf);
 				if (submodule_gitfile[i])
@@ -229,6 +232,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				die_errno (_("renaming '%s' failed"), src);
 			if (submodule_gitfile[i])
 				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+			if (!update_path_in_gitmodules(src, dst))
+				gitmodules_modified = 1;
 		}

 		if (mode == WORKING_DIRECTORY)
@@ -240,6 +245,9 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			rename_cache_entry_at(pos, dst);
 	}

+	if (gitmodules_modified)
+		stage_updated_gitmodules();
+
 	if (active_cache_changed) {
 		if (write_cache(newfd, active_cache, active_nr) ||
 		    commit_locked_index(&lock_file))
diff --git a/submodule.c b/submodule.c
index 5874d08..1c2714f 100644
--- a/submodule.c
+++ b/submodule.c
@@ -47,6 +47,40 @@ int is_staging_gitmodules_ok(void)
 	return !gitmodules_is_modified;
 }

+/*
+ * Try to update the "path" entry in the "submodule.<name>" section of the
+ * .gitmodules file. Return 0 only if a .gitmodules file was found, a section
+ * with the correct path=<oldpath> setting was found and we could update it.
+ */
+int update_path_in_gitmodules(const char *oldpath, const char *newpath)
+{
+	struct strbuf entry = STRBUF_INIT;
+	struct string_list_item *path_option;
+
+	if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */
+		return -1;
+
+	if (gitmodules_is_unmerged)
+		die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first"));
+
+	path_option = unsorted_string_list_lookup(&config_name_for_path, oldpath);
+	if (!path_option) {
+		warning(_("Could not find section in .gitmodules where path=%s"), oldpath);
+		return -1;
+	}
+	strbuf_addstr(&entry, "submodule.");
+	strbuf_addstr(&entry, path_option->util);
+	strbuf_addstr(&entry, ".path");
+	if (git_config_set_in_file(".gitmodules", entry.buf, newpath) < 0) {
+		/* Maybe the user already did that, don't error out here */
+		warning(_("Could not update .gitmodules entry %s"), entry.buf);
+		strbuf_release(&entry);
+		return -1;
+	}
+	strbuf_release(&entry);
+	return 0;
+}
+
 void stage_updated_gitmodules(void)
 {
 	struct strbuf buf = STRBUF_INIT;
diff --git a/submodule.h b/submodule.h
index 5501354..e339891 100644
--- a/submodule.h
+++ b/submodule.h
@@ -12,6 +12,7 @@ enum {
 };

 int is_staging_gitmodules_ok(void);
+int update_path_in_gitmodules(const char *oldpath, const char *newpath);
 void stage_updated_gitmodules(void);
 void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
 		const char *path);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index b99177f..d432f42 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -308,8 +308,83 @@ test_expect_success 'git mv moves a submodule with gitfile' '
 		cd mod/sub &&
 		git status
 	) &&
+	echo mod/sub >expected &&
+	git config -f .gitmodules submodule.sub.path >actual &&
+	test_cmp expected actual &&
 	git update-index --refresh &&
 	git diff-files --quiet
 '

+test_expect_success 'mv does not complain when no .gitmodules file is found' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git rm .gitmodules &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	git mv sub mod/sub 2>actual.err &&
+	! test -s actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv will error out on a modified .gitmodules file unless staged' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git config -f .gitmodules foo.bar true &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	test_must_fail git mv sub mod/sub 2>actual.err &&
+	test -s actual.err &&
+	test -e sub &&
+	git diff-files --quiet -- sub &&
+	git add .gitmodules &&
+	git mv sub mod/sub 2>actual.err &&
+	! test -s actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git config -f .gitmodules --remove-section submodule.sub &&
+	git add .gitmodules &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	git mv sub mod/sub 2>actual.err &&
+	test_i18ncmp expect.err actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git mv -n sub mod/sub 2>actual.err &&
+	test -f sub/.git &&
+	git diff-index --exit-code HEAD &&
+	git update-index --refresh &&
+	git diff-files --quiet -- sub .gitmodules
+'
+
 test_done
-- 
1.8.4.rc0.199.g3f237fc

^ permalink raw reply related	[relevance 8%]

* [PATCH v3 4/5] Teach mv to update the path entry in .gitmodules for moved submodules
  2013-07-30 19:48  6% [PATCH v3 0/5] Teach mv to move submodules Jens Lehmann
  2013-07-30 19:49 10% ` [PATCH v3 1/5] Teach mv to move submodules together with their work trees Jens Lehmann
  2013-07-30 19:50  9% ` [PATCH v3 2/5] Teach mv to move submodules using a gitfile Jens Lehmann
@ 2013-07-30 19:51  8% ` Jens Lehmann
  2013-08-06 19:15  8%   ` [PATCH v4 " Jens Lehmann
  2 siblings, 1 reply; 200+ results
From: Jens Lehmann @ 2013-07-30 19:51 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Junio C Hamano, Heiko Voigt, Nguyen Thai Ngoc Duy

Currently using "git mv" on a submodule moves the submodule's work tree in
that of the superproject. But the submodule's path setting in .gitmodules
is left untouched, which is now inconsistent with the work tree and makes
git commands that rely on the proper path -> name mapping (like status and
diff) behave strangely.

Let "git mv" help here by not only moving the submodule's work tree but
also updating the "submodule.<submodule name>.path" setting from the
.gitmodules file and stage both. This doesn't happen when no .gitmodules
file is found and only issues a warning when it doesn't have a section for
this submodule. This is because the user might just use plain gitlinks
without the .gitmodules file or has already updated the path setting by
hand before issuing the "git mv" command (in which case the warning
reminds him that mv would have done that for him). Only when .gitmodules
is found and contains merge conflicts the mv command will fail and tell
the user to resolve the conflict before trying again.

Also extend the man page to inform the user about this new feature.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
 Documentation/git-mv.txt |  2 ++
 builtin/mv.c             | 10 ++++++-
 submodule.c              | 33 +++++++++++++++++++++
 submodule.h              |  1 +
 t/t7001-mv.sh            | 75 ++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 120 insertions(+), 1 deletion(-)

diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index 1f6fce0..b1f7988 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -49,6 +49,8 @@ SUBMODULES
 Moving a submodule using a gitfile (which means they were cloned
 with a Git version 1.7.8 or newer) will update the gitfile and
 core.worktree setting to make the submodule work in the new location.
+It also will attempt to update the submodule.<name>.path setting in
+the linkgit:gitmodules[5] file and stage that file (unless -n is used).

 GIT
 ---
diff --git a/builtin/mv.c b/builtin/mv.c
index 68b7060..7dd6bb4 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -58,7 +58,7 @@ static struct lock_file lock_file;

 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
-	int i, newfd;
+	int i, newfd, gitmodules_modified = 0;
 	int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
 	struct option builtin_mv_options[] = {
 		OPT__VERBOSE(&verbose, N_("be verbose")),
@@ -72,6 +72,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	struct stat st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;

+	gitmodules_config();
 	git_config(git_default_config, NULL);

 	argc = parse_options(argc, argv, prefix, builtin_mv_options,
@@ -125,6 +126,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				struct strbuf submodule_dotgit = STRBUF_INIT;
 				if (!S_ISGITLINK(active_cache[first]->ce_mode))
 					die (_("Huh? Directory %s is in index and no submodule?"), src);
+				if (!is_staging_gitmodules_ok())
+					die (_("Please, stage your changes to .gitmodules or stash them to proceed"));
 				strbuf_addf(&submodule_dotgit, "%s/.git", src);
 				submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf);
 				if (submodule_gitfile[i])
@@ -229,6 +232,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				die_errno (_("renaming '%s' failed"), src);
 			if (submodule_gitfile[i])
 				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+			if (!update_path_in_gitmodules(src, dst))
+				gitmodules_modified = 1;
 		}

 		if (mode == WORKING_DIRECTORY)
@@ -240,6 +245,9 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			rename_cache_entry_at(pos, dst);
 	}

+	if (gitmodules_modified)
+		stage_updated_gitmodules();
+
 	if (active_cache_changed) {
 		if (write_cache(newfd, active_cache, active_nr) ||
 		    commit_locked_index(&lock_file))
diff --git a/submodule.c b/submodule.c
index 584f7de..b210685 100644
--- a/submodule.c
+++ b/submodule.c
@@ -47,6 +47,39 @@ int is_staging_gitmodules_ok()
 	return !gitmodules_is_modified;
 }

+/*
+ * Try to update the "path" entry in the "submodule.<name>" section of the
+ * .gitmodules file. Return 0 only if a .gitmodules file was found, a section
+ * with the correct path=<oldpath> setting was found and we could update it.
+ */
+int update_path_in_gitmodules(const char *oldpath, const char *newpath)
+{
+	struct strbuf entry = STRBUF_INIT;
+	struct string_list_item *path_option;
+
+	if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */
+		return -1;
+
+	if (gitmodules_is_unmerged)
+		die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first"));
+
+	path_option = unsorted_string_list_lookup(&config_name_for_path, oldpath);
+	if (!path_option) {
+		warning(_("Could not find section in .gitmodules where path=%s"), oldpath);
+		return -1;
+	}
+	strbuf_addstr(&entry, "submodule.");
+	strbuf_addstr(&entry, path_option->util);
+	strbuf_addstr(&entry, ".path");
+	if (git_config_set_in_file(".gitmodules", entry.buf, newpath) < 0) {
+		/* Maybe the user already did that, don't error out here */
+		warning(_("Could not update .gitmodules entry %s"), entry.buf);
+		return -1;
+	}
+	strbuf_release(&entry);
+	return 0;
+}
+
 void stage_updated_gitmodules(void)
 {
 	struct strbuf buf = STRBUF_INIT;
diff --git a/submodule.h b/submodule.h
index 244d5f5..570d4d0 100644
--- a/submodule.h
+++ b/submodule.h
@@ -12,6 +12,7 @@ enum {
 };

 int is_staging_gitmodules_ok();
+int update_path_in_gitmodules(const char *oldpath, const char *newpath);
 void stage_updated_gitmodules(void);
 void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
 		const char *path);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index b99177f..d432f42 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -308,8 +308,83 @@ test_expect_success 'git mv moves a submodule with gitfile' '
 		cd mod/sub &&
 		git status
 	) &&
+	echo mod/sub >expected &&
+	git config -f .gitmodules submodule.sub.path >actual &&
+	test_cmp expected actual &&
 	git update-index --refresh &&
 	git diff-files --quiet
 '

+test_expect_success 'mv does not complain when no .gitmodules file is found' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git rm .gitmodules &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	git mv sub mod/sub 2>actual.err &&
+	! test -s actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv will error out on a modified .gitmodules file unless staged' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git config -f .gitmodules foo.bar true &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	test_must_fail git mv sub mod/sub 2>actual.err &&
+	test -s actual.err &&
+	test -e sub &&
+	git diff-files --quiet -- sub &&
+	git add .gitmodules &&
+	git mv sub mod/sub 2>actual.err &&
+	! test -s actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git config -f .gitmodules --remove-section submodule.sub &&
+	git add .gitmodules &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	git mv sub mod/sub 2>actual.err &&
+	test_i18ncmp expect.err actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git mv -n sub mod/sub 2>actual.err &&
+	test -f sub/.git &&
+	git diff-index --exit-code HEAD &&
+	git update-index --refresh &&
+	git diff-files --quiet -- sub .gitmodules
+'
+
 test_done
-- 
1.8.4.rc0.199.g7079aac

^ permalink raw reply related	[relevance 8%]

* [PATCH v3 2/5] Teach mv to move submodules using a gitfile
  2013-07-30 19:48  6% [PATCH v3 0/5] Teach mv to move submodules Jens Lehmann
  2013-07-30 19:49 10% ` [PATCH v3 1/5] Teach mv to move submodules together with their work trees Jens Lehmann
@ 2013-07-30 19:50  9% ` Jens Lehmann
  2013-07-30 19:51  8% ` [PATCH v3 4/5] Teach mv to update the path entry in .gitmodules for moved submodules Jens Lehmann
  2 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-07-30 19:50 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Junio C Hamano, Heiko Voigt, Nguyen Thai Ngoc Duy

When moving a submodule which uses a gitfile to point to the git directory
stored in .git/modules/<name> of the superproject two changes must be made
to make the submodule work: the .git file and the core.worktree setting
must be adjusted to point from work tree to git directory and back.

Achieve that by remembering which submodule uses a gitfile by storing the
result of read_gitfile() of each submodule. If that is not NULL the new
function connect_work_tree_and_git_dir() is called after renaming the
submodule's work tree which updates the two settings to the new values.

Extend the man page to inform the user about that feature (and while at it
change the description to not talk about a script anymore, as mv is a
builtin for quite some time now).

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
 Documentation/git-mv.txt |  8 +++++++-
 builtin/mv.c             | 19 +++++++++++++++----
 submodule.c              | 31 +++++++++++++++++++++++++++++++
 submodule.h              |  1 +
 t/t7001-mv.sh            | 19 +++++++++++++++++++
 5 files changed, 73 insertions(+), 5 deletions(-)

diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index e93fcb4..1f6fce0 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -13,7 +13,7 @@ SYNOPSIS

 DESCRIPTION
 -----------
-This script is used to move or rename a file, directory or symlink.
+Move or rename a file, directory or symlink.

  git mv [-v] [-f] [-n] [-k] <source> <destination>
  git mv [-v] [-f] [-n] [-k] <source> ... <destination directory>
@@ -44,6 +44,12 @@ OPTIONS
 --verbose::
 	Report the names of files as they are moved.

+SUBMODULES
+----------
+Moving a submodule using a gitfile (which means they were cloned
+with a Git version 1.7.8 or newer) will update the gitfile and
+core.worktree setting to make the submodule work in the new location.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/builtin/mv.c b/builtin/mv.c
index 1d3ef63..68b7060 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -9,6 +9,7 @@
 #include "cache-tree.h"
 #include "string-list.h"
 #include "parse-options.h"
+#include "submodule.h"

 static const char * const builtin_mv_usage[] = {
 	N_("git mv [options] <source>... <destination>"),
@@ -66,7 +67,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		OPT_BOOLEAN('k', NULL, &ignore_errors, N_("skip move/rename errors")),
 		OPT_END(),
 	};
-	const char **source, **destination, **dest_path;
+	const char **source, **destination, **dest_path, **submodule_gitfile;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
 	struct stat st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
@@ -85,6 +86,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	source = internal_copy_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
 	dest_path = internal_copy_pathspec(prefix, argv + argc, 1, 0);
+	submodule_gitfile = xcalloc(argc, sizeof(char *));

 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
@@ -120,8 +122,14 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		else if (src_is_dir) {
 			int first = cache_name_pos(src, length);
 			if (first >= 0) {
+				struct strbuf submodule_dotgit = STRBUF_INIT;
 				if (!S_ISGITLINK(active_cache[first]->ce_mode))
 					die (_("Huh? Directory %s is in index and no submodule?"), src);
+				strbuf_addf(&submodule_dotgit, "%s/.git", src);
+				submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf);
+				if (submodule_gitfile[i])
+					submodule_gitfile[i] = xstrdup(submodule_gitfile[i]);
+				strbuf_release(&submodule_dotgit);
 			} else {
 				const char *src_w_slash = add_slash(src);
 				int last, len_w_slash = length + 1;
@@ -216,9 +224,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		int pos;
 		if (show_only || verbose)
 			printf(_("Renaming %s to %s\n"), src, dst);
-		if (!show_only && mode != INDEX &&
-				rename(src, dst) < 0 && !ignore_errors)
-			die_errno (_("renaming '%s' failed"), src);
+		if (!show_only && mode != INDEX) {
+			if (rename(src, dst) < 0 && !ignore_errors)
+				die_errno (_("renaming '%s' failed"), src);
+			if (submodule_gitfile[i])
+				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+		}

 		if (mode == WORKING_DIRECTORY)
 			continue;
diff --git a/submodule.c b/submodule.c
index 3f0a3f9..d96d187 100644
--- a/submodule.c
+++ b/submodule.c
@@ -1004,3 +1004,34 @@ int merge_submodule(unsigned char result[20], const char *path,
 	free(merges.objects);
 	return 0;
 }
+
+/* Update gitfile and core.worktree setting to connect work tree and git dir */
+void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
+{
+	struct strbuf file_name = STRBUF_INIT;
+	struct strbuf rel_path = STRBUF_INIT;
+	const char *real_work_tree = xstrdup(real_path(work_tree));
+	FILE *fp;
+
+	/* Update gitfile */
+	strbuf_addf(&file_name, "%s/.git", work_tree);
+	fp = fopen(file_name.buf, "w");
+	if (!fp)
+		die(_("Could not create git link %s"), file_name.buf);
+	fprintf(fp, "gitdir: %s\n", relative_path(git_dir, real_work_tree,
+						  &rel_path));
+	fclose(fp);
+
+	/* Update core.worktree setting */
+	strbuf_reset(&file_name);
+	strbuf_addf(&file_name, "%s/config", git_dir);
+	if (git_config_set_in_file(file_name.buf, "core.worktree",
+				   relative_path(real_work_tree, git_dir,
+						 &rel_path)))
+		die(_("Could not set core.worktree in %s"),
+		    file_name.buf);
+
+	strbuf_release(&file_name);
+	strbuf_release(&rel_path);
+	free((void *)real_work_tree);
+}
diff --git a/submodule.h b/submodule.h
index c7ffc7c..29e9658 100644
--- a/submodule.h
+++ b/submodule.h
@@ -36,5 +36,6 @@ int merge_submodule(unsigned char result[20], const char *path, const unsigned c
 int find_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name,
 		struct string_list *needs_pushing);
 int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
+void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);

 #endif
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 15c18b6..b99177f 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -293,4 +293,23 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm
 	git diff-files --quiet
 '

+test_expect_success 'git mv moves a submodule with gitfile' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	(
+		cd mod &&
+		git mv ../sub/ .
+	) &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
 test_done
-- 
1.8.4.rc0.199.g7079aac

^ permalink raw reply related	[relevance 9%]

* [PATCH v3 1/5] Teach mv to move submodules together with their work trees
  2013-07-30 19:48  6% [PATCH v3 0/5] Teach mv to move submodules Jens Lehmann
@ 2013-07-30 19:49 10% ` Jens Lehmann
  2013-07-30 19:50  9% ` [PATCH v3 2/5] Teach mv to move submodules using a gitfile Jens Lehmann
  2013-07-30 19:51  8% ` [PATCH v3 4/5] Teach mv to update the path entry in .gitmodules for moved submodules Jens Lehmann
  2 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-07-30 19:49 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Junio C Hamano, Heiko Voigt, Nguyen Thai Ngoc Duy

Currently the attempt to use "git mv" on a submodule errors out with:
  fatal: source directory is empty, source=<src>, destination=<dest>
The reason is that mv searches for the submodule with a trailing slash in
the index, which it doesn't find (because it is stored without a trailing
slash). As it doesn't find any index entries inside the submodule it
claims the directory would be empty even though it isn't.

Fix that by searching for the name without a trailing slash and continue
if it is a submodule. Then rename() will move the submodule work tree just
like it moves a file.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
 builtin/mv.c  | 99 +++++++++++++++++++++++++++++++----------------------------
 t/t7001-mv.sh | 34 ++++++++++++++++++++
 2 files changed, 86 insertions(+), 47 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 16ce99b..1d3ef63 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -118,55 +118,60 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				&& lstat(dst, &st) == 0)
 			bad = _("cannot move directory over file");
 		else if (src_is_dir) {
-			const char *src_w_slash = add_slash(src);
-			int len_w_slash = length + 1;
-			int first, last;
-
-			modes[i] = WORKING_DIRECTORY;
-
-			first = cache_name_pos(src_w_slash, len_w_slash);
-			if (first >= 0)
-				die (_("Huh? %.*s is in index?"),
-						len_w_slash, src_w_slash);
-
-			first = -1 - first;
-			for (last = first; last < active_nr; last++) {
-				const char *path = active_cache[last]->name;
-				if (strncmp(path, src_w_slash, len_w_slash))
-					break;
-			}
-			free((char *)src_w_slash);
-
-			if (last - first < 1)
-				bad = _("source directory is empty");
-			else {
-				int j, dst_len;
-
-				if (last - first > 0) {
-					source = xrealloc(source,
-							(argc + last - first)
-							* sizeof(char *));
-					destination = xrealloc(destination,
-							(argc + last - first)
-							* sizeof(char *));
-					modes = xrealloc(modes,
-							(argc + last - first)
-							* sizeof(enum update_mode));
+			int first = cache_name_pos(src, length);
+			if (first >= 0) {
+				if (!S_ISGITLINK(active_cache[first]->ce_mode))
+					die (_("Huh? Directory %s is in index and no submodule?"), src);
+			} else {
+				const char *src_w_slash = add_slash(src);
+				int last, len_w_slash = length + 1;
+
+				modes[i] = WORKING_DIRECTORY;
+
+				first = cache_name_pos(src_w_slash, len_w_slash);
+				if (first >= 0)
+					die (_("Huh? %.*s is in index?"),
+							len_w_slash, src_w_slash);
+
+				first = -1 - first;
+				for (last = first; last < active_nr; last++) {
+					const char *path = active_cache[last]->name;
+					if (strncmp(path, src_w_slash, len_w_slash))
+						break;
 				}
-
-				dst = add_slash(dst);
-				dst_len = strlen(dst);
-
-				for (j = 0; j < last - first; j++) {
-					const char *path =
-						active_cache[first + j]->name;
-					source[argc + j] = path;
-					destination[argc + j] =
-						prefix_path(dst, dst_len,
-							path + length + 1);
-					modes[argc + j] = INDEX;
+				free((char *)src_w_slash);
+
+				if (last - first < 1)
+					bad = _("source directory is empty");
+				else {
+					int j, dst_len;
+
+					if (last - first > 0) {
+						source = xrealloc(source,
+								(argc + last - first)
+								* sizeof(char *));
+						destination = xrealloc(destination,
+								(argc + last - first)
+								* sizeof(char *));
+						modes = xrealloc(modes,
+								(argc + last - first)
+								* sizeof(enum update_mode));
+					}
+
+					dst = add_slash(dst);
+					dst_len = strlen(dst);
+
+					for (j = 0; j < last - first; j++) {
+						const char *path =
+							active_cache[first + j]->name;
+						source[argc + j] = path;
+						destination[argc + j] =
+							prefix_path(dst, dst_len,
+								path + length + 1);
+						modes[argc + j] = INDEX;
+					}
+					argc += last - first;
 				}
-				argc += last - first;
 			}
 		} else if (cache_name_pos(src, length) < 0)
 			bad = _("not under version control");
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 101816e..15c18b6 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -259,4 +259,38 @@ test_expect_success SYMLINKS 'check moved symlink' '

 rm -f moved symlink

+test_expect_success 'setup submodule' '
+	git commit -m initial &&
+	git reset --hard &&
+	git submodule add ./. sub &&
+	echo content >file &&
+	git add file &&
+	git commit -m "added sub and file"
+'
+
+test_expect_success 'git mv cannot move a submodule in a file' '
+	test_must_fail git mv sub file
+'
+
+test_expect_success 'git mv moves a submodule with a .git directory and no .gitmodules' '
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	git rm .gitmodules &&
+	(
+		cd sub &&
+		rm -f .git &&
+		cp -a ../.git/modules/sub .git &&
+		GIT_WORK_TREE=. git config --unset core.worktree
+	) &&
+	mkdir mod &&
+	git mv sub mod/sub &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
 test_done
-- 
1.8.4.rc0.199.g7079aac

^ permalink raw reply related	[relevance 10%]

* [PATCH v3 0/5] Teach mv to move submodules
@ 2013-07-30 19:48  6% Jens Lehmann
  2013-07-30 19:49 10% ` [PATCH v3 1/5] Teach mv to move submodules together with their work trees Jens Lehmann
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Jens Lehmann @ 2013-07-30 19:48 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Junio C Hamano, Heiko Voigt, Nguyen Thai Ngoc Duy

Here is my third iteration of this series.

Changes to v2 are:

- I resolved the conflict with Duy's pathspec series by replacing the
  use of common_prefix() with relative_path().

- I separated the functions checking for modified unstaged .gitmodules
  and staging the changes to that file into another commit, as they
  are used by both mv and rm.

- mv and rm now die with the message "Please, stage your changes to
  .gitmodules or stash them to proceed" instead of changing and
  staging a .gitmodules file containing other unstaged modifications.

- Man pages for mv and rm are updated to tell the user what they do
  with the gitlink and the .gitmodules file in case of submodules.

- Minor changes according to the last review (typos and a bit more
  efficient coding).

This series applies cleanly on current pu (and I also ran t3600 and
t7001 manually to make sure I don't hit the silent breakage my last
series showed when I ran the whole test suite).

Jens Lehmann (5):
  Teach mv to move submodules together with their work trees
  Teach mv to move submodules using a gitfile
  submodule.c: add .gitmodules staging helper functions
  Teach mv to update the path entry in .gitmodules for moved submodules
  rm: delete .gitmodules entry of submodules removed from the work tree

 Documentation/git-mv.txt   |  10 ++-
 Documentation/git-rm.txt   |   8 ++-
 builtin/mv.c               | 126 ++++++++++++++++++++++----------------
 builtin/rm.c               |  19 +++++-
 submodule.c                | 147 +++++++++++++++++++++++++++++++++++++++++++++
 submodule.h                |   5 ++
 t/t3600-rm.sh              |  98 ++++++++++++++++++++++++++++--
 t/t7001-mv.sh              | 128 +++++++++++++++++++++++++++++++++++++++
 t/t7400-submodule-basic.sh |  14 ++---
 t/t7610-mergetool.sh       |   6 +-
 10 files changed, 484 insertions(+), 77 deletions(-)

-- 
1.8.4.rc0.199.g7079aac

^ permalink raw reply	[relevance 6%]

* Re: What's cooking in git.git (Jul 2013, #07; Sun, 21)
  @ 2013-07-28 17:23  5%       ` Jens Lehmann
  0 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-07-28 17:23 UTC (permalink / raw)
  To: Duy Nguyen; +Cc: Junio C Hamano, Git Mailing List

Am 22.07.2013 22:47, schrieb Jens Lehmann:
> Am 22.07.2013 09:48, schrieb Duy Nguyen:
>> On Mon, Jul 22, 2013 at 2:32 PM, Jens Lehmann <Jens.Lehmann@web.de> wrote:
>>> Am 22.07.2013 08:57, schrieb Junio C Hamano:
>>>> * jl/submodule-mv (2013-04-23) 5 commits
>>>>  . submodule.c: duplicate real_path's return value
>>>>  . rm: delete .gitmodules entry of submodules removed from the work tree
>>>>  . Teach mv to update the path entry in .gitmodules for moved submodules
>>>>  . Teach mv to move submodules using a gitfile
>>>>  . Teach mv to move submodules together with their work trees
>>>>
>>>>  "git mv A B" when moving a submodule A does "the right thing",
>>>>  inclusing relocating its working tree and adjusting the paths in
>>>>  the .gitmodules file.
>>>>
>>>>  Ejected from 'pu', as it conflicts with nd/magic-pathspec.
>>>
>>> So I'll base my upcoming re-roll on pu, right?
>>
>> The conflicted part is the use of common_prefix. I think you might be
>> able to avoid the conflict by using quote.c:path_relative() instead of
>> common_prefix() and prepending "../" manually. Or not, I did not read
>> path_relative() carefully, nor your connect_work_tree_and_git_dir().
> 
> Thanks for the pointers, I'll look into that.

Yup, relative_path() seems to be the solution here (and makes the
connect_work_tree_and_git_dir() function much shorter :-).

What worries me is that even though t7001 breaks because of this
conflict (just like it should) when run inside the t directory by
itself, the prove and normal test runs did not report any failures.
I have no idea what is going on here ...

^ permalink raw reply	[relevance 5%]

* [PATCH v2 00/10] Increase test coverage on Windows by removing SYMLINKS from many tests
  2013-06-01  9:34  4% [PATCH 00/11] Increase test coverage on Windows by removing SYMLINKS from many tests Johannes Sixt
  2013-06-01  9:34  4% ` [PATCH 05/11] tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases) Johannes Sixt
@ 2013-06-07 20:53  4% ` Johannes Sixt
  2013-06-07 20:53  5%   ` [PATCH v2 04/10] tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases) Johannes Sixt
  1 sibling, 1 reply; 200+ results
From: Johannes Sixt @ 2013-06-07 20:53 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Ramkumar Ramachandra

Many tests that involve symbolic links actually check only whether our
algorithms are correct by investigating the contents of the object
database and the index. Only some of them check the filesystem.

This series introduces a function test_ln_s_add that inserts a symbolic
link in the index even if the filesystem does not support symbolic links.
By using this function, many more tests can be run when the filesystem
does not have symblic links, aka Windows.

Changes since v1:

- Ripped out test_ln_s and corresponding conversions; they were dubious.

- There are no changes to t2100 anymore; the corresponding modernization
  patch is gone.

- Moved the t4011 change from the "trivial cases" to its own patch.
  It still contains the effects of the former test_ln_s, but open-coded
  and with a comment.

Johannes Sixt (10):
  test-chmtime: Fix exit code on Windows
  t3010: modernize style
  tests: introduce test_ln_s_add
  tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial
    cases)
  t0000: use test_ln_s_add to remove SYMLINKS prerequisite
  t3030: use test_ln_s_add to remove SYMLINKS prerequisite
  t3100: use test_ln_s_add to remove SYMLINKS prerequisite
  t3509, t4023, t4114: use test_ln_s_add to remove SYMLINKS prerequisite
  t6035: use test_ln_s_add to remove SYMLINKS prerequisite
  t4011: remove SYMLINKS prerequisite

 t/README                               |  14 ++++
 t/t0000-basic.sh                       |  39 +++--------
 t/t1004-read-tree-m-u-wf.sh            |   7 +-
 t/t2001-checkout-cache-clash.sh        |   7 +-
 t/t2004-checkout-cache-temp.sh         |   5 +-
 t/t2007-checkout-symlink.sh            |  12 ++--
 t/t2021-checkout-overwrite.sh          |  12 ++--
 t/t2200-add-update.sh                  |   5 +-
 t/t3010-ls-files-killed-modified.sh    | 118 ++++++++++++++++-----------------
 t/t3030-merge-recursive.sh             |  62 ++++++++---------
 t/t3100-ls-tree-restrict.sh            |  42 +++++-------
 t/t3509-cherry-pick-merge-df.sh        |  12 ++--
 t/t3700-add.sh                         |  15 ++---
 t/t3903-stash.sh                       |  39 ++++++++---
 t/t4008-diff-break-rewrite.sh          |  12 ++--
 t/t4011-diff-symlink.sh                |  35 +++++++---
 t/t4023-diff-rename-typechange.sh      |  28 ++++----
 t/t4030-diff-textconv.sh               |   8 +--
 t/t4114-apply-typechange.sh            |  29 ++++----
 t/t4115-apply-symlink.sh               |  10 ++-
 t/t4122-apply-symlink-inside.sh        |   8 +--
 t/t6035-merge-dir-to-symlink.sh        |  73 ++++++++++++--------
 t/t7001-mv.sh                          |  18 +++--
 t/t7607-merge-overwrite.sh             |   5 +-
 t/t8006-blame-textconv.sh              |  14 ++--
 t/t8007-cat-file-textconv.sh           |  10 ++-
 t/t9350-fast-export.sh                 |   5 +-
 t/t9500-gitweb-standalone-no-errors.sh |  15 ++---
 t/test-lib-functions.sh                |  17 +++++
 test-chmtime.c                         |   8 +--
 30 files changed, 351 insertions(+), 333 deletions(-)

-- 
1.8.3.rc1.32.g8b61cbb

^ permalink raw reply	[relevance 4%]

* [PATCH v2 04/10] tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases)
  2013-06-07 20:53  4% ` [PATCH v2 00/10] Increase test coverage on Windows by removing SYMLINKS from many tests Johannes Sixt
@ 2013-06-07 20:53  5%   ` Johannes Sixt
  0 siblings, 0 replies; 200+ results
From: Johannes Sixt @ 2013-06-07 20:53 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Ramkumar Ramachandra

There are many instances where the treatment of symbolic links in the
object model and the algorithms are tested, but where it is not
necessary to actually have a symbolic link in the worktree. Make
adjustments to the tests and remove the SYMLINKS prerequisite when
appropriate in trivial cases, where "trivial" means:

- merely a replacement of 'ln -s a b && git add b' by test_ln_s_add
  is needed;

- a test for symbolic link on the file system can be split off (and
  remains protected by SYMLINKS);

- existing code is equivalent to test_ln_s_add.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
 t/t1004-read-tree-m-u-wf.sh            |  7 +++---
 t/t2001-checkout-cache-clash.sh        |  7 +++---
 t/t2004-checkout-cache-temp.sh         |  5 ++---
 t/t2007-checkout-symlink.sh            | 12 +++++------
 t/t2021-checkout-overwrite.sh          | 12 +++++++----
 t/t2200-add-update.sh                  |  5 ++---
 t/t3010-ls-files-killed-modified.sh    |  9 ++------
 t/t3700-add.sh                         | 15 ++++++-------
 t/t3903-stash.sh                       | 39 ++++++++++++++++++++++++----------
 t/t4008-diff-break-rewrite.sh          | 12 +++++------
 t/t4030-diff-textconv.sh               |  8 +++----
 t/t4115-apply-symlink.sh               | 10 ++++-----
 t/t4122-apply-symlink-inside.sh        |  8 +++----
 t/t7001-mv.sh                          | 18 ++++++++++------
 t/t7607-merge-overwrite.sh             |  5 ++---
 t/t8006-blame-textconv.sh              | 14 +++++-------
 t/t8007-cat-file-textconv.sh           | 10 ++++-----
 t/t9350-fast-export.sh                 |  5 ++---
 t/t9500-gitweb-standalone-no-errors.sh | 15 +++++--------
 19 files changed, 106 insertions(+), 110 deletions(-)

diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh
index b3ae7d5..3e72aff 100755
--- a/t/t1004-read-tree-m-u-wf.sh
+++ b/t/t1004-read-tree-m-u-wf.sh
@@ -158,7 +158,7 @@ test_expect_success '3-way not overwriting local changes (their side)' '
 
 '
 
-test_expect_success SYMLINKS 'funny symlink in work tree' '
+test_expect_success 'funny symlink in work tree' '
 
 	git reset --hard &&
 	git checkout -b sym-b side-b &&
@@ -170,15 +170,14 @@ test_expect_success SYMLINKS 'funny symlink in work tree' '
 	rm -fr a &&
 	git checkout -b sym-a side-a &&
 	mkdir -p a &&
-	ln -s ../b a/b &&
-	git add a/b &&
+	test_ln_s_add ../b a/b &&
 	git commit -m "we add a/b" &&
 
 	read_tree_u_must_succeed -m -u sym-a sym-a sym-b
 
 '
 
-test_expect_success SYMLINKS,SANITY 'funny symlink in work tree, un-unlink-able' '
+test_expect_success SANITY 'funny symlink in work tree, un-unlink-able' '
 
 	rm -fr a b &&
 	git reset --hard &&
diff --git a/t/t2001-checkout-cache-clash.sh b/t/t2001-checkout-cache-clash.sh
index 98aa73e..1fc8e63 100755
--- a/t/t2001-checkout-cache-clash.sh
+++ b/t/t2001-checkout-cache-clash.sh
@@ -59,10 +59,9 @@ test_expect_success \
     'git read-tree -m $tree1 && git checkout-index -f -a'
 test_debug 'show_files $tree1'
 
-test_expect_success SYMLINKS \
-    'git update-index --add a symlink.' \
-    'ln -s path0 path1 &&
-     git update-index --add path1'
+test_expect_success \
+    'add a symlink' \
+    'test_ln_s_add path0 path1'
 test_expect_success \
     'writing tree out with git write-tree' \
     'tree3=$(git write-tree)'
diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh
index 0f4b289..f171a55 100755
--- a/t/t2004-checkout-cache-temp.sh
+++ b/t/t2004-checkout-cache-temp.sh
@@ -194,11 +194,10 @@ test_expect_success \
  test $(cat ../$s1) = tree1asubdir/path5)
 )'
 
-test_expect_success SYMLINKS \
+test_expect_success \
 'checkout --temp symlink' '
 rm -f path* .merge_* out .git/index &&
-ln -s b a &&
-git update-index --add a &&
+test_ln_s_add b a &&
 t4=$(git write-tree) &&
 rm -f .git/index &&
 git read-tree $t4 &&
diff --git a/t/t2007-checkout-symlink.sh b/t/t2007-checkout-symlink.sh
index e6f59f1..fc9aad5 100755
--- a/t/t2007-checkout-symlink.sh
+++ b/t/t2007-checkout-symlink.sh
@@ -6,7 +6,7 @@ test_description='git checkout to switch between branches with symlink<->dir'
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
 	mkdir frotz &&
 	echo hello >frotz/filfre &&
@@ -25,25 +25,25 @@ test_expect_success SYMLINKS setup '
 
 	git rm --cached frotz/filfre &&
 	mv frotz xyzzy &&
-	ln -s xyzzy frotz &&
-	git add xyzzy/filfre frotz &&
+	test_ln_s_add xyzzy frotz &&
+	git add xyzzy/filfre &&
 	test_tick &&
 	git commit -m "side moves frotz/ to xyzzy/ and adds frotz->xyzzy/"
 
 '
 
-test_expect_success SYMLINKS 'switch from symlink to dir' '
+test_expect_success 'switch from symlink to dir' '
 
 	git checkout master
 
 '
 
-test_expect_success SYMLINKS 'Remove temporary directories & switch to master' '
+test_expect_success 'Remove temporary directories & switch to master' '
 	rm -fr frotz xyzzy nitfol &&
 	git checkout -f master
 '
 
-test_expect_success SYMLINKS 'switch from dir to symlink' '
+test_expect_success 'switch from dir to symlink' '
 
 	git checkout side
 
diff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh
index 5da63e9..c2ada7d 100755
--- a/t/t2021-checkout-overwrite.sh
+++ b/t/t2021-checkout-overwrite.sh
@@ -29,21 +29,25 @@ test_expect_success 'checkout commit with dir must not remove untracked a/b' '
 	test -f a/b
 '
 
-test_expect_success SYMLINKS 'create a commit where dir a/b changed to symlink' '
+test_expect_success 'create a commit where dir a/b changed to symlink' '
 
 	rm -rf a/b &&	# cleanup if previous test failed
 	git checkout -f -b symlink start &&
 	rm -rf a/b &&
-	ln -s foo a/b &&
 	git add -A &&
+	test_ln_s_add foo a/b &&
 	git commit -m "dir to symlink"
 '
 
-test_expect_success SYMLINKS 'checkout commit with dir must not remove untracked a/b' '
+test_expect_success 'checkout commit with dir must not remove untracked a/b' '
 
 	git rm --cached a/b &&
 	git commit -m "un-track the symlink" &&
-	test_must_fail git checkout start &&
+	test_must_fail git checkout start
+'
+
+test_expect_success SYMLINKS 'the symlink remained' '
+
 	test -h a/b
 '
 
diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh
index b2bd419..9bf2bdf 100755
--- a/t/t2200-add-update.sh
+++ b/t/t2200-add-update.sh
@@ -96,11 +96,10 @@ test_expect_success 'non-limited update in subdir leaves root alone' '
 	test_cmp expect actual
 '
 
-test_expect_success SYMLINKS 'replace a file with a symlink' '
+test_expect_success 'replace a file with a symlink' '
 
 	rm foo &&
-	ln -s top foo &&
-	git add -u -- foo
+	test_ln_s_add top foo
 
 '
 
diff --git a/t/t3010-ls-files-killed-modified.sh b/t/t3010-ls-files-killed-modified.sh
index 2d0ff2d..262e617 100755
--- a/t/t3010-ls-files-killed-modified.sh
+++ b/t/t3010-ls-files-killed-modified.sh
@@ -39,12 +39,7 @@ modified without reporting path9 and path10.
 
 test_expect_success 'git update-index --add to add various paths.' '
 	date >path0 &&
-	if test_have_prereq SYMLINKS
-	then
-		ln -s xyzzy path1
-	else
-		date > path1
-	fi &&
+	test_ln_s_add xyzzy path1 &&
 	mkdir path2 path3 &&
 	date >path2/file2 &&
 	date >path3/file3 &&
@@ -52,7 +47,7 @@ test_expect_success 'git update-index --add to add various paths.' '
 	date >path8 &&
 	: >path9 &&
 	date >path10 &&
-	git update-index --add -- path0 path1 path?/file? path7 path8 path9 path10 &&
+	git update-index --add -- path0 path?/file? path7 path8 path9 path10 &&
 	rm -fr path?	# leave path10 alone
 '
 
diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 874b3a6..aab86e8 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -30,10 +30,9 @@ test_expect_success \
 	 *) echo fail; git ls-files --stage xfoo1; (exit 1);;
 	 esac'
 
-test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success 'git add: filemode=0 should not get confused by symlink' '
 	rm -f xfoo1 &&
-	ln -s foo xfoo1 &&
-	git add xfoo1 &&
+	test_ln_s_add foo xfoo1 &&
 	case "`git ls-files --stage xfoo1`" in
 	120000" "*xfoo1) echo pass;;
 	*) echo fail; git ls-files --stage xfoo1; (exit 1);;
@@ -51,21 +50,19 @@ test_expect_success \
 	 *) echo fail; git ls-files --stage xfoo2; (exit 1);;
 	 esac'
 
-test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success 'git add: filemode=0 should not get confused by symlink' '
 	rm -f xfoo2 &&
-	ln -s foo xfoo2 &&
-	git update-index --add xfoo2 &&
+	test_ln_s_add foo xfoo2 &&
 	case "`git ls-files --stage xfoo2`" in
 	120000" "*xfoo2) echo pass;;
 	*) echo fail; git ls-files --stage xfoo2; (exit 1);;
 	esac
 '
 
-test_expect_success SYMLINKS \
+test_expect_success \
 	'git update-index --add: Test that executable bit is not used...' \
 	'git config core.filemode 0 &&
-	 ln -s xfoo2 xfoo3 &&
-	 git update-index --add xfoo3 &&
+	 test_ln_s_add xfoo2 xfoo3 &&	# runs git update-index --add
 	 case "`git ls-files --stage xfoo3`" in
 	 120000" "*xfoo3) echo pass;;
 	 *) echo fail; git ls-files --stage xfoo3; (exit 1);;
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 5dfbda7..8ff039b 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -336,41 +336,58 @@ test_expect_success SYMLINKS 'stash file to symlink (full stage)' '
 
 # This test creates a commit with a symlink used for the following tests
 
-test_expect_success SYMLINKS 'stash symlink to file' '
+test_expect_success 'stash symlink to file' '
 	git reset --hard &&
-	ln -s file filelink &&
-	git add filelink &&
+	test_ln_s_add file filelink &&
 	git commit -m "Add symlink" &&
 	rm filelink &&
 	cp file filelink &&
-	git stash save "symlink to file" &&
+	git stash save "symlink to file"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
 	test -h filelink &&
-	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
 	git stash apply &&
 	! test -h filelink &&
 	test bar = "$(cat file)"
 '
 
-test_expect_success SYMLINKS 'stash symlink to file (stage rm)' '
+test_expect_success 'stash symlink to file (stage rm)' '
 	git reset --hard &&
 	git rm filelink &&
 	cp file filelink &&
-	git stash save "symlink to file (stage rm)" &&
+	git stash save "symlink to file (stage rm)"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
 	test -h filelink &&
-	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
 	git stash apply &&
 	! test -h filelink &&
 	test bar = "$(cat file)"
 '
 
-test_expect_success SYMLINKS 'stash symlink to file (full stage)' '
+test_expect_success 'stash symlink to file (full stage)' '
 	git reset --hard &&
 	rm filelink &&
 	cp file filelink &&
 	git add filelink &&
-	git stash save "symlink to file (full stage)" &&
+	git stash save "symlink to file (full stage)"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
 	test -h filelink &&
-	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
 	git stash apply &&
 	! test -h filelink &&
 	test bar = "$(cat file)"
diff --git a/t/t4008-diff-break-rewrite.sh b/t/t4008-diff-break-rewrite.sh
index 73b4a24..27e98a8 100755
--- a/t/t4008-diff-break-rewrite.sh
+++ b/t/t4008-diff-break-rewrite.sh
@@ -99,11 +99,11 @@ test_expect_success \
     'validate result of -B -M (#4)' \
     'compare_diff_raw expected current'
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'make file0 into something completely different' \
     'rm -f file0 &&
-     ln -s frotz file0 &&
-     git update-index file0 file1'
+     test_ln_s_add frotz file0 &&
+     git update-index file1'
 
 test_expect_success \
     'run diff with -B' \
@@ -114,7 +114,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100	file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -B (#5)' \
     'compare_diff_raw expected current'
 
@@ -129,7 +129,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 R	file0	file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -B -M (#6)' \
     'compare_diff_raw expected current'
 
@@ -144,7 +144,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M	file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -M (#7)' \
     'compare_diff_raw expected current'
 
diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh
index 53ec330..f75f46f 100755
--- a/t/t4030-diff-textconv.sh
+++ b/t/t4030-diff-textconv.sh
@@ -139,12 +139,10 @@ index 0000000..67be421
 +frotz
 \ No newline at end of file
 EOF
-# make a symlink the hard way that works on symlink-challenged file systems
+
 test_expect_success 'textconv does not act on symlinks' '
-	printf frotz > file &&
-	git add file &&
-	git ls-files -s | sed -e s/100644/120000/ |
-		git update-index --index-info &&
+	rm -f file &&
+	test_ln_s_add frotz file &&
 	git commit -m typechange &&
 	git show >diff &&
 	find_diff <diff >actual &&
diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh
index 7674dd2..872fcda 100755
--- a/t/t4115-apply-symlink.sh
+++ b/t/t4115-apply-symlink.sh
@@ -9,18 +9,16 @@ test_description='git apply symlinks and partial files
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
-	ln -s path1/path2/path3/path4/path5 link1 &&
-	git add link? &&
+	test_ln_s_add path1/path2/path3/path4/path5 link1 &&
 	git commit -m initial &&
 
 	git branch side &&
 
 	rm -f link? &&
 
-	ln -s htap6 link1 &&
-	git update-index link? &&
+	test_ln_s_add htap6 link1 &&
 	git commit -m second &&
 
 	git diff-tree -p HEAD^ HEAD >patch  &&
@@ -37,7 +35,7 @@ test_expect_success SYMLINKS 'apply symlink patch' '
 
 '
 
-test_expect_success SYMLINKS 'apply --index symlink patch' '
+test_expect_success 'apply --index symlink patch' '
 
 	git checkout -f side &&
 	git apply --index patch &&
diff --git a/t/t4122-apply-symlink-inside.sh b/t/t4122-apply-symlink-inside.sh
index 3940737..70b3a06 100755
--- a/t/t4122-apply-symlink-inside.sh
+++ b/t/t4122-apply-symlink-inside.sh
@@ -10,11 +10,11 @@ lecho () {
 	done
 }
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
 	mkdir -p arch/i386/boot arch/x86_64 &&
 	lecho 1 2 3 4 5 >arch/i386/boot/Makefile &&
-	ln -s ../i386/boot arch/x86_64/boot &&
+	test_ln_s_add ../i386/boot arch/x86_64/boot &&
 	git add . &&
 	test_tick &&
 	git commit -m initial &&
@@ -31,7 +31,7 @@ test_expect_success SYMLINKS setup '
 
 '
 
-test_expect_success SYMLINKS apply '
+test_expect_success apply '
 
 	git checkout test &&
 	git diff --exit-code test &&
@@ -40,7 +40,7 @@ test_expect_success SYMLINKS apply '
 
 '
 
-test_expect_success SYMLINKS 'check result' '
+test_expect_success 'check result' '
 
 	git diff --exit-code master &&
 	git diff --exit-code --cached master &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..101816e 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -218,13 +218,13 @@ test_expect_success 'git mv should not change sha1 of moved cache entry' '
 
 rm -f dirty dirty2
 
-test_expect_success SYMLINKS 'git mv should overwrite symlink to a file' '
+test_expect_success 'git mv should overwrite symlink to a file' '
 
 	rm -fr .git &&
 	git init &&
 	echo 1 >moved &&
-	ln -s moved symlink &&
-	git add moved symlink &&
+	test_ln_s_add moved symlink &&
+	git add moved &&
 	test_must_fail git mv moved symlink &&
 	git mv -f moved symlink &&
 	! test -e moved &&
@@ -237,22 +237,26 @@ test_expect_success SYMLINKS 'git mv should overwrite symlink to a file' '
 
 rm -f moved symlink
 
-test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
+test_expect_success 'git mv should overwrite file with a symlink' '
 
 	rm -fr .git &&
 	git init &&
 	echo 1 >moved &&
-	ln -s moved symlink &&
-	git add moved symlink &&
+	test_ln_s_add moved symlink &&
+	git add moved &&
 	test_must_fail git mv symlink moved &&
 	git mv -f symlink moved &&
 	! test -e symlink &&
-	test -h moved &&
 	git update-index --refresh &&
 	git diff-files --quiet
 
 '
 
+test_expect_success SYMLINKS 'check moved symlink' '
+
+	test -h moved
+'
+
 rm -f moved symlink
 
 test_done
diff --git a/t/t7607-merge-overwrite.sh b/t/t7607-merge-overwrite.sh
index 6547eb8..758a623 100755
--- a/t/t7607-merge-overwrite.sh
+++ b/t/t7607-merge-overwrite.sh
@@ -141,11 +141,10 @@ test_expect_success SYMLINKS 'will not overwrite untracked symlink in leading pa
 	test_path_is_missing .git/MERGE_HEAD
 '
 
-test_expect_success SYMLINKS 'will not be confused by symlink in leading path' '
+test_expect_success 'will not be confused by symlink in leading path' '
 	git reset --hard c0 &&
 	rm -rf sub &&
-	ln -s sub2 sub &&
-	git add sub &&
+	test_ln_s_add sub2 sub &&
 	git commit -m ln &&
 	git checkout sub
 '
diff --git a/t/t8006-blame-textconv.sh b/t/t8006-blame-textconv.sh
index bf6caa4..7683515 100755
--- a/t/t8006-blame-textconv.sh
+++ b/t/t8006-blame-textconv.sh
@@ -18,17 +18,13 @@ test_expect_success 'setup ' '
 	echo "bin: test number 0" >zero.bin &&
 	echo "bin: test 1" >one.bin &&
 	echo "bin: test number 2" >two.bin &&
-	if test_have_prereq SYMLINKS; then
-		ln -s one.bin symlink.bin
-	fi &&
+	test_ln_s_add one.bin symlink.bin &&
 	git add . &&
 	GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
 	echo "bin: test 1 version 2" >one.bin &&
 	echo "bin: test number 2 version 2" >>two.bin &&
-	if test_have_prereq SYMLINKS; then
-		rm symlink.bin &&
-		ln -s two.bin symlink.bin
-	fi &&
+	rm -f symlink.bin &&
+	test_ln_s_add two.bin symlink.bin &&
 	GIT_AUTHOR_NAME=Number2 git commit -a -m Second --date="2010-01-01 20:00:00"
 '
 
@@ -135,7 +131,7 @@ test_expect_success SYMLINKS 'blame --textconv (on symlink)' '
 
 # cp two.bin three.bin  and make small tweak
 # (this will direct blame -C -C three.bin to consider two.bin and symlink.bin)
-test_expect_success SYMLINKS 'make another new commit' '
+test_expect_success 'make another new commit' '
 	cat >three.bin <<\EOF &&
 bin: test number 2
 bin: test number 2 version 2
@@ -146,7 +142,7 @@ EOF
 	GIT_AUTHOR_NAME=Number4 git commit -a -m Fourth --date="2010-01-01 23:00:00"
 '
 
-test_expect_success SYMLINKS 'blame on last commit (-C -C, symlink)' '
+test_expect_success 'blame on last commit (-C -C, symlink)' '
 	git blame -C -C three.bin >blame &&
 	find_blame <blame >result &&
 	cat >expected <<\EOF &&
diff --git a/t/t8007-cat-file-textconv.sh b/t/t8007-cat-file-textconv.sh
index 78a0085..b95e102 100755
--- a/t/t8007-cat-file-textconv.sh
+++ b/t/t8007-cat-file-textconv.sh
@@ -12,9 +12,7 @@ chmod +x helper
 
 test_expect_success 'setup ' '
 	echo "bin: test" >one.bin &&
-	if test_have_prereq SYMLINKS; then
-		ln -s one.bin symlink.bin
-	fi &&
+	test_ln_s_add one.bin symlink.bin &&
 	git add . &&
 	GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
 	echo "bin: test version 2" >one.bin &&
@@ -72,14 +70,14 @@ test_expect_success 'cat-file --textconv on previous commit' '
 	test_cmp expected result
 '
 
-test_expect_success SYMLINKS 'cat-file without --textconv (symlink)' '
+test_expect_success 'cat-file without --textconv (symlink)' '
 	git cat-file blob :symlink.bin >result &&
 	printf "%s" "one.bin" >expected
 	test_cmp expected result
 '
 
 
-test_expect_success SYMLINKS 'cat-file --textconv on index (symlink)' '
+test_expect_success 'cat-file --textconv on index (symlink)' '
 	! git cat-file --textconv :symlink.bin 2>result &&
 	cat >expected <<\EOF &&
 fatal: git cat-file --textconv: unable to run textconv on :symlink.bin
@@ -87,7 +85,7 @@ EOF
 	test_cmp expected result
 '
 
-test_expect_success SYMLINKS 'cat-file --textconv on HEAD (symlink)' '
+test_expect_success 'cat-file --textconv on HEAD (symlink)' '
 	! git cat-file --textconv HEAD:symlink.bin 2>result &&
 	cat >expected <<EOF &&
 fatal: git cat-file --textconv: unable to run textconv on HEAD:symlink.bin
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 2471bc6..34c2d8f 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -396,7 +396,7 @@ test_expect_success 'tree_tag-obj'    'git fast-export tree_tag-obj'
 test_expect_success 'tag-obj_tag'     'git fast-export tag-obj_tag'
 test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj'
 
-test_expect_success SYMLINKS 'directory becomes symlink'        '
+test_expect_success 'directory becomes symlink'        '
 	git init dirtosymlink &&
 	git init result &&
 	(
@@ -408,8 +408,7 @@ test_expect_success SYMLINKS 'directory becomes symlink'        '
 		git add foo/world bar/world &&
 		git commit -q -mone &&
 		git rm -r foo &&
-		ln -s bar foo &&
-		git add foo &&
+		test_ln_s_add bar foo &&
 		git commit -q -mtwo
 	) &&
 	(
diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh
index 6783c14..6fca193 100755
--- a/t/t9500-gitweb-standalone-no-errors.sh
+++ b/t/t9500-gitweb-standalone-no-errors.sh
@@ -156,10 +156,10 @@ test_expect_success \
 	 git commit -a -m "File renamed." &&
 	 gitweb_run "p=.git;a=commitdiff"'
 
-test_expect_success SYMLINKS \
+test_expect_success \
 	'commitdiff(0): file to symlink' \
 	'rm renamed_file &&
-	 ln -s file renamed_file &&
+	 test_ln_s_add file renamed_file &&
 	 git commit -a -m "File to symlink." &&
 	 gitweb_run "p=.git;a=commitdiff"'
 
@@ -212,15 +212,14 @@ test_expect_success \
 # ----------------------------------------------------------------------
 # commitdiff testing (taken from t4114-apply-typechange.sh)
 
-test_expect_success SYMLINKS 'setup typechange commits' '
+test_expect_success 'setup typechange commits' '
 	echo "hello world" > foo &&
 	echo "hi planet" > bar &&
 	git update-index --add foo bar &&
 	git commit -m initial &&
 	git branch initial &&
 	rm -f foo &&
-	ln -s bar foo &&
-	git update-index foo &&
+	test_ln_s_add bar foo &&
 	git commit -m "foo symlinked to bar" &&
 	git branch foo-symlinked-to-bar &&
 	rm -f foo &&
@@ -361,11 +360,7 @@ test_expect_success \
 	 echo "Changed" >> 04-rename-to &&
 	 test_chmod +x 05-mode-change &&
 	 rm -f 06-file-or-symlink &&
-	 if test_have_prereq SYMLINKS; then
-		ln -s 01-change 06-file-or-symlink
-	 else
-		printf %s 01-change > 06-file-or-symlink
-	 fi &&
+	 test_ln_s_add 01-change 06-file-or-symlink &&
 	 echo "Changed and have mode changed" > 07-change-mode-change	&&
 	 test_chmod +x 07-change-mode-change &&
 	 git commit -a -m "Large commit" &&
-- 
1.8.3.rc1.32.g8b61cbb

^ permalink raw reply related	[relevance 5%]

* [PATCH 05/11] tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases)
  2013-06-01  9:34  4% [PATCH 00/11] Increase test coverage on Windows by removing SYMLINKS from many tests Johannes Sixt
@ 2013-06-01  9:34  4% ` Johannes Sixt
  2013-06-07 20:53  4% ` [PATCH v2 00/10] Increase test coverage on Windows by removing SYMLINKS from many tests Johannes Sixt
  1 sibling, 0 replies; 200+ results
From: Johannes Sixt @ 2013-06-01  9:34 UTC (permalink / raw)
  To: git

There are many instances where the treatment of symbolic links in the
object model and the algorithms are tested, but where it is not
necessary to actually have a symbolic link in the worktree. Make
adjustments to the tests and remove the SYMLINKS prerequisite when
appropriate in trivial cases, where "trivial" means:

- merely a replacement of 'ln -s a b' to test_ln_s or of
  'ln -s a b && git add b' to test_ln_s_add is needed;

- a test for symbolic link on the file system can be split off (and
  remains protected by SYMLINKS);

- existing code is equivalent to test_ln_s[_add].

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
The changes in t9500-gitweb-* were not tested on a system that does not
have SYMLINKS.

 t/t1004-read-tree-m-u-wf.sh            |  7 +++---
 t/t2001-checkout-cache-clash.sh        |  7 +++---
 t/t2003-checkout-cache-mkdir.sh        |  8 +++----
 t/t2004-checkout-cache-temp.sh         |  5 ++---
 t/t2007-checkout-symlink.sh            | 12 +++++------
 t/t2021-checkout-overwrite.sh          | 12 +++++++----
 t/t2200-add-update.sh                  |  5 ++---
 t/t3000-ls-files-others.sh             |  7 +-----
 t/t3010-ls-files-killed-modified.sh    | 19 ++++-------------
 t/t3700-add.sh                         | 15 ++++++-------
 t/t3903-stash.sh                       | 39 ++++++++++++++++++++++++----------
 t/t4008-diff-break-rewrite.sh          | 12 +++++------
 t/t4011-diff-symlink.sh                | 23 +++++++++++---------
 t/t4030-diff-textconv.sh               |  8 +++----
 t/t4115-apply-symlink.sh               | 10 ++++-----
 t/t4122-apply-symlink-inside.sh        |  8 +++----
 t/t7001-mv.sh                          | 18 ++++++++++------
 t/t7607-merge-overwrite.sh             |  5 ++---
 t/t8006-blame-textconv.sh              | 14 +++++-------
 t/t8007-cat-file-textconv.sh           | 10 ++++-----
 t/t9350-fast-export.sh                 |  5 ++---
 t/t9500-gitweb-standalone-no-errors.sh | 15 +++++--------
 22 files changed, 126 insertions(+), 138 deletions(-)

diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh
index b3ae7d5..3e72aff 100755
--- a/t/t1004-read-tree-m-u-wf.sh
+++ b/t/t1004-read-tree-m-u-wf.sh
@@ -158,7 +158,7 @@ test_expect_success '3-way not overwriting local changes (their side)' '
 
 '
 
-test_expect_success SYMLINKS 'funny symlink in work tree' '
+test_expect_success 'funny symlink in work tree' '
 
 	git reset --hard &&
 	git checkout -b sym-b side-b &&
@@ -170,15 +170,14 @@ test_expect_success SYMLINKS 'funny symlink in work tree' '
 	rm -fr a &&
 	git checkout -b sym-a side-a &&
 	mkdir -p a &&
-	ln -s ../b a/b &&
-	git add a/b &&
+	test_ln_s_add ../b a/b &&
 	git commit -m "we add a/b" &&
 
 	read_tree_u_must_succeed -m -u sym-a sym-a sym-b
 
 '
 
-test_expect_success SYMLINKS,SANITY 'funny symlink in work tree, un-unlink-able' '
+test_expect_success SANITY 'funny symlink in work tree, un-unlink-able' '
 
 	rm -fr a b &&
 	git reset --hard &&
diff --git a/t/t2001-checkout-cache-clash.sh b/t/t2001-checkout-cache-clash.sh
index 98aa73e..1fc8e63 100755
--- a/t/t2001-checkout-cache-clash.sh
+++ b/t/t2001-checkout-cache-clash.sh
@@ -59,10 +59,9 @@ test_expect_success \
     'git read-tree -m $tree1 && git checkout-index -f -a'
 test_debug 'show_files $tree1'
 
-test_expect_success SYMLINKS \
-    'git update-index --add a symlink.' \
-    'ln -s path0 path1 &&
-     git update-index --add path1'
+test_expect_success \
+    'add a symlink' \
+    'test_ln_s_add path0 path1'
 test_expect_success \
     'writing tree out with git write-tree' \
     'tree3=$(git write-tree)'
diff --git a/t/t2003-checkout-cache-mkdir.sh b/t/t2003-checkout-cache-mkdir.sh
index ff163cf..bd17ba2 100755
--- a/t/t2003-checkout-cache-mkdir.sh
+++ b/t/t2003-checkout-cache-mkdir.sh
@@ -19,10 +19,10 @@ test_expect_success 'setup' '
 	git update-index --add path0 path1/file1
 '
 
-test_expect_success SYMLINKS 'have symlink in place where dir is expected.' '
+test_expect_success 'have symlink in place where dir is expected.' '
 	rm -fr path0 path1 &&
 	mkdir path2 &&
-	ln -s path2 path1 &&
+	test_ln_s path2 path1 &&
 	git checkout-index -f -a &&
 	test ! -h path1 && test -d path1 &&
 	test -f path1/file1 && test ! -f path2/file1
@@ -79,10 +79,10 @@ test_expect_success SYMLINKS 'use --prefix=tmp/orary- where tmp is a symlink' '
 	test -h tmp
 '
 
-test_expect_success SYMLINKS 'use --prefix=tmp- where tmp-path1 is a symlink' '
+test_expect_success 'use --prefix=tmp- where tmp-path1 is a symlink' '
 	rm -fr path0 path1 path2 tmp* &&
 	mkdir tmp1 &&
-	ln -s tmp1 tmp-path1 &&
+	test_ln_s tmp1 tmp-path1 &&
 	git checkout-index --prefix=tmp- -f -a &&
 	test -f tmp-path0 &&
 	test ! -h tmp-path1 &&
diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh
index 0f4b289..f171a55 100755
--- a/t/t2004-checkout-cache-temp.sh
+++ b/t/t2004-checkout-cache-temp.sh
@@ -194,11 +194,10 @@ test_expect_success \
  test $(cat ../$s1) = tree1asubdir/path5)
 )'
 
-test_expect_success SYMLINKS \
+test_expect_success \
 'checkout --temp symlink' '
 rm -f path* .merge_* out .git/index &&
-ln -s b a &&
-git update-index --add a &&
+test_ln_s_add b a &&
 t4=$(git write-tree) &&
 rm -f .git/index &&
 git read-tree $t4 &&
diff --git a/t/t2007-checkout-symlink.sh b/t/t2007-checkout-symlink.sh
index e6f59f1..fc9aad5 100755
--- a/t/t2007-checkout-symlink.sh
+++ b/t/t2007-checkout-symlink.sh
@@ -6,7 +6,7 @@ test_description='git checkout to switch between branches with symlink<->dir'
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
 	mkdir frotz &&
 	echo hello >frotz/filfre &&
@@ -25,25 +25,25 @@ test_expect_success SYMLINKS setup '
 
 	git rm --cached frotz/filfre &&
 	mv frotz xyzzy &&
-	ln -s xyzzy frotz &&
-	git add xyzzy/filfre frotz &&
+	test_ln_s_add xyzzy frotz &&
+	git add xyzzy/filfre &&
 	test_tick &&
 	git commit -m "side moves frotz/ to xyzzy/ and adds frotz->xyzzy/"
 
 '
 
-test_expect_success SYMLINKS 'switch from symlink to dir' '
+test_expect_success 'switch from symlink to dir' '
 
 	git checkout master
 
 '
 
-test_expect_success SYMLINKS 'Remove temporary directories & switch to master' '
+test_expect_success 'Remove temporary directories & switch to master' '
 	rm -fr frotz xyzzy nitfol &&
 	git checkout -f master
 '
 
-test_expect_success SYMLINKS 'switch from dir to symlink' '
+test_expect_success 'switch from dir to symlink' '
 
 	git checkout side
 
diff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh
index 5da63e9..c2ada7d 100755
--- a/t/t2021-checkout-overwrite.sh
+++ b/t/t2021-checkout-overwrite.sh
@@ -29,21 +29,25 @@ test_expect_success 'checkout commit with dir must not remove untracked a/b' '
 	test -f a/b
 '
 
-test_expect_success SYMLINKS 'create a commit where dir a/b changed to symlink' '
+test_expect_success 'create a commit where dir a/b changed to symlink' '
 
 	rm -rf a/b &&	# cleanup if previous test failed
 	git checkout -f -b symlink start &&
 	rm -rf a/b &&
-	ln -s foo a/b &&
 	git add -A &&
+	test_ln_s_add foo a/b &&
 	git commit -m "dir to symlink"
 '
 
-test_expect_success SYMLINKS 'checkout commit with dir must not remove untracked a/b' '
+test_expect_success 'checkout commit with dir must not remove untracked a/b' '
 
 	git rm --cached a/b &&
 	git commit -m "un-track the symlink" &&
-	test_must_fail git checkout start &&
+	test_must_fail git checkout start
+'
+
+test_expect_success SYMLINKS 'the symlink remained' '
+
 	test -h a/b
 '
 
diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh
index b2bd419..9bf2bdf 100755
--- a/t/t2200-add-update.sh
+++ b/t/t2200-add-update.sh
@@ -96,11 +96,10 @@ test_expect_success 'non-limited update in subdir leaves root alone' '
 	test_cmp expect actual
 '
 
-test_expect_success SYMLINKS 'replace a file with a symlink' '
+test_expect_success 'replace a file with a symlink' '
 
 	rm foo &&
-	ln -s top foo &&
-	git add -u -- foo
+	test_ln_s_add top foo
 
 '
 
diff --git a/t/t3000-ls-files-others.sh b/t/t3000-ls-files-others.sh
index 88be904..563ac7f 100755
--- a/t/t3000-ls-files-others.sh
+++ b/t/t3000-ls-files-others.sh
@@ -19,12 +19,7 @@ filesystem.
 
 test_expect_success 'setup ' '
 	date >path0 &&
-	if test_have_prereq SYMLINKS
-	then
-		ln -s xyzzy path1
-	else
-		date >path1
-	fi &&
+	test_ln_s xyzzy path1 &&
 	mkdir path2 path3 path4 &&
 	date >path2/file2 &&
 	date >path2-junk &&
diff --git a/t/t3010-ls-files-killed-modified.sh b/t/t3010-ls-files-killed-modified.sh
index 2d0ff2d..310e0a2 100755
--- a/t/t3010-ls-files-killed-modified.sh
+++ b/t/t3010-ls-files-killed-modified.sh
@@ -39,12 +39,7 @@ modified without reporting path9 and path10.
 
 test_expect_success 'git update-index --add to add various paths.' '
 	date >path0 &&
-	if test_have_prereq SYMLINKS
-	then
-		ln -s xyzzy path1
-	else
-		date > path1
-	fi &&
+	test_ln_s_add xyzzy path1 &&
 	mkdir path2 path3 &&
 	date >path2/file2 &&
 	date >path3/file3 &&
@@ -52,20 +47,14 @@ test_expect_success 'git update-index --add to add various paths.' '
 	date >path8 &&
 	: >path9 &&
 	date >path10 &&
-	git update-index --add -- path0 path1 path?/file? path7 path8 path9 path10 &&
+	git update-index --add -- path0 path?/file? path7 path8 path9 path10 &&
 	rm -fr path?	# leave path10 alone
 '
 
 test_expect_success 'git ls-files -k to show killed files.' '
 	date >path2 &&
-	if test_have_prereq SYMLINKS
-	then
-		ln -s frotz path3 &&
-		ln -s nitfol path5
-	else
-		date >path3 &&
-		date >path5
-	fi &&
+	test_ln_s frotz path3 &&
+	test_ln_s nitfol path5 &&
 	mkdir path0 path1 path6 &&
 	date >path0/file0 &&
 	date >path1/file1 &&
diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 874b3a6..aab86e8 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -30,10 +30,9 @@ test_expect_success \
 	 *) echo fail; git ls-files --stage xfoo1; (exit 1);;
 	 esac'
 
-test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success 'git add: filemode=0 should not get confused by symlink' '
 	rm -f xfoo1 &&
-	ln -s foo xfoo1 &&
-	git add xfoo1 &&
+	test_ln_s_add foo xfoo1 &&
 	case "`git ls-files --stage xfoo1`" in
 	120000" "*xfoo1) echo pass;;
 	*) echo fail; git ls-files --stage xfoo1; (exit 1);;
@@ -51,21 +50,19 @@ test_expect_success \
 	 *) echo fail; git ls-files --stage xfoo2; (exit 1);;
 	 esac'
 
-test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success 'git add: filemode=0 should not get confused by symlink' '
 	rm -f xfoo2 &&
-	ln -s foo xfoo2 &&
-	git update-index --add xfoo2 &&
+	test_ln_s_add foo xfoo2 &&
 	case "`git ls-files --stage xfoo2`" in
 	120000" "*xfoo2) echo pass;;
 	*) echo fail; git ls-files --stage xfoo2; (exit 1);;
 	esac
 '
 
-test_expect_success SYMLINKS \
+test_expect_success \
 	'git update-index --add: Test that executable bit is not used...' \
 	'git config core.filemode 0 &&
-	 ln -s xfoo2 xfoo3 &&
-	 git update-index --add xfoo3 &&
+	 test_ln_s_add xfoo2 xfoo3 &&	# runs git update-index --add
 	 case "`git ls-files --stage xfoo3`" in
 	 120000" "*xfoo3) echo pass;;
 	 *) echo fail; git ls-files --stage xfoo3; (exit 1);;
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 5dfbda7..8ff039b 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -336,41 +336,58 @@ test_expect_success SYMLINKS 'stash file to symlink (full stage)' '
 
 # This test creates a commit with a symlink used for the following tests
 
-test_expect_success SYMLINKS 'stash symlink to file' '
+test_expect_success 'stash symlink to file' '
 	git reset --hard &&
-	ln -s file filelink &&
-	git add filelink &&
+	test_ln_s_add file filelink &&
 	git commit -m "Add symlink" &&
 	rm filelink &&
 	cp file filelink &&
-	git stash save "symlink to file" &&
+	git stash save "symlink to file"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
 	test -h filelink &&
-	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
 	git stash apply &&
 	! test -h filelink &&
 	test bar = "$(cat file)"
 '
 
-test_expect_success SYMLINKS 'stash symlink to file (stage rm)' '
+test_expect_success 'stash symlink to file (stage rm)' '
 	git reset --hard &&
 	git rm filelink &&
 	cp file filelink &&
-	git stash save "symlink to file (stage rm)" &&
+	git stash save "symlink to file (stage rm)"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
 	test -h filelink &&
-	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
 	git stash apply &&
 	! test -h filelink &&
 	test bar = "$(cat file)"
 '
 
-test_expect_success SYMLINKS 'stash symlink to file (full stage)' '
+test_expect_success 'stash symlink to file (full stage)' '
 	git reset --hard &&
 	rm filelink &&
 	cp file filelink &&
 	git add filelink &&
-	git stash save "symlink to file (full stage)" &&
+	git stash save "symlink to file (full stage)"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
 	test -h filelink &&
-	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+	case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
 	git stash apply &&
 	! test -h filelink &&
 	test bar = "$(cat file)"
diff --git a/t/t4008-diff-break-rewrite.sh b/t/t4008-diff-break-rewrite.sh
index 73b4a24..27e98a8 100755
--- a/t/t4008-diff-break-rewrite.sh
+++ b/t/t4008-diff-break-rewrite.sh
@@ -99,11 +99,11 @@ test_expect_success \
     'validate result of -B -M (#4)' \
     'compare_diff_raw expected current'
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'make file0 into something completely different' \
     'rm -f file0 &&
-     ln -s frotz file0 &&
-     git update-index file0 file1'
+     test_ln_s_add frotz file0 &&
+     git update-index file1'
 
 test_expect_success \
     'run diff with -B' \
@@ -114,7 +114,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100	file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -B (#5)' \
     'compare_diff_raw expected current'
 
@@ -129,7 +129,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 R	file0	file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -B -M (#6)' \
     'compare_diff_raw expected current'
 
@@ -144,7 +144,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M	file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -M (#7)' \
     'compare_diff_raw expected current'
 
diff --git a/t/t4011-diff-symlink.sh b/t/t4011-diff-symlink.sh
index f0d5041..3888519 100755
--- a/t/t4011-diff-symlink.sh
+++ b/t/t4011-diff-symlink.sh
@@ -9,7 +9,7 @@ test_description='Test diff of symlinks.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh
 
-test_expect_success SYMLINKS 'diff new symlink and file' '
+test_expect_success 'diff new symlink and file' '
 	cat >expected <<-\EOF &&
 	diff --git a/frotz b/frotz
 	new file mode 120000
@@ -27,22 +27,25 @@ test_expect_success SYMLINKS 'diff new symlink and file' '
 	@@ -0,0 +1 @@
 	+xyzzy
 	EOF
-	ln -s xyzzy frotz &&
-	echo xyzzy >nitfol &&
+
+	# the empty tree
 	git update-index &&
 	tree=$(git write-tree) &&
-	git update-index --add frotz nitfol &&
+
+	test_ln_s_add xyzzy frotz &&
+	echo xyzzy >nitfol &&
+	git update-index --add nitfol &&
 	GIT_DIFF_OPTS=--unified=0 git diff-index -M -p $tree >current &&
 	compare_diff_patch expected current
 '
 
-test_expect_success SYMLINKS 'diff unchanged symlink and file'  '
+test_expect_success 'diff unchanged symlink and file'  '
 	tree=$(git write-tree) &&
 	git update-index frotz nitfol &&
 	test -z "$(git diff-index --name-only $tree)"
 '
 
-test_expect_success SYMLINKS 'diff removed symlink and file' '
+test_expect_success 'diff removed symlink and file' '
 	cat >expected <<-\EOF &&
 	diff --git a/frotz b/frotz
 	deleted file mode 120000
@@ -66,12 +69,12 @@ test_expect_success SYMLINKS 'diff removed symlink and file' '
 	compare_diff_patch expected current
 '
 
-test_expect_success SYMLINKS 'diff identical, but newly created symlink and file' '
+test_expect_success 'diff identical, but newly created symlink and file' '
 	>expected &&
 	rm -f frotz nitfol &&
 	echo xyzzy >nitfol &&
 	test-chmtime +10 nitfol &&
-	ln -s xyzzy frotz &&
+	test_ln_s xyzzy frotz &&
 	git diff-index -M -p $tree >current &&
 	compare_diff_patch expected current &&
 
@@ -80,7 +83,7 @@ test_expect_success SYMLINKS 'diff identical, but newly created symlink and file
 	compare_diff_patch expected current
 '
 
-test_expect_success SYMLINKS 'diff different symlink and file' '
+test_expect_success 'diff different symlink and file' '
 	cat >expected <<-\EOF &&
 	diff --git a/frotz b/frotz
 	index 7c465af..df1db54 120000
@@ -100,7 +103,7 @@ test_expect_success SYMLINKS 'diff different symlink and file' '
 	+yxyyz
 	EOF
 	rm -f frotz &&
-	ln -s yxyyz frotz &&
+	test_ln_s yxyyz frotz &&
 	echo yxyyz >nitfol &&
 	git diff-index -M -p $tree >current &&
 	compare_diff_patch expected current
diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh
index 53ec330..f75f46f 100755
--- a/t/t4030-diff-textconv.sh
+++ b/t/t4030-diff-textconv.sh
@@ -139,12 +139,10 @@ index 0000000..67be421
 +frotz
 \ No newline at end of file
 EOF
-# make a symlink the hard way that works on symlink-challenged file systems
+
 test_expect_success 'textconv does not act on symlinks' '
-	printf frotz > file &&
-	git add file &&
-	git ls-files -s | sed -e s/100644/120000/ |
-		git update-index --index-info &&
+	rm -f file &&
+	test_ln_s_add frotz file &&
 	git commit -m typechange &&
 	git show >diff &&
 	find_diff <diff >actual &&
diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh
index 7674dd2..872fcda 100755
--- a/t/t4115-apply-symlink.sh
+++ b/t/t4115-apply-symlink.sh
@@ -9,18 +9,16 @@ test_description='git apply symlinks and partial files
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
-	ln -s path1/path2/path3/path4/path5 link1 &&
-	git add link? &&
+	test_ln_s_add path1/path2/path3/path4/path5 link1 &&
 	git commit -m initial &&
 
 	git branch side &&
 
 	rm -f link? &&
 
-	ln -s htap6 link1 &&
-	git update-index link? &&
+	test_ln_s_add htap6 link1 &&
 	git commit -m second &&
 
 	git diff-tree -p HEAD^ HEAD >patch  &&
@@ -37,7 +35,7 @@ test_expect_success SYMLINKS 'apply symlink patch' '
 
 '
 
-test_expect_success SYMLINKS 'apply --index symlink patch' '
+test_expect_success 'apply --index symlink patch' '
 
 	git checkout -f side &&
 	git apply --index patch &&
diff --git a/t/t4122-apply-symlink-inside.sh b/t/t4122-apply-symlink-inside.sh
index 3940737..70b3a06 100755
--- a/t/t4122-apply-symlink-inside.sh
+++ b/t/t4122-apply-symlink-inside.sh
@@ -10,11 +10,11 @@ lecho () {
 	done
 }
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
 	mkdir -p arch/i386/boot arch/x86_64 &&
 	lecho 1 2 3 4 5 >arch/i386/boot/Makefile &&
-	ln -s ../i386/boot arch/x86_64/boot &&
+	test_ln_s_add ../i386/boot arch/x86_64/boot &&
 	git add . &&
 	test_tick &&
 	git commit -m initial &&
@@ -31,7 +31,7 @@ test_expect_success SYMLINKS setup '
 
 '
 
-test_expect_success SYMLINKS apply '
+test_expect_success apply '
 
 	git checkout test &&
 	git diff --exit-code test &&
@@ -40,7 +40,7 @@ test_expect_success SYMLINKS apply '
 
 '
 
-test_expect_success SYMLINKS 'check result' '
+test_expect_success 'check result' '
 
 	git diff --exit-code master &&
 	git diff --exit-code --cached master &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..101816e 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -218,13 +218,13 @@ test_expect_success 'git mv should not change sha1 of moved cache entry' '
 
 rm -f dirty dirty2
 
-test_expect_success SYMLINKS 'git mv should overwrite symlink to a file' '
+test_expect_success 'git mv should overwrite symlink to a file' '
 
 	rm -fr .git &&
 	git init &&
 	echo 1 >moved &&
-	ln -s moved symlink &&
-	git add moved symlink &&
+	test_ln_s_add moved symlink &&
+	git add moved &&
 	test_must_fail git mv moved symlink &&
 	git mv -f moved symlink &&
 	! test -e moved &&
@@ -237,22 +237,26 @@ test_expect_success SYMLINKS 'git mv should overwrite symlink to a file' '
 
 rm -f moved symlink
 
-test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
+test_expect_success 'git mv should overwrite file with a symlink' '
 
 	rm -fr .git &&
 	git init &&
 	echo 1 >moved &&
-	ln -s moved symlink &&
-	git add moved symlink &&
+	test_ln_s_add moved symlink &&
+	git add moved &&
 	test_must_fail git mv symlink moved &&
 	git mv -f symlink moved &&
 	! test -e symlink &&
-	test -h moved &&
 	git update-index --refresh &&
 	git diff-files --quiet
 
 '
 
+test_expect_success SYMLINKS 'check moved symlink' '
+
+	test -h moved
+'
+
 rm -f moved symlink
 
 test_done
diff --git a/t/t7607-merge-overwrite.sh b/t/t7607-merge-overwrite.sh
index 6547eb8..758a623 100755
--- a/t/t7607-merge-overwrite.sh
+++ b/t/t7607-merge-overwrite.sh
@@ -141,11 +141,10 @@ test_expect_success SYMLINKS 'will not overwrite untracked symlink in leading pa
 	test_path_is_missing .git/MERGE_HEAD
 '
 
-test_expect_success SYMLINKS 'will not be confused by symlink in leading path' '
+test_expect_success 'will not be confused by symlink in leading path' '
 	git reset --hard c0 &&
 	rm -rf sub &&
-	ln -s sub2 sub &&
-	git add sub &&
+	test_ln_s_add sub2 sub &&
 	git commit -m ln &&
 	git checkout sub
 '
diff --git a/t/t8006-blame-textconv.sh b/t/t8006-blame-textconv.sh
index bf6caa4..7683515 100755
--- a/t/t8006-blame-textconv.sh
+++ b/t/t8006-blame-textconv.sh
@@ -18,17 +18,13 @@ test_expect_success 'setup ' '
 	echo "bin: test number 0" >zero.bin &&
 	echo "bin: test 1" >one.bin &&
 	echo "bin: test number 2" >two.bin &&
-	if test_have_prereq SYMLINKS; then
-		ln -s one.bin symlink.bin
-	fi &&
+	test_ln_s_add one.bin symlink.bin &&
 	git add . &&
 	GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
 	echo "bin: test 1 version 2" >one.bin &&
 	echo "bin: test number 2 version 2" >>two.bin &&
-	if test_have_prereq SYMLINKS; then
-		rm symlink.bin &&
-		ln -s two.bin symlink.bin
-	fi &&
+	rm -f symlink.bin &&
+	test_ln_s_add two.bin symlink.bin &&
 	GIT_AUTHOR_NAME=Number2 git commit -a -m Second --date="2010-01-01 20:00:00"
 '
 
@@ -135,7 +131,7 @@ test_expect_success SYMLINKS 'blame --textconv (on symlink)' '
 
 # cp two.bin three.bin  and make small tweak
 # (this will direct blame -C -C three.bin to consider two.bin and symlink.bin)
-test_expect_success SYMLINKS 'make another new commit' '
+test_expect_success 'make another new commit' '
 	cat >three.bin <<\EOF &&
 bin: test number 2
 bin: test number 2 version 2
@@ -146,7 +142,7 @@ EOF
 	GIT_AUTHOR_NAME=Number4 git commit -a -m Fourth --date="2010-01-01 23:00:00"
 '
 
-test_expect_success SYMLINKS 'blame on last commit (-C -C, symlink)' '
+test_expect_success 'blame on last commit (-C -C, symlink)' '
 	git blame -C -C three.bin >blame &&
 	find_blame <blame >result &&
 	cat >expected <<\EOF &&
diff --git a/t/t8007-cat-file-textconv.sh b/t/t8007-cat-file-textconv.sh
index 78a0085..b95e102 100755
--- a/t/t8007-cat-file-textconv.sh
+++ b/t/t8007-cat-file-textconv.sh
@@ -12,9 +12,7 @@ chmod +x helper
 
 test_expect_success 'setup ' '
 	echo "bin: test" >one.bin &&
-	if test_have_prereq SYMLINKS; then
-		ln -s one.bin symlink.bin
-	fi &&
+	test_ln_s_add one.bin symlink.bin &&
 	git add . &&
 	GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
 	echo "bin: test version 2" >one.bin &&
@@ -72,14 +70,14 @@ test_expect_success 'cat-file --textconv on previous commit' '
 	test_cmp expected result
 '
 
-test_expect_success SYMLINKS 'cat-file without --textconv (symlink)' '
+test_expect_success 'cat-file without --textconv (symlink)' '
 	git cat-file blob :symlink.bin >result &&
 	printf "%s" "one.bin" >expected
 	test_cmp expected result
 '
 
 
-test_expect_success SYMLINKS 'cat-file --textconv on index (symlink)' '
+test_expect_success 'cat-file --textconv on index (symlink)' '
 	! git cat-file --textconv :symlink.bin 2>result &&
 	cat >expected <<\EOF &&
 fatal: git cat-file --textconv: unable to run textconv on :symlink.bin
@@ -87,7 +85,7 @@ EOF
 	test_cmp expected result
 '
 
-test_expect_success SYMLINKS 'cat-file --textconv on HEAD (symlink)' '
+test_expect_success 'cat-file --textconv on HEAD (symlink)' '
 	! git cat-file --textconv HEAD:symlink.bin 2>result &&
 	cat >expected <<EOF &&
 fatal: git cat-file --textconv: unable to run textconv on HEAD:symlink.bin
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 2471bc6..34c2d8f 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -396,7 +396,7 @@ test_expect_success 'tree_tag-obj'    'git fast-export tree_tag-obj'
 test_expect_success 'tag-obj_tag'     'git fast-export tag-obj_tag'
 test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj'
 
-test_expect_success SYMLINKS 'directory becomes symlink'        '
+test_expect_success 'directory becomes symlink'        '
 	git init dirtosymlink &&
 	git init result &&
 	(
@@ -408,8 +408,7 @@ test_expect_success SYMLINKS 'directory becomes symlink'        '
 		git add foo/world bar/world &&
 		git commit -q -mone &&
 		git rm -r foo &&
-		ln -s bar foo &&
-		git add foo &&
+		test_ln_s_add bar foo &&
 		git commit -q -mtwo
 	) &&
 	(
diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh
index 6783c14..6fca193 100755
--- a/t/t9500-gitweb-standalone-no-errors.sh
+++ b/t/t9500-gitweb-standalone-no-errors.sh
@@ -156,10 +156,10 @@ test_expect_success \
 	 git commit -a -m "File renamed." &&
 	 gitweb_run "p=.git;a=commitdiff"'
 
-test_expect_success SYMLINKS \
+test_expect_success \
 	'commitdiff(0): file to symlink' \
 	'rm renamed_file &&
-	 ln -s file renamed_file &&
+	 test_ln_s_add file renamed_file &&
 	 git commit -a -m "File to symlink." &&
 	 gitweb_run "p=.git;a=commitdiff"'
 
@@ -212,15 +212,14 @@ test_expect_success \
 # ----------------------------------------------------------------------
 # commitdiff testing (taken from t4114-apply-typechange.sh)
 
-test_expect_success SYMLINKS 'setup typechange commits' '
+test_expect_success 'setup typechange commits' '
 	echo "hello world" > foo &&
 	echo "hi planet" > bar &&
 	git update-index --add foo bar &&
 	git commit -m initial &&
 	git branch initial &&
 	rm -f foo &&
-	ln -s bar foo &&
-	git update-index foo &&
+	test_ln_s_add bar foo &&
 	git commit -m "foo symlinked to bar" &&
 	git branch foo-symlinked-to-bar &&
 	rm -f foo &&
@@ -361,11 +360,7 @@ test_expect_success \
 	 echo "Changed" >> 04-rename-to &&
 	 test_chmod +x 05-mode-change &&
 	 rm -f 06-file-or-symlink &&
-	 if test_have_prereq SYMLINKS; then
-		ln -s 01-change 06-file-or-symlink
-	 else
-		printf %s 01-change > 06-file-or-symlink
-	 fi &&
+	 test_ln_s_add 01-change 06-file-or-symlink &&
 	 echo "Changed and have mode changed" > 07-change-mode-change	&&
 	 test_chmod +x 07-change-mode-change &&
 	 git commit -a -m "Large commit" &&
-- 
1.8.3.rc1.32.g8b61cbb

^ permalink raw reply related	[relevance 4%]

* [PATCH 00/11] Increase test coverage on Windows by removing SYMLINKS from many tests
@ 2013-06-01  9:34  4% Johannes Sixt
  2013-06-01  9:34  4% ` [PATCH 05/11] tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases) Johannes Sixt
  2013-06-07 20:53  4% ` [PATCH v2 00/10] Increase test coverage on Windows by removing SYMLINKS from many tests Johannes Sixt
  0 siblings, 2 replies; 200+ results
From: Johannes Sixt @ 2013-06-01  9:34 UTC (permalink / raw)
  To: git

Many tests that involve symbolic links actually check only whether our
algorithms are correct by investigating the contents of the object
database and the index. Only some of them check the filesystem.

This series introduces a function test_ln_s_add that inserts a symbolic
link in the index even if the filesystem does not support symbolic links.
By using this function, many more tests can be run when the filesystem
does not have symblic links, aka Windows.

The patches touch a number of test files that do not follow the modern
style. But I modernized only the two test files where the subsequent
change to use test_ln_s_add would otherwise be rather inconvenient or
obscure.

Johannes Sixt (11):
  test-chmtime: Fix exit code on Windows
  t2100: modernize style and unroll a loop of test cases
  t3010: modernize style
  tests: introduce test_ln_s and test_ln_s_add
  tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial
    cases)
  t0000: use test_ln_s_add to remove SYMLINKS prerequisite
  t2100: use test_ln_s_add to remove SYMLINKS prerequisite
  t3030: use test_ln_s_add to remove SYMLINKS prerequisite
  t3100: use test_ln_s_add to remove SYMLINKS prerequisite
  t3509, t4023, t4114: use test_ln_s_add to remove SYMLINKS prerequisite
  t6035: use test_ln_s_add to remove SYMLINKS prerequisite

 t/README                               |  17 +++++
 t/t0000-basic.sh                       |  39 +++---------
 t/t1004-read-tree-m-u-wf.sh            |   7 +--
 t/t2001-checkout-cache-clash.sh        |   7 +--
 t/t2003-checkout-cache-mkdir.sh        |   8 +--
 t/t2004-checkout-cache-temp.sh         |   5 +-
 t/t2007-checkout-symlink.sh            |  12 ++--
 t/t2021-checkout-overwrite.sh          |  12 ++--
 t/t2100-update-cache-badpath.sh        |  71 +++++++++++----------
 t/t2200-add-update.sh                  |   5 +-
 t/t3000-ls-files-others.sh             |   7 +--
 t/t3010-ls-files-killed-modified.sh    | 112 +++++++++++++++------------------
 t/t3030-merge-recursive.sh             |  62 ++++++++----------
 t/t3100-ls-tree-restrict.sh            |  42 +++++--------
 t/t3509-cherry-pick-merge-df.sh        |  12 ++--
 t/t3700-add.sh                         |  15 ++---
 t/t3903-stash.sh                       |  39 ++++++++----
 t/t4008-diff-break-rewrite.sh          |  12 ++--
 t/t4011-diff-symlink.sh                |  23 ++++---
 t/t4023-diff-rename-typechange.sh      |  28 ++++-----
 t/t4030-diff-textconv.sh               |   8 +--
 t/t4114-apply-typechange.sh            |  29 +++++----
 t/t4115-apply-symlink.sh               |  10 ++-
 t/t4122-apply-symlink-inside.sh        |   8 +--
 t/t6035-merge-dir-to-symlink.sh        |  73 +++++++++++++--------
 t/t7001-mv.sh                          |  18 +++---
 t/t7607-merge-overwrite.sh             |   5 +-
 t/t8006-blame-textconv.sh              |  14 ++---
 t/t8007-cat-file-textconv.sh           |  10 ++-
 t/t9350-fast-export.sh                 |   5 +-
 t/t9500-gitweb-standalone-no-errors.sh |  15 ++---
 t/test-lib-functions.sh                |  30 +++++++++
 test-chmtime.c                         |   8 +--
 33 files changed, 391 insertions(+), 377 deletions(-)

-- 
1.8.3.rc1.32.g8b61cbb

^ permalink raw reply	[relevance 4%]

* [PATCH v2 2/3] Teach mv to move submodules using a gitfile
  @ 2013-04-10 21:06  9%       ` Jens Lehmann
  0 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-04-10 21:06 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Git Mailing List, Phil Hord, Heiko Voigt, W. Trevor King,
	Peter Collingbourne

When moving a submodule which uses a gitfile to point to the git directory
stored in .git/modules/<name> of the superproject two changes must be made
to make the submodule work: the .git file and the core.worktree setting
must be adjusted to point from work tree to git directory and back.

Achieve that by remembering which submodule uses a gitfile by storing the
result of read_gitfile() of each submodule. If that is not NULL the new
function connect_work_tree_and_git_dir() is called after renaming the
submodule's work tree which updates the two settings to the new values.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---

Am 10.04.2013 18:59, schrieb Jens Lehmann:
> Am 10.04.2013 01:08, schrieb Junio C Hamano:
>> Jens Lehmann <Jens.Lehmann@web.de> writes:
>>
>>> diff --git a/submodule.c b/submodule.c
>>> index 975bc87..eba9b42 100644
>>> --- a/submodule.c
>>> +++ b/submodule.c
>>> @@ -1001,3 +1001,67 @@ int merge_submodule(unsigned char result[20], const char *path,
>>> ...
>>> +	if (!fp)
>>> +		die(_("Could not create git link %s"), gitfile_name.buf);
>>> +	fprintf(fp, gitfile_content.buf);
>>
>> Perhaps.
>>
>> 	fprintf(fp, "%s", gitfile_content.buf);
> 
> Sure. Will fix in v2.

Here we go.


 builtin/mv.c  | 19 ++++++++++++++----
 submodule.c   | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 submodule.h   |  1 +
 t/t7001-mv.sh | 19 ++++++++++++++++++
 4 files changed, 99 insertions(+), 4 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 361028d..609bbb8 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -9,6 +9,7 @@
 #include "cache-tree.h"
 #include "string-list.h"
 #include "parse-options.h"
+#include "submodule.h"

 static const char * const builtin_mv_usage[] = {
 	N_("git mv [options] <source>... <destination>"),
@@ -65,7 +66,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		OPT_BOOLEAN('k', NULL, &ignore_errors, N_("skip move/rename errors")),
 		OPT_END(),
 	};
-	const char **source, **destination, **dest_path;
+	const char **source, **destination, **dest_path, **submodule_gitfile;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
 	struct stat st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
@@ -84,6 +85,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	source = copy_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
 	dest_path = copy_pathspec(prefix, argv + argc, 1, 0);
+	submodule_gitfile = xcalloc(argc, sizeof(char *));

 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
@@ -119,8 +121,14 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		else if (src_is_dir) {
 			int first = cache_name_pos(src, length);
 			if (first >= 0) {
+				struct strbuf submodule_dotgit = STRBUF_INIT;
 				if (!S_ISGITLINK(active_cache[first]->ce_mode))
 					die (_("Huh? Directory %s is in index and no submodule?"), src);
+				strbuf_addf(&submodule_dotgit, "%s/.git", src);
+				submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf);
+				if (submodule_gitfile[i])
+					submodule_gitfile[i] = xstrdup(submodule_gitfile[i]);
+				strbuf_release(&submodule_dotgit);
 			} else {
 				const char *src_w_slash = add_slash(src);
 				int last, len_w_slash = length + 1;
@@ -215,9 +223,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		int pos;
 		if (show_only || verbose)
 			printf(_("Renaming %s to %s\n"), src, dst);
-		if (!show_only && mode != INDEX &&
-				rename(src, dst) < 0 && !ignore_errors)
-			die_errno (_("renaming '%s' failed"), src);
+		if (!show_only && mode != INDEX) {
+			if (rename(src, dst) < 0 && !ignore_errors)
+				die_errno (_("renaming '%s' failed"), src);
+			if (submodule_gitfile[i])
+				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+		}

 		if (mode == WORKING_DIRECTORY)
 			continue;
diff --git a/submodule.c b/submodule.c
index 975bc87..9a3eb85 100644
--- a/submodule.c
+++ b/submodule.c
@@ -1001,3 +1001,67 @@ int merge_submodule(unsigned char result[20], const char *path,
 	free(merges.objects);
 	return 0;
 }
+
+/* Update gitfile and core.worktree setting to connect work tree and git dir */
+void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
+{
+	struct strbuf core_worktree_setting = STRBUF_INIT;
+	struct strbuf configfile_name = STRBUF_INIT;
+	struct strbuf gitfile_content = STRBUF_INIT;
+	struct strbuf gitfile_name = STRBUF_INIT;
+	const char *real_work_tree = real_path(work_tree);
+	const char *pathspec[] = { real_work_tree, git_dir, NULL };
+	const char *max_prefix = common_prefix(pathspec);
+	FILE *fp;
+
+	if (max_prefix) {       /* skip common prefix */
+		size_t max_prefix_len = strlen(max_prefix);
+		real_work_tree += max_prefix_len;
+		git_dir += max_prefix_len;
+	}
+
+	/*
+	 * Update gitfile
+	 */
+	strbuf_addstr(&gitfile_content, "gitdir: ");
+	if (real_work_tree[0]) {
+		const char *s = real_work_tree;
+		do {
+			strbuf_addstr(&gitfile_content, "../");
+			s++;
+		} while ((s = strchr(s, '/')));
+	}
+	strbuf_addstr(&gitfile_content, git_dir);
+	strbuf_addch(&gitfile_content, '\n');
+
+	strbuf_addf(&gitfile_name, "%s/.git", work_tree);
+	fp = fopen(gitfile_name.buf, "w");
+	if (!fp)
+		die(_("Could not create git link %s"), gitfile_name.buf);
+	fprintf(fp, "%s", gitfile_content.buf);
+	fclose(fp);
+
+	strbuf_release(&gitfile_content);
+	strbuf_release(&gitfile_name);
+
+	/*
+	 * Update core.worktree setting
+	 */
+	if (git_dir[0]) {
+		const char *s = git_dir;
+		do {
+			strbuf_addstr(&core_worktree_setting, "../");
+			s++;
+		} while ((s = strchr(s, '/')));
+	}
+	strbuf_addstr(&core_worktree_setting, real_work_tree);
+
+	strbuf_addf(&configfile_name, "%s/config", git_dir);
+	if (git_config_set_in_file(configfile_name.buf, "core.worktree",
+				   core_worktree_setting.buf))
+		die(_("Could not set core.worktree in %s"),
+		    configfile_name.buf);
+
+	strbuf_release(&core_worktree_setting);
+	strbuf_release(&configfile_name);
+}
diff --git a/submodule.h b/submodule.h
index 3dc1b3f..0c27c53 100644
--- a/submodule.h
+++ b/submodule.h
@@ -35,5 +35,6 @@ int merge_submodule(unsigned char result[20], const char *path, const unsigned c
 int find_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name,
 		struct string_list *needs_pushing);
 int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
+void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);

 #endif
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4c57f61..d824464 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -289,4 +289,23 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm
 	git diff-files --quiet
 '

+test_expect_success 'git mv moves a submodule with gitfile' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	(
+		cd mod &&
+		git mv ../sub/ .
+	) &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
 test_done
-- 
1.8.2.1.345.gb37ac0e

^ permalink raw reply related	[relevance 9%]

* [PATCH/RFC 1/3] Teach mv to move submodules together with their work trees
  2013-04-03 19:54  4% [PATCH/RFC 0/3] Teach mv to move submodules Jens Lehmann
@ 2013-04-03 19:56 10% ` Jens Lehmann
  2013-04-03 19:56  9% ` [PATCH/RFC 2/3] Teach mv to move submodules using a gitfile Jens Lehmann
  2013-04-03 19:57  9% ` [PATCH/RFC 3/3] Teach mv to update the path entry in .gitmodules for moved submodules Jens Lehmann
  2 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-04-03 19:56 UTC (permalink / raw)
  To: Git Mailing List
  Cc: Junio C Hamano, Phil Hord, Heiko Voigt, W. Trevor King,
	Peter Collingbourne

Currently the attempt to use "git mv" on a submodule errors out with:
  fatal: source directory is empty, source=<src>, destination=<dest>
The reason is that mv searches for the submodule with a trailing slash in
the index, which it doesn't find (because it is stored without a trailing
slash). As it doesn't find any index entries inside the submodule it
claims the directory would be empty even though it isn't.

Fix that by searching for the name without a trailing slash and continue
if it is a submodule. Then rename() will move the submodule work tree just
like it moves a file.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
 builtin/mv.c  | 99 +++++++++++++++++++++++++++++++----------------------------
 t/t7001-mv.sh | 34 ++++++++++++++++++++
 2 files changed, 86 insertions(+), 47 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 034fec9..361028d 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -117,55 +117,60 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				&& lstat(dst, &st) == 0)
 			bad = _("cannot move directory over file");
 		else if (src_is_dir) {
-			const char *src_w_slash = add_slash(src);
-			int len_w_slash = length + 1;
-			int first, last;
-
-			modes[i] = WORKING_DIRECTORY;
-
-			first = cache_name_pos(src_w_slash, len_w_slash);
-			if (first >= 0)
-				die (_("Huh? %.*s is in index?"),
-						len_w_slash, src_w_slash);
-
-			first = -1 - first;
-			for (last = first; last < active_nr; last++) {
-				const char *path = active_cache[last]->name;
-				if (strncmp(path, src_w_slash, len_w_slash))
-					break;
-			}
-			free((char *)src_w_slash);
-
-			if (last - first < 1)
-				bad = _("source directory is empty");
-			else {
-				int j, dst_len;
-
-				if (last - first > 0) {
-					source = xrealloc(source,
-							(argc + last - first)
-							* sizeof(char *));
-					destination = xrealloc(destination,
-							(argc + last - first)
-							* sizeof(char *));
-					modes = xrealloc(modes,
-							(argc + last - first)
-							* sizeof(enum update_mode));
+			int first = cache_name_pos(src, length);
+			if (first >= 0) {
+				if (!S_ISGITLINK(active_cache[first]->ce_mode))
+					die (_("Huh? Directory %s is in index and no submodule?"), src);
+			} else {
+				const char *src_w_slash = add_slash(src);
+				int last, len_w_slash = length + 1;
+
+				modes[i] = WORKING_DIRECTORY;
+
+				first = cache_name_pos(src_w_slash, len_w_slash);
+				if (first >= 0)
+					die (_("Huh? %.*s is in index?"),
+							len_w_slash, src_w_slash);
+
+				first = -1 - first;
+				for (last = first; last < active_nr; last++) {
+					const char *path = active_cache[last]->name;
+					if (strncmp(path, src_w_slash, len_w_slash))
+						break;
 				}
-
-				dst = add_slash(dst);
-				dst_len = strlen(dst);
-
-				for (j = 0; j < last - first; j++) {
-					const char *path =
-						active_cache[first + j]->name;
-					source[argc + j] = path;
-					destination[argc + j] =
-						prefix_path(dst, dst_len,
-							path + length + 1);
-					modes[argc + j] = INDEX;
+				free((char *)src_w_slash);
+
+				if (last - first < 1)
+					bad = _("source directory is empty");
+				else {
+					int j, dst_len;
+
+					if (last - first > 0) {
+						source = xrealloc(source,
+								(argc + last - first)
+								* sizeof(char *));
+						destination = xrealloc(destination,
+								(argc + last - first)
+								* sizeof(char *));
+						modes = xrealloc(modes,
+								(argc + last - first)
+								* sizeof(enum update_mode));
+					}
+
+					dst = add_slash(dst);
+					dst_len = strlen(dst);
+
+					for (j = 0; j < last - first; j++) {
+						const char *path =
+							active_cache[first + j]->name;
+						source[argc + j] = path;
+						destination[argc + j] =
+							prefix_path(dst, dst_len,
+								path + length + 1);
+						modes[argc + j] = INDEX;
+					}
+					argc += last - first;
 				}
-				argc += last - first;
 			}
 		} else if (cache_name_pos(src, length) < 0)
 			bad = _("not under version control");
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..4c57f61 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,38 @@ test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '

 rm -f moved symlink

+test_expect_success 'setup submodule' '
+	git commit -m initial &&
+	git reset --hard &&
+	git submodule add ./. sub &&
+	echo content >file &&
+	git add file &&
+	git commit -m "added sub and file"
+'
+
+test_expect_success 'git mv cannot move a submodule in a file' '
+	test_must_fail git mv sub file
+'
+
+test_expect_success 'git mv moves a submodule with a .git directory and no .gitmodules' '
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	git rm .gitmodules &&
+	(
+		cd sub &&
+		rm -f .git &&
+		cp -a ../.git/modules/sub .git &&
+		GIT_WORK_TREE=. git config --unset core.worktree
+	) &&
+	mkdir mod &&
+	git mv sub mod/sub &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
 test_done
-- 
1.8.2.377.g1bdb7d0

^ permalink raw reply related	[relevance 10%]

* [PATCH/RFC 3/3] Teach mv to update the path entry in .gitmodules for moved submodules
  2013-04-03 19:54  4% [PATCH/RFC 0/3] Teach mv to move submodules Jens Lehmann
  2013-04-03 19:56 10% ` [PATCH/RFC 1/3] Teach mv to move submodules together with their work trees Jens Lehmann
  2013-04-03 19:56  9% ` [PATCH/RFC 2/3] Teach mv to move submodules using a gitfile Jens Lehmann
@ 2013-04-03 19:57  9% ` Jens Lehmann
  2 siblings, 0 replies; 200+ results
From: Jens Lehmann @ 2013-04-03 19:57 UTC (permalink / raw)
  To: Git Mailing List
  Cc: Junio C Hamano, Phil Hord, Heiko Voigt, W. Trevor King,
	Peter Collingbourne

Currently using "git mv" on a submodule moves the submodule's work tree in
that of the superproject. But the submodule's path setting in .gitmodules
is left untouched, which is now inconsistent with the work tree and makes
git commands that rely on the proper path -> name mapping (like status and
diff) behave strangely.

Let "git mv" help here by not only moving the submodule's work tree but
also updating the "submodule.<submodule name>.path" setting from the
.gitmodules file and stage both. This doesn't happen when no .gitmodules
file is found and only issues a warning when it doesn't have a section for
this submodule. This is because the user might just use plain gitlinks
without the .gitmodules file or has already updated the path setting by
hand before issuing the "git mv" command (in which case the warning
reminds him that mv would have done that for him). Only when .gitmodules
is found and contains merge conflicts the mv command will fail and tell
the user to resolve the conflict before trying again.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
 builtin/mv.c  |  8 +++++++-
 submodule.c   | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 submodule.h   |  2 ++
 t/t7001-mv.sh | 41 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+), 1 deletion(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 609bbb8..36e5605 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -57,7 +57,7 @@ static struct lock_file lock_file;

 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
-	int i, newfd;
+	int i, newfd, gitmodules_modified = 0;
 	int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
 	struct option builtin_mv_options[] = {
 		OPT__VERBOSE(&verbose, N_("be verbose")),
@@ -71,6 +71,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	struct stat st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;

+	gitmodules_config();
 	git_config(git_default_config, NULL);

 	argc = parse_options(argc, argv, prefix, builtin_mv_options,
@@ -228,6 +229,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				die_errno (_("renaming '%s' failed"), src);
 			if (submodule_gitfile[i])
 				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+			if (!update_path_in_gitmodules(src, dst))
+				gitmodules_modified = 1;
 		}

 		if (mode == WORKING_DIRECTORY)
@@ -239,6 +242,9 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			rename_cache_entry_at(pos, dst);
 	}

+	if (gitmodules_modified)
+		stage_updated_gitmodules();
+
 	if (active_cache_changed) {
 		if (write_cache(newfd, active_cache, active_nr) ||
 		    commit_locked_index(&lock_file))
diff --git a/submodule.c b/submodule.c
index eba9b42..fb742b4 100644
--- a/submodule.c
+++ b/submodule.c
@@ -10,6 +10,7 @@
 #include "string-list.h"
 #include "sha1-array.h"
 #include "argv-array.h"
+#include "blob.h"

 static struct string_list config_name_for_path;
 static struct string_list config_fetch_recurse_submodules_for_name;
@@ -30,6 +31,67 @@ static struct sha1_array ref_tips_after_fetch;
  */
 static int gitmodules_is_unmerged;

+/*
+ * Try to update the "path" entry in the "submodule.<name>" section of the
+ * .gitmodules file.
+ */
+int update_path_in_gitmodules(const char *oldpath, const char *newpath)
+{
+	struct strbuf entry = STRBUF_INIT;
+	struct string_list_item *path_option;
+
+	if (!file_exists(".gitmodules")) /* Do nothing whithout .gitmodules */
+		return -1;
+
+	if (gitmodules_is_unmerged)
+		die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first"));
+
+	path_option = unsorted_string_list_lookup(&config_name_for_path, oldpath);
+	if (!path_option) {
+		warning(_("Could not find section in .gitmodules where path=%s"), oldpath);
+		return -1;
+	}
+	strbuf_addstr(&entry, "submodule.");
+	strbuf_addstr(&entry, path_option->util);
+	strbuf_addstr(&entry, ".path");
+	if (git_config_set_in_file(".gitmodules", entry.buf, newpath) < 0) {
+		/* Maybe the user already did that, don't error out here */
+		warning(_("Could not update .gitmodules entry %s"), entry.buf);
+		return -1;
+	}
+	strbuf_release(&entry);
+	return 0;
+}
+
+void stage_updated_gitmodules(void)
+{
+	struct strbuf buf = STRBUF_INIT;
+	struct stat st;
+	int pos;
+	struct cache_entry *ce;
+	int namelen = strlen(".gitmodules");
+
+	pos = cache_name_pos(".gitmodules", strlen(".gitmodules"));
+	if (pos < 0) {
+		warning(_("could not find .gitmodules in index"));
+		return;
+	}
+	ce = active_cache[pos];
+	ce->ce_flags = namelen;
+	if (strbuf_read_file(&buf, ".gitmodules", 0) < 0)
+		die(_("reading updated .gitmodules failed"));
+	if (lstat(".gitmodules", &st) < 0)
+		die_errno(_("unable to stat updated .gitmodules"));
+	fill_stat_cache_info(ce, &st);
+	ce->ce_mode = ce_mode_from_stat(ce, st.st_mode);
+	if (remove_file_from_cache(".gitmodules") < 0)
+		die(_("unable to remove .gitmodules from index"));
+	if (write_sha1_file(buf.buf, buf.len, blob_type, ce->sha1))
+		die(_("adding updated .gitmodules failed"));
+	if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))
+		die(_("staging updated .gitmodules failed"));
+}
+
 static int add_submodule_odb(const char *path)
 {
 	struct strbuf objects_directory = STRBUF_INIT;
diff --git a/submodule.h b/submodule.h
index 0c27c53..39c0321 100644
--- a/submodule.h
+++ b/submodule.h
@@ -11,6 +11,8 @@ enum {
 	RECURSE_SUBMODULES_ON = 2
 };

+int update_path_in_gitmodules(const char *oldpath, const char *newpath);
+void stage_updated_gitmodules(void);
 void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
 		const char *path);
 int submodule_config(const char *var, const char *value, void *cb);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index d824464..c144d21 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -304,6 +304,47 @@ test_expect_success 'git mv moves a submodule with gitfile' '
 		cd mod/sub &&
 		git status
 	) &&
+	echo mod/sub >expected &&
+	git config -f .gitmodules submodule.sub.path >actual &&
+	test_cmp expected actual &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv does not complain when no .gitmodules file is found' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git rm .gitmodules &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	git mv sub mod/sub 2>actual.err &&
+	! test -s actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
+test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	git config -f .gitmodules --remove-section submodule.sub &&
+	git add .gitmodules &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	git mv sub mod/sub 2>actual.err &&
+	test_i18ncmp expect.err actual.err &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
 	git update-index --refresh &&
 	git diff-files --quiet
 '
-- 
1.8.2.377.g1bdb7d0

^ permalink raw reply related	[relevance 9%]

* [PATCH/RFC 2/3] Teach mv to move submodules using a gitfile
  2013-04-03 19:54  4% [PATCH/RFC 0/3] Teach mv to move submodules Jens Lehmann
  2013-04-03 19:56 10% ` [PATCH/RFC 1/3] Teach mv to move submodules together with their work trees Jens Lehmann
@ 2013-04-03 19:56  9% ` Jens Lehmann
    2013-04-03 19:57  9% ` [PATCH/RFC 3/3] Teach mv to update the path entry in .gitmodules for moved submodules Jens Lehmann
  2 siblings, 1 reply; 200+ results
From: Jens Lehmann @ 2013-04-03 19:56 UTC (permalink / raw)
  To: Git Mailing List
  Cc: Junio C Hamano, Phil Hord, Heiko Voigt, W. Trevor King,
	Peter Collingbourne

When moving a submodule which uses a gitfile to point to the git directory
stored in .git/modules/<name> of the superproject two changes must be made
to make the submodule work: the .git file and the core.worktree setting
must be adjusted to point from work tree to git directory and back.

Achieve that by remembering which submodule uses a gitfile by storing the
result of read_gitfile() of each submodule. If that is not NULL the new
function connect_work_tree_and_git_dir() is called after renaming the
submodule's work tree which updates the two settings to the new values.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
---
 builtin/mv.c  | 19 ++++++++++++++----
 submodule.c   | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 submodule.h   |  1 +
 t/t7001-mv.sh | 19 ++++++++++++++++++
 4 files changed, 99 insertions(+), 4 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 361028d..609bbb8 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -9,6 +9,7 @@
 #include "cache-tree.h"
 #include "string-list.h"
 #include "parse-options.h"
+#include "submodule.h"

 static const char * const builtin_mv_usage[] = {
 	N_("git mv [options] <source>... <destination>"),
@@ -65,7 +66,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		OPT_BOOLEAN('k', NULL, &ignore_errors, N_("skip move/rename errors")),
 		OPT_END(),
 	};
-	const char **source, **destination, **dest_path;
+	const char **source, **destination, **dest_path, **submodule_gitfile;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
 	struct stat st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
@@ -84,6 +85,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	source = copy_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
 	dest_path = copy_pathspec(prefix, argv + argc, 1, 0);
+	submodule_gitfile = xcalloc(argc, sizeof(char *));

 	if (dest_path[0][0] == '\0')
 		/* special case: "." was normalized to "" */
@@ -119,8 +121,14 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		else if (src_is_dir) {
 			int first = cache_name_pos(src, length);
 			if (first >= 0) {
+				struct strbuf submodule_dotgit = STRBUF_INIT;
 				if (!S_ISGITLINK(active_cache[first]->ce_mode))
 					die (_("Huh? Directory %s is in index and no submodule?"), src);
+				strbuf_addf(&submodule_dotgit, "%s/.git", src);
+				submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf);
+				if (submodule_gitfile[i])
+					submodule_gitfile[i] = xstrdup(submodule_gitfile[i]);
+				strbuf_release(&submodule_dotgit);
 			} else {
 				const char *src_w_slash = add_slash(src);
 				int last, len_w_slash = length + 1;
@@ -215,9 +223,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		int pos;
 		if (show_only || verbose)
 			printf(_("Renaming %s to %s\n"), src, dst);
-		if (!show_only && mode != INDEX &&
-				rename(src, dst) < 0 && !ignore_errors)
-			die_errno (_("renaming '%s' failed"), src);
+		if (!show_only && mode != INDEX) {
+			if (rename(src, dst) < 0 && !ignore_errors)
+				die_errno (_("renaming '%s' failed"), src);
+			if (submodule_gitfile[i])
+				connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+		}

 		if (mode == WORKING_DIRECTORY)
 			continue;
diff --git a/submodule.c b/submodule.c
index 975bc87..eba9b42 100644
--- a/submodule.c
+++ b/submodule.c
@@ -1001,3 +1001,67 @@ int merge_submodule(unsigned char result[20], const char *path,
 	free(merges.objects);
 	return 0;
 }
+
+/* Update gitfile and core.worktree setting to connect work tree and git dir */
+void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
+{
+	struct strbuf core_worktree_setting = STRBUF_INIT;
+	struct strbuf configfile_name = STRBUF_INIT;
+	struct strbuf gitfile_content = STRBUF_INIT;
+	struct strbuf gitfile_name = STRBUF_INIT;
+	const char *real_work_tree = real_path(work_tree);
+	const char *pathspec[] = { real_work_tree, git_dir, NULL };
+	const char *max_prefix = common_prefix(pathspec);
+	FILE *fp;
+
+	if (max_prefix) {       /* skip common prefix */
+		size_t max_prefix_len = strlen(max_prefix);
+		real_work_tree += max_prefix_len;
+		git_dir += max_prefix_len;
+	}
+
+	/*
+	 * Update gitfile
+	 */
+	strbuf_addstr(&gitfile_content, "gitdir: ");
+	if (real_work_tree[0]) {
+		const char *s = real_work_tree;
+		do {
+			strbuf_addstr(&gitfile_content, "../");
+			s++;
+		} while ((s = strchr(s, '/')));
+	}
+	strbuf_addstr(&gitfile_content, git_dir);
+	strbuf_addch(&gitfile_content, '\n');
+
+	strbuf_addf(&gitfile_name, "%s/.git", work_tree);
+	fp = fopen(gitfile_name.buf, "w");
+	if (!fp)
+		die(_("Could not create git link %s"), gitfile_name.buf);
+	fprintf(fp, gitfile_content.buf);
+	fclose(fp);
+
+	strbuf_release(&gitfile_content);
+	strbuf_release(&gitfile_name);
+
+	/*
+	 * Update core.worktree setting
+	 */
+	if (git_dir[0]) {
+		const char *s = git_dir;
+		do {
+			strbuf_addstr(&core_worktree_setting, "../");
+			s++;
+		} while ((s = strchr(s, '/')));
+	}
+	strbuf_addstr(&core_worktree_setting, real_work_tree);
+
+	strbuf_addf(&configfile_name, "%s/config", git_dir);
+	if (git_config_set_in_file(configfile_name.buf, "core.worktree",
+				   core_worktree_setting.buf))
+		die(_("Could not set core.worktree in %s"),
+		    configfile_name.buf);
+
+	strbuf_release(&core_worktree_setting);
+	strbuf_release(&configfile_name);
+}
diff --git a/submodule.h b/submodule.h
index 3dc1b3f..0c27c53 100644
--- a/submodule.h
+++ b/submodule.h
@@ -35,5 +35,6 @@ int merge_submodule(unsigned char result[20], const char *path, const unsigned c
 int find_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name,
 		struct string_list *needs_pushing);
 int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
+void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);

 #endif
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 4c57f61..d824464 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -289,4 +289,23 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm
 	git diff-files --quiet
 '

+test_expect_success 'git mv moves a submodule with gitfile' '
+	rm -rf mod/sub &&
+	git reset --hard &&
+	git submodule update &&
+	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	(
+		cd mod &&
+		git mv ../sub/ .
+	) &&
+	! test -e sub &&
+	[ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] &&
+	(
+		cd mod/sub &&
+		git status
+	) &&
+	git update-index --refresh &&
+	git diff-files --quiet
+'
+
 test_done
-- 
1.8.2.377.g1bdb7d0

^ permalink raw reply related	[relevance 9%]

* [PATCH/RFC 0/3] Teach mv to move submodules
@ 2013-04-03 19:54  4% Jens Lehmann
  2013-04-03 19:56 10% ` [PATCH/RFC 1/3] Teach mv to move submodules together with their work trees Jens Lehmann
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Jens Lehmann @ 2013-04-03 19:54 UTC (permalink / raw)
  To: Git Mailing List
  Cc: Junio C Hamano, Phil Hord, Heiko Voigt, W. Trevor King,
	Peter Collingbourne

This is the last topic I intend to finish before preparing the recursive
submodule update. The other prerequisites for that next step are Heiko's
"allow more sources for config values" and "fetch moved submodules
on-demand" topics, which are necessary to populate submodules that were
not present in the currently checked out commit and to have all commits
of moved or currently not present submodules fetched for later checkout
respectively. But these are other threads ...

Let's enable users to move submodules (just as easy as they can already
remove them with current Git with "git rm") by using a plain "git mv".
While using "git submodule update" on a moved submodule cloned by a
coworker will still leave the submodule's work tree lying around at the
old path, that will be fixed by the recursive submodule update (and is
not different from what Git currently does with removed submodules).
Replacing a directory containing files tracked by Git or vice versa is
still not possible, another issue to be fixed by the recursive submodule
update. I tried to CC all parties which showed interest in this topic,
hopefully I didn't forget anyone.

Jens Lehmann (3):
  Teach mv to move submodules together with their work trees
  Teach mv to move submodules using a gitfile
  Teach mv to update the path entry in .gitmodules for moved submodules

 builtin/mv.c  | 126 ++++++++++++++++++++++++++++++++++------------------------
 submodule.c   | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 submodule.h   |   3 ++
 t/t7001-mv.sh |  94 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 297 insertions(+), 52 deletions(-)

-- 
1.8.2.377.g1bdb7d0

^ permalink raw reply	[relevance 4%]

* [PATCH] Spelling fixes.
@ 2013-02-23 14:31  4% Ville Skyttä
  0 siblings, 0 replies; 200+ results
From: Ville Skyttä @ 2013-02-23 14:31 UTC (permalink / raw)
  To: git


Signed-off-by: Ville Skyttä <ville.skytta@iki.fi>
---
 Documentation/RelNotes/1.7.5.4.txt                 |  2 +-
 Documentation/RelNotes/1.7.8.txt                   |  2 +-
 Documentation/RelNotes/1.8.2.txt                   |  2 +-
 Documentation/git-credential.txt                   |  2 +-
 Documentation/git-remote-ext.txt                   |  2 +-
 Documentation/git-svn.txt                          |  4 ++--
 Documentation/revisions.txt                        |  2 +-
 Documentation/technical/api-argv-array.txt         |  2 +-
 Documentation/technical/api-credentials.txt        |  2 +-
 Documentation/technical/api-ref-iteration.txt      |  2 +-
 builtin/apply.c                                    |  6 +++---
 commit.c                                           |  2 +-
 commit.h                                           |  2 +-
 contrib/mw-to-git/git-remote-mediawiki.perl        |  6 +++---
 contrib/mw-to-git/t/README                         |  6 +++---
 contrib/mw-to-git/t/install-wiki/LocalSettings.php |  2 +-
 contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh        | 10 +++++-----
 contrib/mw-to-git/t/test-gitmw-lib.sh              |  2 +-
 contrib/subtree/t/t7900-subtree.sh                 |  2 +-
 diff.c                                             |  2 +-
 git-add--interactive.perl                          |  2 +-
 git-cvsserver.perl                                 |  4 ++--
 git-gui/lib/blame.tcl                              |  2 +-
 git-gui/lib/index.tcl                              |  2 +-
 git-gui/lib/spellcheck.tcl                         |  4 ++--
 git-quiltimport.sh                                 |  2 +-
 gitweb/INSTALL                                     |  2 +-
 gitweb/gitweb.perl                                 |  6 +++---
 kwset.c                                            |  4 ++--
 perl/Git.pm                                        |  2 +-
 perl/Git/I18N.pm                                   |  2 +-
 perl/private-Error.pm                              |  2 +-
 po/README                                          |  6 +++---
 po/pt_PT.po                                        |  2 +-
 po/zh_CN.po                                        |  2 +-
 sequencer.c                                        |  2 +-
 t/t0022-crlf-rename.sh                             |  2 +-
 t/t3701-add-interactive.sh                         |  2 +-
 t/t4014-format-patch.sh                            |  6 +++---
 t/t4124-apply-ws-rule.sh                           |  2 +-
 t/t6030-bisect-porcelain.sh                        |  2 +-
 t/t7001-mv.sh                                      |  8 ++++----
 t/t7004-tag.sh                                     |  2 +-
 t/t7600-merge.sh                                   |  2 +-
 t/t7601-merge-pull-config.sh                       |  2 +-
 t/t9001-send-email.sh                              |  2 +-
 transport.h                                        |  2 +-
 xdiff/xdiffi.c                                     |  2 +-
 xdiff/xhistogram.c                                 |  2 +-
 49 files changed, 72 insertions(+), 72 deletions(-)

diff --git a/Documentation/RelNotes/1.7.5.4.txt b/Documentation/RelNotes/1.7.5.4.txt
index cf3f455..7796df3 100644
--- a/Documentation/RelNotes/1.7.5.4.txt
+++ b/Documentation/RelNotes/1.7.5.4.txt
@@ -5,7 +5,7 @@ Fixes since v1.7.5.3
 --------------------
 
  * The single-key mode of "git add -p" was easily fooled into thinking
-   that it was told to add everthing ('a') when up-arrow was pressed by
+   that it was told to add everything ('a') when up-arrow was pressed by
    mistake.
 
  * Setting a git command that uses custom configuration via "-c var=val"
diff --git a/Documentation/RelNotes/1.7.8.txt b/Documentation/RelNotes/1.7.8.txt
index b4d90bb..7012329 100644
--- a/Documentation/RelNotes/1.7.8.txt
+++ b/Documentation/RelNotes/1.7.8.txt
@@ -9,7 +9,7 @@ Updates since v1.7.7
  * Updates to bash completion scripts.
 
  * The build procedure has been taught to take advantage of computed
-   dependency automatically when the complier supports it.
+   dependency automatically when the compiler supports it.
 
  * The date parser now accepts timezone designators that lack minutes
    part and also has a colon between "hh:mm".
diff --git a/Documentation/RelNotes/1.8.2.txt b/Documentation/RelNotes/1.8.2.txt
index a287f24..4e63644 100644
--- a/Documentation/RelNotes/1.8.2.txt
+++ b/Documentation/RelNotes/1.8.2.txt
@@ -17,7 +17,7 @@ preference configuration variable "push.default" to change this.
 
 "git push $there tag v1.2.3" used to allow replacing a tag v1.2.3
 that already exists in the repository $there, if the rewritten tag
-you are pushing points at a commit that is a decendant of a commit
+you are pushing points at a commit that is a descendant of a commit
 that the old tag v1.2.3 points at.  This was found to be error prone
 and starting with this release, any attempt to update an existing
 ref under refs/tags/ hierarchy will fail, without "--force".
diff --git a/Documentation/git-credential.txt b/Documentation/git-credential.txt
index 472f00f..7da0f13 100644
--- a/Documentation/git-credential.txt
+++ b/Documentation/git-credential.txt
@@ -56,7 +56,7 @@ For example, if we want a password for
 `https://example.com/foo.git`, we might generate the following
 credential description (don't forget the blank line at the end; it
 tells `git credential` that the application finished feeding all the
-infomation it has):
+information it has):
 
 	 protocol=https
 	 host=example.com
diff --git a/Documentation/git-remote-ext.txt b/Documentation/git-remote-ext.txt
index 58b7fac..8cfc748 100644
--- a/Documentation/git-remote-ext.txt
+++ b/Documentation/git-remote-ext.txt
@@ -86,7 +86,7 @@ begins with `ext::`.  Examples:
 	edit .ssh/config.
 
 "ext::socat -t3600 - ABSTRACT-CONNECT:/git-server %G/somerepo"::
-	Represents repository with path /somerepo accessable over
+	Represents repository with path /somerepo accessible over
 	git protocol at abstract namespace address /git-server.
 
 "ext::git-server-alias foo %G/repo"::
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 1b8b649..7706d41 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -245,7 +245,7 @@ first have already been pushed into SVN.
 	patch), "all" (accept all patches), or "quit".
 	+
 	'git svn dcommit' returns immediately if answer if "no" or "quit", without
-	commiting anything to SVN.
+	committing anything to SVN.
 
 'branch'::
 	Create a branch in the SVN repository.
@@ -856,7 +856,7 @@ HANDLING OF SVN BRANCHES
 ------------------------
 If 'git svn' is configured to fetch branches (and --follow-branches
 is in effect), it sometimes creates multiple Git branches for one
-SVN branch, where the addtional branches have names of the form
+SVN branch, where the additional branches have names of the form
 'branchname@nnn' (with nnn an SVN revision number).  These additional
 branches are created if 'git svn' cannot find a parent commit for the
 first commit in an SVN branch, to connect the branch to the history of
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 678d175..39a855a 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -55,7 +55,7 @@ when you run `git cherry-pick`.
 +
 Note that any of the 'refs/*' cases above may come either from
 the '$GIT_DIR/refs' directory or from the '$GIT_DIR/packed-refs' file.
-While the ref name encoding is unspecified, UTF-8 is prefered as
+While the ref name encoding is unspecified, UTF-8 is preferred as
 some output processing may assume ref names in UTF-8.
 
 '<refname>@\{<date>\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}'::
diff --git a/Documentation/technical/api-argv-array.txt b/Documentation/technical/api-argv-array.txt
index a959517..a6b7d83 100644
--- a/Documentation/technical/api-argv-array.txt
+++ b/Documentation/technical/api-argv-array.txt
@@ -55,7 +55,7 @@ Functions
 	initial, empty state.
 
 `argv_array_detach`::
-	Detach the argv array from the `struct argv_array`, transfering
+	Detach the argv array from the `struct argv_array`, transferring
 	ownership of the allocated array and strings.
 
 `argv_array_free_detached`::
diff --git a/Documentation/technical/api-credentials.txt b/Documentation/technical/api-credentials.txt
index 516fda7..c1b42a4 100644
--- a/Documentation/technical/api-credentials.txt
+++ b/Documentation/technical/api-credentials.txt
@@ -160,7 +160,7 @@ int foo_login(struct foo_connection *f)
 		break;
 	default:
 		/*
-		 * Some other error occured. We don't know if the
+		 * Some other error occurred. We don't know if the
 		 * credential is good or bad, so report nothing to the
 		 * credential subsystem.
 		 */
diff --git a/Documentation/technical/api-ref-iteration.txt b/Documentation/technical/api-ref-iteration.txt
index dbbea95..aa1c50f 100644
--- a/Documentation/technical/api-ref-iteration.txt
+++ b/Documentation/technical/api-ref-iteration.txt
@@ -35,7 +35,7 @@ Iteration functions
 * `head_ref_submodule()`, `for_each_ref_submodule()`,
   `for_each_ref_in_submodule()`, `for_each_tag_ref_submodule()`,
   `for_each_branch_ref_submodule()`, `for_each_remote_ref_submodule()`
-  do the same as the functions descibed above but for a specified
+  do the same as the functions described above but for a specified
   submodule.
 
 * `for_each_rawref()` can be used to learn about broken ref and symref.
diff --git a/builtin/apply.c b/builtin/apply.c
index 06f5320..f6a3c97 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -1921,7 +1921,7 @@ static int parse_binary(char *buffer, unsigned long size, struct patch *patch)
 }
 
 /*
- * Read the patch text in "buffer" taht extends for "size" bytes; stop
+ * Read the patch text in "buffer" that extends for "size" bytes; stop
  * reading after seeing a single patch (i.e. changes to a single file).
  * Create fragments (i.e. patch hunks) and hang them to the given patch.
  * Return the number of bytes consumed, so that the caller can call us
@@ -3025,7 +3025,7 @@ static struct patch *in_fn_table(const char *name)
  *
  * The latter is needed to deal with a case where two paths A and B
  * are swapped by first renaming A to B and then renaming B to A;
- * moving A to B should not be prevented due to presense of B as we
+ * moving A to B should not be prevented due to presence of B as we
  * will remove it in a later patch.
  */
 #define PATH_TO_BE_DELETED ((struct patch *) -2)
@@ -3509,7 +3509,7 @@ static int check_patch(struct patch *patch)
 	 *
 	 * A patch to swap-rename between A and B would first rename A
 	 * to B and then rename B to A.  While applying the first one,
-	 * the presense of B should not stop A from getting renamed to
+	 * the presence of B should not stop A from getting renamed to
 	 * B; ask to_be_deleted() about the later rename.  Removal of
 	 * B and rename from A to B is handled the same way by asking
 	 * was_deleted().
diff --git a/commit.c b/commit.c
index e8eb0ae..1a41757 100644
--- a/commit.c
+++ b/commit.c
@@ -834,7 +834,7 @@ struct commit_list *get_merge_bases(struct commit *one, struct commit *two,
 }
 
 /*
- * Is "commit" a decendant of one of the elements on the "with_commit" list?
+ * Is "commit" a descendant of one of the elements on the "with_commit" list?
  */
 int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
 {
diff --git a/commit.h b/commit.h
index 4138bb4..252c7f8 100644
--- a/commit.h
+++ b/commit.h
@@ -164,7 +164,7 @@ extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *r
 extern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup);
 extern struct commit_list *get_octopus_merge_bases(struct commit_list *in);
 
-/* largest postive number a signed 32-bit integer can contain */
+/* largest positive number a signed 32-bit integer can contain */
 #define INFINITE_DEPTH 0x7fffffff
 
 extern int register_shallow(const unsigned char *sha1);
diff --git a/contrib/mw-to-git/git-remote-mediawiki.perl b/contrib/mw-to-git/git-remote-mediawiki.perl
index 094129d..779c379 100755
--- a/contrib/mw-to-git/git-remote-mediawiki.perl
+++ b/contrib/mw-to-git/git-remote-mediawiki.perl
@@ -28,7 +28,7 @@ use warnings;
 use constant SLASH_REPLACEMENT => "%2F";
 
 # It's not always possible to delete pages (may require some
-# priviledges). Deleted pages are replaced with this content.
+# privileges). Deleted pages are replaced with this content.
 use constant DELETED_CONTENT => "[[Category:Deleted]]\n";
 
 # It's not possible to create empty pages. New empty files in Git are
@@ -841,7 +841,7 @@ sub mw_import_ref {
 	if ($fetch_from == 1 && $n == 0) {
 		print STDERR "You appear to have cloned an empty MediaWiki.\n";
 		# Something has to be done remote-helper side. If nothing is done, an error is
-		# thrown saying that HEAD is refering to unknown object 0000000000000000000
+		# thrown saying that HEAD is referring to unknown object 0000000000000000000
 		# and the clone fails.
 	}
 }
@@ -986,7 +986,7 @@ sub mw_upload_file {
 		print STDERR "Check the configuration of file uploads in your mediawiki.\n";
 		return $newrevid;
 	}
-	# Deleting and uploading a file requires a priviledged user
+	# Deleting and uploading a file requires a privileged user
 	if ($file_deleted) {
 		mw_connect_maybe();
 		my $query = {
diff --git a/contrib/mw-to-git/t/README b/contrib/mw-to-git/t/README
index 96e9739..03f6ee5 100644
--- a/contrib/mw-to-git/t/README
+++ b/contrib/mw-to-git/t/README
@@ -25,7 +25,7 @@ Principles and Technical Choices
 
 The test environment makes it easy to install and manipulate one or
 several MediaWiki instances. To allow developers to run the testsuite
-easily, the environment does not require root priviledge (except to
+easily, the environment does not require root privilege (except to
 install the required packages if needed). It starts a webserver
 instance on the user's account (using lighttpd greatly helps for
 that), and does not need a separate database daemon (thanks to the use
@@ -81,7 +81,7 @@ parameters, please refer to the `test-gitmw-lib.sh` and
 
 ** `test_check_wiki_precond`:
 Check if the tests must be skipped or not. Please use this function
-at the beggining of each new test file.
+at the beginning of each new test file.
 
 ** `wiki_getpage`:
 Fetch a given page from the wiki and puts its content in the
@@ -113,7 +113,7 @@ Tests if a given page exists on the wiki.
 
 ** `wiki_reset`:
 Reset the wiki, i.e. flush the database. Use this function at the
-begining of each new test, except if the test re-uses the same wiki
+beginning of each new test, except if the test re-uses the same wiki
 (and history) as the previous test.
 
 How to write a new test
diff --git a/contrib/mw-to-git/t/install-wiki/LocalSettings.php b/contrib/mw-to-git/t/install-wiki/LocalSettings.php
index 29f1251..745e47e 100644
--- a/contrib/mw-to-git/t/install-wiki/LocalSettings.php
+++ b/contrib/mw-to-git/t/install-wiki/LocalSettings.php
@@ -88,7 +88,7 @@ $wgShellLocale = "en_US.utf8";
 
 ## Set $wgCacheDirectory to a writable directory on the web server
 ## to make your wiki go slightly faster. The directory should not
-## be publically accessible from the web.
+## be publicly accessible from the web.
 #$wgCacheDirectory = "$IP/cache";
 
 # Site language code, should be one of the list in ./languages/Names.php
diff --git a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh b/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
index b6405ce..e764ddc 100755
--- a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
+++ b/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
@@ -139,7 +139,7 @@ test_expect_success 'character $ in file name (git -> mw) ' '
 '
 
 
-test_expect_failure 'capital at the begining of file names' '
+test_expect_failure 'capital at the beginning of file names' '
 	wiki_reset &&
 	git clone mediawiki::'"$WIKI_URL"' mw_dir_10 &&
 	(
@@ -156,7 +156,7 @@ test_expect_failure 'capital at the begining of file names' '
 '
 
 
-test_expect_failure 'special character at the begining of file name from mw to git' '
+test_expect_failure 'special character at the beginning of file name from mw to git' '
 	wiki_reset &&
 	git clone mediawiki::'"$WIKI_URL"' mw_dir_11 &&
 	wiki_editpage {char_1 "expect to be renamed {char_1" false &&
@@ -207,7 +207,7 @@ test_expect_success 'test of correct formating for file name from mw to git' '
 '
 
 
-test_expect_failure 'test of correct formating for file name begining with special character' '
+test_expect_failure 'test of correct formating for file name beginning with special character' '
 	wiki_reset &&
 	git clone mediawiki::'"$WIKI_URL"' mw_dir_13 &&
 	(
@@ -215,7 +215,7 @@ test_expect_failure 'test of correct formating for file name begining with speci
 		echo "my new file {char_1" >\{char_1.mw &&
 		echo "my new file [char_2" >\[char_2.mw &&
 		git add . &&
-		git commit -am "commiting some exotic file name..." &&
+		git commit -am "committing some exotic file name..." &&
 		git push &&
 		git pull
 	) &&
@@ -234,7 +234,7 @@ test_expect_success 'test of correct formating for file name from git to mw' '
 		echo "my new file char{_1" >Char\{_1.mw &&
 		echo "my new file char[_2" >Char\[_2.mw &&
 		git add . &&
-		git commit -m "commiting some exotic file name..." &&
+		git commit -m "committing some exotic file name..." &&
 		git push
 	) &&
 	wiki_getallpage ref_page_14 &&
diff --git a/contrib/mw-to-git/t/test-gitmw-lib.sh b/contrib/mw-to-git/t/test-gitmw-lib.sh
index 3b2cfac..dbaf47d 100755
--- a/contrib/mw-to-git/t/test-gitmw-lib.sh
+++ b/contrib/mw-to-git/t/test-gitmw-lib.sh
@@ -95,7 +95,7 @@ test_diff_directories () {
 # Check that <dir> contains exactly <N> files
 test_contains_N_files () {
 	if test `ls -- "$1" | wc -l` -ne "$2"; then
-		echo "directory $1 sould contain $2 files"
+		echo "directory $1 should contain $2 files"
 		echo "it contains these files:"
 		ls "$1"
 		false
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 80d3399..4729521 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -419,7 +419,7 @@ test_expect_success 'add 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
+        # then the new subtree has accidentally been attached to something
         git subtree split --prefix subdir2 --branch mainsub5 &&
         check_equal ''"$(git log --pretty=format:%P -1 mainsub5)"'' ""
 '
diff --git a/diff.c b/diff.c
index 156fec4..71ac502 100644
--- a/diff.c
+++ b/diff.c
@@ -1553,7 +1553,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
 	 * Binary files are displayed with "Bin XXX -> YYY bytes"
 	 * instead of the change count and graph. This part is treated
 	 * similarly to the graph part, except that it is not
-	 * "scaled". If total width is too small to accomodate the
+	 * "scaled". If total width is too small to accommodate the
 	 * guaranteed minimum width of the filename part and the
 	 * separators and this message, this message will "overflow"
 	 * making the line longer than the maximum width.
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 710764a..d2c4ce6 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -1247,7 +1247,7 @@ sub summarize_hunk {
 
 
 # Print a one-line summary of each hunk in the array ref in
-# the first argument, starting wih the index in the 2nd.
+# the first argument, starting with the index in the 2nd.
 sub display_hunks {
 	my ($hunks, $i) = @_;
 	my $ctr = 0;
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index 3679074..b50a970 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -2911,7 +2911,7 @@ sub filenamesplit
 }
 
 # Cleanup various junk in filename (try to canonicalize it), and
-# add prependdir to accomodate running CVS client from a
+# add prependdir to accommodate running CVS client from a
 # subdirectory (so the output is relative to top directory of the project).
 sub filecleanup
 {
@@ -4583,7 +4583,7 @@ sub getmeta
     #     the numerical value of the corresponding byte plus
     #     100.
     #      - "plus 100" avoids "0"s, and also reduces the
-    #        likelyhood of a collision in the case that someone someday
+    #        likelihood of a collision in the case that someone someday
     #        writes an import tool that tries to preserve original
     #        CVS revision numbers, and the original CVS data had done
     #        lots of branches off of branches and other strangeness to
diff --git a/git-gui/lib/blame.tcl b/git-gui/lib/blame.tcl
index 324f774..b1d15f4 100644
--- a/git-gui/lib/blame.tcl
+++ b/git-gui/lib/blame.tcl
@@ -5,7 +5,7 @@ class blame {
 
 image create photo ::blame::img_back_arrow -data {R0lGODlhGAAYAIUAAPwCBEzKXFTSZIz+nGzmhGzqfGTidIT+nEzGXHTqhGzmfGzifFzadETCVES+VARWDFzWbHzyjAReDGTadFTOZDSyRDyyTCymPARaFGTedFzSbDy2TCyqRCyqPARaDAyCHES6VDy6VCyiPAR6HCSeNByWLARyFARiDARqFGTifARiFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAYABgAAAajQIBwSCwaj8ikcsk0BppJwRPqHEypQwHBis0WDAdEFyBIKBaMAKLBdjQeSkFBYTBAIvgEoS6JmhUTEwIUDQ4VFhcMGEhyCgoZExoUaxsWHB0THkgfAXUGAhoBDSAVFR0XBnCbDRmgog0hpSIiDJpJIyEQhBUcJCIlwA22SSYVogknEg8eD82qSigdDSknY0IqJQXPYxIl1dZCGNvWw+Dm510GQQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7}
 
-# Persistant data (survives loads)
+# Persistent data (survives loads)
 #
 field history {}; # viewer history: {commit path}
 field header    ; # array commit,key -> header field
diff --git a/git-gui/lib/index.tcl b/git-gui/lib/index.tcl
index 8efbbdd..74a81a7 100644
--- a/git-gui/lib/index.tcl
+++ b/git-gui/lib/index.tcl
@@ -414,7 +414,7 @@ proc revert_helper {txt paths} {
 	# such distinction is needed in some languages. Previously, the
 	# code used "Revert changes in" for both, but that can't work
 	# in languages where 'in' must be combined with word from
-	# rest of string (in diffrent way for both cases of course).
+	# rest of string (in different way for both cases of course).
 	#
 	# FIXME: Unfortunately, even that isn't enough in some languages
 	# as they have quite complex plural-form rules. Unfortunately,
diff --git a/git-gui/lib/spellcheck.tcl b/git-gui/lib/spellcheck.tcl
index e612030..538d61c 100644
--- a/git-gui/lib/spellcheck.tcl
+++ b/git-gui/lib/spellcheck.tcl
@@ -14,7 +14,7 @@ field w_menu      ; # context menu for the widget
 field s_menuidx 0 ; # last index of insertion into $w_menu
 
 field s_i           {} ; # timer registration for _run callbacks
-field s_clear        0 ; # did we erase mispelled tags yet?
+field s_clear        0 ; # did we erase misspelled tags yet?
 field s_seen    [list] ; # lines last seen from $w_text in _run
 field s_checked [list] ; # lines already checked
 field s_pending [list] ; # [$line $data] sent to ispell/aspell
@@ -259,7 +259,7 @@ method _run {} {
 		if {$n == $cur_line
 		 && ![regexp {^\W$} [$w_text get $cur_pos insert]]} {
 
-			# If the current word is mispelled remove the tag
+			# If the current word is misspelled remove the tag
 			# but force a spellcheck later.
 			#
 			set tags [$w_text tag names $cur_pos]
diff --git a/git-quiltimport.sh b/git-quiltimport.sh
index 9a6ba2b..8e17525 100755
--- a/git-quiltimport.sh
+++ b/git-quiltimport.sh
@@ -59,7 +59,7 @@ tmp_patch="$tmp_dir/patch"
 tmp_info="$tmp_dir/info"
 
 
-# Find the intial commit
+# Find the initial commit
 commit=$(git rev-parse HEAD)
 
 mkdir $tmp_dir || exit 2
diff --git a/gitweb/INSTALL b/gitweb/INSTALL
index 6d45406..08f3dda 100644
--- a/gitweb/INSTALL
+++ b/gitweb/INSTALL
@@ -244,7 +244,7 @@ for gitweb (in gitweb/README), and gitweb.conf(5) manpage.
   through the GITWEB_CONFIG_SYSTEM environment variable.
 
   Note that if per-instance configuration file exists, then system-wide
-  configuration is _not used at all_.  This is quite untypical and suprising
+  configuration is _not used at all_.  This is quite untypical and surprising
   behavior.  On the other hand changing current behavior would break backwards
   compatibility and can lead to unexpected changes in gitweb behavior.
   Therefore gitweb also looks for common system-wide configuration file,
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 1309196..80950c0 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -683,7 +683,7 @@ sub evaluate_gitweb_config {
 	our $GITWEB_CONFIG_SYSTEM = $ENV{'GITWEB_CONFIG_SYSTEM'} || "++GITWEB_CONFIG_SYSTEM++";
 	our $GITWEB_CONFIG_COMMON = $ENV{'GITWEB_CONFIG_COMMON'} || "++GITWEB_CONFIG_COMMON++";
 
-	# Protect agains duplications of file names, to not read config twice.
+	# Protect against duplications of file names, to not read config twice.
 	# Only one of $GITWEB_CONFIG and $GITWEB_CONFIG_SYSTEM is used, so
 	# there possibility of duplication of filename there doesn't matter.
 	$GITWEB_CONFIG = ""        if ($GITWEB_CONFIG eq $GITWEB_CONFIG_COMMON);
@@ -1136,7 +1136,7 @@ sub handle_errors_html {
 
 	# to avoid infinite loop where error occurs in die_error,
 	# change handler to default handler, disabling handle_errors_html
-	set_message("Error occured when inside die_error:\n$msg");
+	set_message("Error occurred when inside die_error:\n$msg");
 
 	# you cannot jump out of die_error when called as error handler;
 	# the subroutine set via CGI::Carp::set_message is called _after_
@@ -7485,7 +7485,7 @@ sub git_object {
 		system(git_cmd(), "cat-file", '-e', $hash_base) == 0
 			or die_error(404, "Base object does not exist");
 
-		# here errors should not hapen
+		# here errors should not happen
 		open my $fd, "-|", git_cmd(), "ls-tree", $hash_base, "--", $file_name
 			or die_error(500, "Open git-ls-tree failed");
 		my $line = <$fd>;
diff --git a/kwset.c b/kwset.c
index 51b2ab6..5800999 100644
--- a/kwset.c
+++ b/kwset.c
@@ -26,7 +26,7 @@
    The author may be reached (Email) at the address mike@ai.mit.edu,
    or (US mail) as Mike Haertel c/o Free Software Foundation. */
 
-/* The algorithm implemented by these routines bears a startling resemblence
+/* The algorithm implemented by these routines bears a startling resemblance
    to one discovered by Beate Commentz-Walter, although it is not identical.
    See "A String Matching Algorithm Fast on the Average," Technical Report,
    IBM-Germany, Scientific Center Heidelberg, Tiergartenstrasse 15, D-6900
@@ -435,7 +435,7 @@ kwsprep (kwset_t kws)
 	  /* Update the delta table for the descendents of this node. */
 	  treedelta(curr->links, curr->depth, delta);
 
-	  /* Compute the failure function for the decendents of this node. */
+	  /* Compute the failure function for the descendants of this node. */
 	  treefails(curr->links, curr->fail, kwset->trie);
 
 	  /* Update the shifts at each node in the current node's chain
diff --git a/perl/Git.pm b/perl/Git.pm
index a56d1e7..2adec53 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -1029,7 +1029,7 @@ my (%TEMP_FILEMAP, %TEMP_FILES);
 
 =item temp_acquire ( NAME )
 
-Attempts to retreive the temporary file mapped to the string C<NAME>. If an
+Attempts to retrieve the temporary file mapped to the string C<NAME>. If an
 associated temp file has not been created this session or was closed, it is
 created, cached, and set for autoflush and binmode.
 
diff --git a/perl/Git/I18N.pm b/perl/Git/I18N.pm
index 40dd897..f889fd6 100644
--- a/perl/Git/I18N.pm
+++ b/perl/Git/I18N.pm
@@ -68,7 +68,7 @@ Git::I18N - Perl interface to Git's Gettext localizations
 
 	print __("Welcome to Git!\n");
 
-	printf __("The following error occured: %s\n"), $error;
+	printf __("The following error occurred: %s\n"), $error;
 
 =head1 DESCRIPTION
 
diff --git a/perl/private-Error.pm b/perl/private-Error.pm
index 11e9cd9..9a0c567 100644
--- a/perl/private-Error.pm
+++ b/perl/private-Error.pm
@@ -769,7 +769,7 @@ is a numeric value. These values are what will be returned by the
 overload methods.
 
 If the text value ends with C<at file line 1> as $@ strings do, then
-this infomation will be used to set the C<-file> and C<-line> arguments
+this information will be used to set the C<-file> and C<-line> arguments
 of the error object.
 
 This class is used internally if an eval'd block die's with an error
diff --git a/po/README b/po/README
index c1520e8..d8c9111 100644
--- a/po/README
+++ b/po/README
@@ -232,7 +232,7 @@ Shell:
 
        # To interpolate variables:
        details="oh noes"
-       eval_gettext "An error occured: \$details"; echo
+       eval_gettext "An error occurred: \$details"; echo
 
    In addition we have wrappers for messages that end with a trailing
    newline. I.e. you could write the above as:
@@ -242,7 +242,7 @@ Shell:
 
        # To interpolate variables:
        details="oh noes"
-       eval_gettextln "An error occured: \$details"
+       eval_gettextln "An error occurred: \$details"
 
    More documentation about the interface is available in the GNU info
    page: `info '(gettext)sh'`. Looking at git-am.sh (the first shell
@@ -257,7 +257,7 @@ Perl:
 
        use Git::I18N;
        print __("Welcome to Git!\n");
-       printf __("The following error occured: %s\n"), $error;
+       printf __("The following error occurred: %s\n"), $error;
 
    Run `perldoc perl/Git/I18N.pm` for more info.
 
diff --git a/po/pt_PT.po b/po/pt_PT.po
index 517ec29..d8f5abd 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -1,7 +1,7 @@
 # Portuguese translations for Git package.
 # Copyright (C) 2012 Marco Sousa <marcomsousa AT gmail.com>
 # This file is distributed under the same license as the Git package.
-# Contributers:
+# Contributors:
 #   - Marco Sousa <marcomsousa AT gmail.com>
 #
 msgid ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 6379876..f7e3270 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -2,7 +2,7 @@
 # Git 软件包的简体中文翻译.
 # Copyright (C) 2012,2013 Jiang Xin <worldhello.net AT gmail.com>
 # This file is distributed under the same license as the Git package.
-# Contributers:
+# Contributors:
 #   - Jiang Xin <worldhello.net AT gmail.com>
 #   - Riku <lu.riku AT gmail.com>
 #   - Zhuang Ya <zhuangya AT me.com>
diff --git a/sequencer.c b/sequencer.c
index aef5e8a..bad5077 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -133,7 +133,7 @@ static void print_advice(int show_hint, struct replay_opts *opts)
 	if (msg) {
 		fprintf(stderr, "%s\n", msg);
 		/*
-		 * A conflict has occured but the porcelain
+		 * A conflict has occurred but the porcelain
 		 * (typically rebase --interactive) wants to take care
 		 * of the commit itself so remove CHERRY_PICK_HEAD
 		 */
diff --git a/t/t0022-crlf-rename.sh b/t/t0022-crlf-rename.sh
index 7af3fbc..f702302 100755
--- a/t/t0022-crlf-rename.sh
+++ b/t/t0022-crlf-rename.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-test_description='ignore CR in CRLF sequence while computing similiarity'
+test_description='ignore CR in CRLF sequence while computing similarity'
 
 . ./test-lib.sh
 
diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
index 098a6ae..9fab25c 100755
--- a/t/t3701-add-interactive.sh
+++ b/t/t3701-add-interactive.sh
@@ -319,7 +319,7 @@ test_expect_success PERL 'split hunk "add -p (edit)"' '
 	# times to get out.
 	#
 	# 2. Correct version applies the (not)edited version, and asks
-	#    about the next hunk, against wich we say q and program
+	#    about the next hunk, against which we say q and program
 	#    exits.
 	for a in s e     q n q q
 	do
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 7fa3647..e91e66c 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -742,21 +742,21 @@ test_expect_success 'format-patch --signature --cover-letter' '
 	test 2 = $(grep "my sig" output | wc -l)
 '
 
-test_expect_success 'format.signature="" supresses signatures' '
+test_expect_success 'format.signature="" suppresses signatures' '
 	git config format.signature "" &&
 	git format-patch --stdout -1 >output &&
 	check_patch output &&
 	! grep "^-- \$" output
 '
 
-test_expect_success 'format-patch --no-signature supresses signatures' '
+test_expect_success 'format-patch --no-signature suppresses signatures' '
 	git config --unset-all format.signature &&
 	git format-patch --stdout --no-signature -1 >output &&
 	check_patch output &&
 	! grep "^-- \$" output
 '
 
-test_expect_success 'format-patch --signature="" supresses signatures' '
+test_expect_success 'format-patch --signature="" suppresses signatures' '
 	git format-patch --stdout --signature="" -1 >output &&
 	check_patch output &&
 	! grep "^-- \$" output
diff --git a/t/t4124-apply-ws-rule.sh b/t/t4124-apply-ws-rule.sh
index 6f6ee88..581a801 100755
--- a/t/t4124-apply-ws-rule.sh
+++ b/t/t4124-apply-ws-rule.sh
@@ -47,7 +47,7 @@ test_fix () {
 	# find touched lines
 	$DIFF file target | sed -n -e "s/^> //p" >fixed
 
-	# the changed lines are all expeced to change
+	# the changed lines are all expected to change
 	fixed_cnt=$(wc -l <fixed)
 	case "$1" in
 	'') expect_cnt=$fixed_cnt ;;
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 3e0e15f..8bf99e1 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -190,7 +190,7 @@ test_expect_success 'bisect start: no ".git/BISECT_START" if checkout error' '
 # $HASH1 is good, $HASH4 is bad, we skip $HASH3
 # but $HASH2 is bad,
 # so we should find $HASH2 as the first bad commit
-test_expect_success 'bisect skip: successfull result' '
+test_expect_success 'bisect skip: successful result' '
 	git bisect reset &&
 	git bisect start $HASH4 $HASH1 &&
 	git bisect skip &&
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..3a51878 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -16,7 +16,7 @@ test_expect_success \
 
 # in path0 currently
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'cd .. && git commit -m move-out -a'
 
 test_expect_success \
@@ -30,7 +30,7 @@ test_expect_success \
 
 # in path0 currently
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'cd .. && git commit -m move-in -a'
 
 test_expect_success \
@@ -82,7 +82,7 @@ test_expect_success \
     'git mv path0 path2'
 
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'git commit -m dir-move -a'
 
 test_expect_success \
@@ -101,7 +101,7 @@ test_expect_success \
     'git mv path2 path1'
 
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'git commit -m dir-move -a'
 
 test_expect_success \
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index f5a79b1..4fb28dc 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -75,7 +75,7 @@ test_expect_success \
 
 # todo: git tag -l now returns always zero, when fixed, change this test
 test_expect_success \
-	'listing tags using a non-matching pattern should suceed' \
+	'listing tags using a non-matching pattern should succeed' \
 	'git tag -l xxx'
 
 test_expect_success \
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 5e19598..37cc095 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -316,7 +316,7 @@ test_expect_success 'merge c1 with c2 (squash)' '
 
 test_debug 'git log --graph --decorate --oneline --all'
 
-test_expect_success 'unsuccesful merge of c1 with c2 (squash, ff-only)' '
+test_expect_success 'unsuccessful merge of c1 with c2 (squash, ff-only)' '
 	git reset --hard c1 &&
 	test_must_fail git merge --squash --ff-only c2
 '
diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh
index b44b293..25dac79 100755
--- a/t/t7601-merge-pull-config.sh
+++ b/t/t7601-merge-pull-config.sh
@@ -109,7 +109,7 @@ test_expect_success 'setup conflicted merge' '
 '
 
 # First do the merge with resolve and recursive then verify that
-# recusive is choosen.
+# recusive is chosen.
 
 test_expect_success 'merge picks up the best result' '
 	git config --unset-all pull.twohead &&
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 97d6f4c..feaee8b 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -101,7 +101,7 @@ test_expect_success $PREREQ \
 
 test_expect_success $PREREQ 'Send patches with --envelope-sender' '
     clean_fake_sendmail &&
-     git send-email --envelope-sender="Patch Contributer <patch@example.com>" --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
+     git send-email --envelope-sender="Patch Contributor <patch@example.com>" --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
 '
 
 test_expect_success $PREREQ 'setup expect' '
diff --git a/transport.h b/transport.h
index a3450e9..e7beb81 100644
--- a/transport.h
+++ b/transport.h
@@ -74,7 +74,7 @@ struct transport {
 		       const char *executable, int fd[2]);
 
 	/** get_refs_list(), fetch(), and push_refs() can keep
-	 * resources (such as a connection) reserved for futher
+	 * resources (such as a connection) reserved for further
 	 * use. disconnect() releases these resources.
 	 **/
 	int (*disconnect)(struct transport *connection);
diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c
index 1b7012a..b2eb6db 100644
--- a/xdiff/xdiffi.c
+++ b/xdiff/xdiffi.c
@@ -490,7 +490,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
 
 		/*
 		 * Try to move back the possibly merged group of changes, to match
-		 * the recorded postion in the other file.
+		 * the recorded position in the other file.
 		 */
 		while (ixref < ix) {
 			rchg[--ixs] = 1;
diff --git a/xdiff/xhistogram.c b/xdiff/xhistogram.c
index bf99787..73210cb 100644
--- a/xdiff/xhistogram.c
+++ b/xdiff/xhistogram.c
@@ -55,7 +55,7 @@ struct histindex {
 	struct record {
 		unsigned int ptr, cnt;
 		struct record *next;
-	} **records, /* an ocurrence */
+	} **records, /* an occurrence */
 	  **line_map; /* map of line to record chain */
 	chastore_t rcha;
 	unsigned int *next_ptrs;
-- 
1.7.11.7

^ permalink raw reply related	[relevance 4%]

* XDL_FAST_HASH breaks git on OS X 10.7.3
@ 2012-04-29 20:52  1% Brian Gernhardt
  0 siblings, 0 replies; 200+ results
From: Brian Gernhardt @ 2012-04-29 20:52 UTC (permalink / raw)
  To: Git List, Thomas Rast

I don't mean for the subject to be excessive, but it does cause 242 test files to fail and t9001-send-email.sh to hang by asking "Which 8bit encoding should I declare [UTF-8]?"  Clearing XDL_FAST_HASH in my config.mak does fix the issue.

~~ Brian Gernhardt

Test Summary Report
-------------------
t9700-perl-git.sh                                (Wstat: 256 Tests: 44 Failed: 14)
  Failed tests:  1, 4-5, 8, 10, 13-16, 28-29, 38, 43-44
  Non-zero exit status: 1
t9502-gitweb-standalone-parse-output.sh          (Wstat: 256 Tests: 16 Failed: 7)
  Failed tests:  1-5, 7, 9
  Non-zero exit status: 1
t9501-gitweb-standalone-http-status.sh           (Wstat: 256 Tests: 12 Failed: 2)
  Failed tests:  1, 8
  Non-zero exit status: 1
t9401-git-cvsserver-crlf.sh                      (Wstat: 256 Tests: 17 Failed: 7)
  Failed tests:  7-8, 10-11, 15-17
  Non-zero exit status: 1
t9400-git-cvsserver-server.sh                    (Wstat: 256 Tests: 40 Failed: 3)
  Failed tests:  30-31, 40
  Non-zero exit status: 1
t9350-fast-export.sh                             (Wstat: 256 Tests: 28 Failed: 15)
  Failed tests:  1-5, 10, 12-18, 20-21
  Non-zero exit status: 1
t9139-git-svn-non-utf8-commitencoding.sh         (Wstat: 256 Tests: 6 Failed: 1)
  Failed test:  4
  Non-zero exit status: 1
t9200-git-cvsexportcommit.sh                     (Wstat: 256 Tests: 14 Failed: 11)
  Failed tests:  1-2, 4-8, 10-11, 13-14
  Non-zero exit status: 1
t9500-gitweb-standalone-no-errors.sh             (Wstat: 256 Tests: 117 Failed: 10)
  Failed tests:  35-37, 51, 54, 69, 84-85, 100, 109
  Non-zero exit status: 1
t9137-git-svn-dcommit-clobber-series.sh          (Wstat: 256 Tests: 5 Failed: 1)
  Failed test:  4
  Non-zero exit status: 1
t9125-git-svn-multi-glob-branch-names.sh         (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t9124-git-svn-dcommit-auto-props.sh              (Wstat: 256 Tests: 7 Failed: 3)
  Failed tests:  3, 5-6
  Non-zero exit status: 1
t9118-git-svn-funky-branch-names.sh              (Wstat: 256 Tests: 5 Failed: 2)
  Failed tests:  3-4
  Non-zero exit status: 1
t9114-git-svn-dcommit-merge.sh                   (Wstat: 256 Tests: 6 Failed: 4)
  Failed tests:  2-3, 5-6
  Non-zero exit status: 1
t9116-git-svn-log.sh                             (Wstat: 256 Tests: 17 Failed: 14)
  Failed tests:  1-5, 7-13, 16-17
  Non-zero exit status: 1
t9105-git-svn-commit-diff.sh                     (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t9106-git-svn-commit-diff-clobber.sh             (Wstat: 256 Tests: 10 Failed: 8)
  Failed tests:  1, 3-6, 8-10
  Non-zero exit status: 1
t8007-cat-file-textconv.sh                       (Wstat: 256 Tests: 10 Failed: 5)
  Failed tests:  1, 4-7
  Non-zero exit status: 1
t8006-blame-textconv.sh                          (Wstat: 256 Tests: 16 Failed: 10)
  Failed tests:  1-2, 4-6, 9, 12-14, 16
  Non-zero exit status: 1
t8005-blame-i18n.sh                              (Wstat: 256 Tests: 5 Failed: 5)
  Failed tests:  1-5
  Non-zero exit status: 1
t8003-blame-corner-cases.sh                      (Wstat: 256 Tests: 19 Failed: 3)
  Failed tests:  1, 12-13
  Non-zero exit status: 1
t8002-blame.sh                                   (Wstat: 256 Tests: 21 Failed: 7)
  Failed tests:  5, 10, 14, 16, 18, 20-21
  Non-zero exit status: 1
t8001-annotate.sh                                (Wstat: 256 Tests: 21 Failed: 6)
  Failed tests:  5, 10, 14, 16, 18, 20
  Non-zero exit status: 1
t7810-grep.sh                                    (Wstat: 256 Tests: 108 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t9101-git-svn-props.sh                           (Wstat: 256 Tests: 26 Failed: 13)
  Failed tests:  5, 8-18, 25
  Non-zero exit status: 1
t7611-merge-abort.sh                             (Wstat: 256 Tests: 26 Failed: 9)
  Failed tests:  9-13, 15-16, 24, 26
  Non-zero exit status: 1
t7811-grep-open.sh                               (Wstat: 256 Tests: 10 Failed: 4)
  Failed tests:  2, 5, 8, 10
  Non-zero exit status: 1
t7701-repack-unpack-unreachable.sh               (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t7800-difftool.sh                                (Wstat: 256 Tests: 25 Failed: 25)
  Failed tests:  1-25
  Non-zero exit status: 1
t7610-mergetool.sh                               (Wstat: 256 Tests: 14 Failed: 14)
  Failed tests:  1-14
  Non-zero exit status: 1
t7609-merge-co-error-msgs.sh                     (Wstat: 256 Tests: 6 Failed: 5)
  Failed tests:  1-5
  Non-zero exit status: 1
t7607-merge-overwrite.sh                         (Wstat: 256 Tests: 17 Failed: 12)
  Failed tests:  1-10, 13-14
  Non-zero exit status: 1
t7608-merge-messages.sh                          (Wstat: 256 Tests: 5 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t7509-commit.sh                                  (Wstat: 256 Tests: 12 Failed: 12)
  Failed tests:  1-12
  Non-zero exit status: 1
t7507-commit-verbose.sh                          (Wstat: 256 Tests: 7 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t9100-git-svn-basic.sh                           (Wstat: 256 Tests: 25 Failed: 2)
  Failed tests:  14, 16
  Non-zero exit status: 1
t7506-status-submodule.sh                        (Wstat: 256 Tests: 28 Failed: 4)
  Failed tests:  1, 21, 27-28
  Non-zero exit status: 1
t7501-commit.sh                                  (Wstat: 256 Tests: 45 Failed: 5)
  Failed tests:  20-21, 26-27, 39
  Non-zero exit status: 1
t7500-commit.sh                                  (Wstat: 256 Tests: 32 Failed: 19)
  Failed tests:  1, 8-14, 16, 21, 23-31
  Non-zero exit status: 1
t7502-commit.sh                                  (Wstat: 256 Tests: 45 Failed: 37)
  Failed tests:  2, 4-8, 11-19, 22, 24, 26-45
  Non-zero exit status: 1
t7408-submodule-reference.sh                     (Wstat: 256 Tests: 10 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t7405-submodule-merge.sh                         (Wstat: 256 Tests: 11 Failed: 7)
  Failed tests:  2-8
  Non-zero exit status: 1
t7407-submodule-foreach.sh                       (Wstat: 256 Tests: 15 Failed: 10)
  Failed tests:  3, 5-13
  Non-zero exit status: 1
t7403-submodule-sync.sh                          (Wstat: 256 Tests: 6 Failed: 5)
  Failed tests:  1, 3-6
  Non-zero exit status: 1
t7402-submodule-rebase.sh                        (Wstat: 256 Tests: 5 Failed: 3)
  Failed tests:  2-4
  Non-zero exit status: 1
t7300-clean.sh                                   (Wstat: 256 Tests: 30 Failed: 18)
  Failed tests:  1-6, 11-20, 23-24
  Non-zero exit status: 1
t7201-co.sh                                      (Wstat: 256 Tests: 35 Failed: 7)
  Failed tests:  29-35
  Non-zero exit status: 1
t7406-submodule-update.sh                        (Wstat: 256 Tests: 33 Failed: 23)
  Failed tests:  1-5, 7-14, 20-25, 29-31, 33
  Non-zero exit status: 1
t7105-reset-patch.sh                             (Wstat: 256 Tests: 8 Failed: 8)
  Failed tests:  1-8
  Non-zero exit status: 1
t7110-reset-merge.sh                             (Wstat: 256 Tests: 21 Failed: 21)
  Failed tests:  1-21
  Non-zero exit status: 1
t7101-reset.sh                                   (Wstat: 256 Tests: 10 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t7060-wtstatus.sh                                (Wstat: 256 Tests: 10 Failed: 9)
  Failed tests:  1-4, 6-10
  Non-zero exit status: 1
t7006-pager.sh                                   (Wstat: 256 Tests: 75 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t7004-tag.sh                                     (Wstat: 256 Tests: 121 Failed: 10)
  Failed tests:  104-109, 111-112, 115, 121
  Non-zero exit status: 1
t7001-mv.sh                                      (Wstat: 256 Tests: 29 Failed: 6)
  Failed tests:  1, 3, 6, 12, 14, 18
  Non-zero exit status: 1
t7003-filter-branch.sh                           (Wstat: 256 Tests: 33 Failed: 10)
  Failed tests:  1, 3, 5-6, 12-13, 16, 31-33
  Non-zero exit status: 1
t6050-replace.sh                                 (Wstat: 256 Tests: 16 Failed: 11)
  Failed tests:  2-4, 7-14
  Non-zero exit status: 1
t6120-describe.sh                                (Wstat: 256 Tests: 36 Failed: 31)
  Failed tests:  1-13, 15-24, 26-27, 29-30, 32, 34-36
  Non-zero exit status: 1
t6042-merge-rename-corner-cases.sh               (Wstat: 256 Tests: 26 Failed: 19)
  Failed tests:  1-3, 5, 7, 9, 12-21, 23, 25-26
  Non-zero exit status: 1
t6037-merge-ours-theirs.sh                       (Wstat: 256 Tests: 5 Failed: 4)
  Failed tests:  1-3, 5
  Non-zero exit status: 1
t6036-recursive-corner-cases.sh                  (Wstat: 256 Tests: 22 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t6034-merge-rename-nocruft.sh                    (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t6032-merge-large-rename.sh                      (Wstat: 256 Tests: 10 Failed: 5)
  Failed tests:  2, 4, 7, 9-10
  Non-zero exit status: 1
t6031-merge-recursive.sh                         (Wstat: 256 Tests: 5 Failed: 1)
  Failed test:  5
  Non-zero exit status: 1
t6028-merge-up-to-date.sh                        (Wstat: 256 Tests: 6 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t6026-merge-attr.sh                              (Wstat: 256 Tests: 8 Failed: 7)
  Failed tests:  1-7
  Non-zero exit status: 1
t6029-merge-subtree.sh                           (Wstat: 256 Tests: 8 Failed: 8)
  Failed tests:  1-8
  Non-zero exit status: 1
t6027-merge-binary.sh                            (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t6025-merge-symlinks.sh                          (Wstat: 256 Tests: 7 Failed: 3)
  Failed tests:  1, 4, 6
  Non-zero exit status: 1
t6024-recursive-merge.sh                         (Wstat: 256 Tests: 6 Failed: 5)
  Failed tests:  2-6
  Non-zero exit status: 1
t6023-merge-file.sh                              (Wstat: 256 Tests: 18 Failed: 11)
  Failed tests:  1-5, 8, 10, 12, 16-18
  Non-zero exit status: 1
t6030-bisect-porcelain.sh                        (Wstat: 256 Tests: 53 Failed: 7)
  Failed tests:  35-38, 40-42
  Non-zero exit status: 1
t6022-merge-rename.sh                            (Wstat: 256 Tests: 45 Failed: 45)
  Failed tests:  1-45
  Non-zero exit status: 1
t6018-rev-list-glob.sh                           (Wstat: 256 Tests: 36 Failed: 29)
  Failed tests:  1-6, 9-12, 14-18, 20-27, 29-34
  Non-zero exit status: 1
t6020-merge-df.sh                                (Wstat: 256 Tests: 6 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t6015-rev-list-show-all-parents.sh               (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t6013-rev-list-reverse-parents.sh                (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t6012-rev-list-simplify.sh                       (Wstat: 256 Tests: 9 Failed: 9)
  Failed tests:  1-9
  Non-zero exit status: 1
t6009-rev-list-parent.sh                         (Wstat: 256 Tests: 13 Failed: 12)
  Failed tests:  1-10, 12-13
  Non-zero exit status: 1
t6007-rev-list-cherry-pick-file.sh               (Wstat: 256 Tests: 17 Failed: 16)
  Failed tests:  1-3, 5-17
  Non-zero exit status: 1
t6006-rev-list-format.sh                         (Wstat: 256 Tests: 35 Failed: 2)
  Failed tests:  1, 14
  Non-zero exit status: 1
t6001-rev-list-graft.sh                          (Wstat: 256 Tests: 13 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t6004-rev-list-path-optim.sh                     (Wstat: 256 Tests: 7 Failed: 6)
  Failed tests:  1, 3-7
  Non-zero exit status: 1
t5900-repo-selection.sh                          (Wstat: 256 Tests: 8 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t5800-remote-helpers.sh                          (Wstat: 256 Tests: 14 Failed: 13)
  Failed tests:  1-13
  Non-zero exit status: 1
t5710-info-alternate.sh                          (Wstat: 256 Tests: 11 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
t5708-clone-config.sh                            (Wstat: 256 Tests: 4 Failed: 1)
  Failed test:  4
  Non-zero exit status: 1
t5707-clone-detached.sh                          (Wstat: 256 Tests: 13 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t5704-bundle.sh                                  (Wstat: 256 Tests: 7 Failed: 3)
  Failed tests:  1-2, 7
  Non-zero exit status: 1
t5570-git-daemon.sh                              (Wstat: 256 Tests: 16 Failed: 2)
  Failed tests:  1, 4
  TODO passed:   5
  Non-zero exit status: 1
t5701-clone-local.sh                             (Wstat: 256 Tests: 17 Failed: 1)
  Failed test:  14
  Non-zero exit status: 1
t5700-clone-reference.sh                         (Wstat: 256 Tests: 23 Failed: 10)
  Failed tests:  1-2, 5, 10, 12-13, 15, 17-18, 22
  Non-zero exit status: 1
t5561-http-backend.sh                            (Wstat: 256 Tests: 14 Failed: 13)
  Failed tests:  1, 3-14
  Non-zero exit status: 1
t5560-http-backend-noserver.sh                   (Wstat: 256 Tests: 14 Failed: 13)
  Failed tests:  1, 3-14
  Non-zero exit status: 1
t5551-http-fetch.sh                              (Wstat: 256 Tests: 7 Failed: 3)
  Failed tests:  1, 4-5
  Non-zero exit status: 1
t5550-http-fetch.sh                              (Wstat: 256 Tests: 19 Failed: 3)
  Failed tests:  1, 13-14
  Non-zero exit status: 1
t5532-fetch-proxy.sh                             (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t5541-http-push.sh                               (Wstat: 256 Tests: 21 Failed: 8)
  Failed tests:  10-16, 19
  Non-zero exit status: 1
t5540-http-push.sh                               (Wstat: 256 Tests: 17 Failed: 4)
  Failed tests:  13-16
  Non-zero exit status: 1
t5530-upload-pack-error.sh                       (Wstat: 256 Tests: 10 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t5527-fetch-odd-refs.sh                          (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t5526-fetch-submodules.sh                        (Wstat: 256 Tests: 25 Failed: 25)
  Failed tests:  1-25
  Non-zero exit status: 1
t5524-pull-msg.sh                                (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t5523-push-upstream.sh                           (Wstat: 256 Tests: 17 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t5519-push-alternates.sh                         (Wstat: 256 Tests: 8 Failed: 1)
  Failed test:  8
  Non-zero exit status: 1
t5515-fetch-merge-logic.sh                       (Wstat: 256 Tests: 17 Failed: 17)
  Failed tests:  1-17
  Non-zero exit status: 1
t5520-pull.sh                                    (Wstat: 256 Tests: 21 Failed: 10)
  Failed tests:  6-14, 21
  Non-zero exit status: 1
t5504-fetch-receive-strict.sh                    (Wstat: 256 Tests: 9 Failed: 9)
  Failed tests:  1-9
  Non-zero exit status: 1
t5510-fetch.sh                                   (Wstat: 256 Tests: 40 Failed: 15)
  Failed tests:  2-4, 14-15, 17-19, 31-33, 35-36, 39-40
  Non-zero exit status: 1
t5001-archive-attr.sh                            (Wstat: 256 Tests: 21 Failed: 6)
  Failed tests:  1, 14-15, 17-18, 21
  Non-zero exit status: 1
t5404-tracking-branches.sh                       (Wstat: 256 Tests: 7 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
t4300-merge-tree.sh                              (Wstat: 256 Tests: 14 Failed: 14)
  Failed tests:  1-14
  Non-zero exit status: 1
t5506-remote-groups.sh                           (Wstat: 256 Tests: 8 Failed: 7)
  Failed tests:  2-8
  Non-zero exit status: 1
t4253-am-keep-cr-dos.sh                          (Wstat: 256 Tests: 7 Failed: 7)
  Failed tests:  1-7
  Non-zero exit status: 1
t4208-log-magic-pathspec.sh                      (Wstat: 256 Tests: 5 Failed: 2)
  Failed tests:  1, 5
  Non-zero exit status: 1
t4206-log-follow-harder-copies.sh                (Wstat: 256 Tests: 5 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t4202-log.sh                                     (Wstat: 256 Tests: 32 Failed: 3)
  Failed tests:  26-27, 32
  Non-zero exit status: 1
t4203-mailmap.sh                                 (Wstat: 256 Tests: 12 Failed: 3)
  Failed tests:  10-12
  Non-zero exit status: 1
t4209-log-pickaxe.sh                             (Wstat: 256 Tests: 18 Failed: 7)
  Failed tests:  1, 7-12
  Non-zero exit status: 1
t4200-rerere.sh                                  (Wstat: 256 Tests: 25 Failed: 17)
  Failed tests:  6-9, 11, 13-24
  Non-zero exit status: 1
t4152-am-subjects.sh                             (Wstat: 256 Tests: 13 Failed: 4)
  Failed tests:  2, 5-7
  Non-zero exit status: 1
t4150-am.sh                                      (Wstat: 256 Tests: 36 Failed: 31)
  Failed tests:  2-6, 8-24, 27-35
  Non-zero exit status: 1
t4130-apply-criss-cross-rename.sh                (Wstat: 256 Tests: 7 Failed: 5)
  Failed tests:  1, 3-4, 6-7
  Non-zero exit status: 1
t4128-apply-root.sh                              (Wstat: 256 Tests: 7 Failed: 6)
  Failed tests:  1, 3-7
  Non-zero exit status: 1
t4125-apply-ws-fuzz.sh                           (Wstat: 256 Tests: 4 Failed: 4)
  Failed tests:  1-4
  Non-zero exit status: 1
t4122-apply-symlink-inside.sh                    (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  2-3
  Non-zero exit status: 1
t4123-apply-shrink.sh                            (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t4115-apply-symlink.sh                           (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t4124-apply-ws-rule.sh                           (Wstat: 256 Tests: 74 Failed: 54)
  Failed tests:  1-3, 5-55
  Non-zero exit status: 1
t4114-apply-typechange.sh                        (Wstat: 256 Tests: 11 Failed: 7)
  Failed tests:  1-5, 10-11
  Non-zero exit status: 1
t4106-apply-stdin.sh                             (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t4103-apply-binary.sh                            (Wstat: 256 Tests: 20 Failed: 12)
  Failed tests:  1-3, 8-9, 14-20
  Non-zero exit status: 1
t4051-diff-function-context.sh                   (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  2-3
  Non-zero exit status: 1
t4050-diff-histogram.sh                          (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t4048-diff-combined-binary.sh                    (Wstat: 256 Tests: 14 Failed: 9)
  Failed tests:  5-8, 10-14
  Non-zero exit status: 1
t4047-diff-dirstat.sh                            (Wstat: 256 Tests: 40 Failed: 37)
  Failed tests:  1-2, 4-37, 40
  Non-zero exit status: 1
t4045-diff-relative.sh                           (Wstat: 256 Tests: 10 Failed: 6)
  Failed tests:  1-4, 6-7
  Non-zero exit status: 1
t4044-diff-index-unique-abbrev.sh                (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t4042-diff-textconv-caching.sh                   (Wstat: 256 Tests: 6 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t4038-diff-combined.sh                           (Wstat: 256 Tests: 4 Failed: 3)
  Failed tests:  1, 3-4
  Non-zero exit status: 1
t4037-diff-r-t-dirs.sh                           (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t4033-diff-patience.sh                           (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t4030-diff-textconv.sh                           (Wstat: 256 Tests: 11 Failed: 1)
  Failed test:  11
  Non-zero exit status: 1
t4027-diff-submodule.sh                          (Wstat: 256 Tests: 22 Failed: 20)
  Failed tests:  1-18, 20, 22
  Non-zero exit status: 1
t4034-diff-words.sh                              (Wstat: 256 Tests: 36 Failed: 27)
  Failed tests:  3-8, 10-11, 13-15, 17-18, 21-34
  Non-zero exit status: 1
t4028-format-patch-mime-headers.sh               (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t4025-hunk-header.sh                             (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
t4024-diff-optimize-common.sh                    (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
t4023-diff-rename-typechange.sh                  (Wstat: 256 Tests: 4 Failed: 4)
  Failed tests:  1-4
  Non-zero exit status: 1
t4022-diff-rewrite.sh                            (Wstat: 256 Tests: 6 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t4020-diff-external.sh                           (Wstat: 256 Tests: 16 Failed: 13)
  Failed tests:  1-12, 16
  Non-zero exit status: 1
t4019-diff-wserror.sh                            (Wstat: 256 Tests: 21 Failed: 1)
  Failed test:  20
  Non-zero exit status: 1
t4018-diff-funcname.sh                           (Wstat: 256 Tests: 41 Failed: 39)
  Failed tests:  1-29, 31-38, 40-41
  Non-zero exit status: 1
t4017-diff-retval.sh                             (Wstat: 256 Tests: 24 Failed: 4)
  Failed tests:  20-21, 23-24
  Non-zero exit status: 1
t4016-diff-quote.sh                              (Wstat: 256 Tests: 5 Failed: 1)
  Failed test:  5
  Non-zero exit status: 1
t4015-diff-whitespace.sh                         (Wstat: 256 Tests: 56 Failed: 27)
  Failed tests:  1, 4, 12-16, 19-30, 35-37, 47-48, 52, 54
                56
  Non-zero exit status: 1
t4011-diff-symlink.sh                            (Wstat: 256 Tests: 8 Failed: 4)
  Failed tests:  1, 3-5
  Non-zero exit status: 1
t4014-format-patch.sh                            (Wstat: 256 Tests: 73 Failed: 12)
  Failed tests:  62-73
  Non-zero exit status: 1
t4004-diff-rename-symlink.sh                     (Wstat: 256 Tests: 4 Failed: 1)
  Failed test:  4
  Non-zero exit status: 1
t4003-diff-rename-1.sh                           (Wstat: 256 Tests: 7 Failed: 3)
  Failed tests:  3, 5, 7
  Non-zero exit status: 1
t4001-diff-rename.sh                             (Wstat: 256 Tests: 8 Failed: 4)
  Failed tests:  4-7
  Non-zero exit status: 1
t4000-diff-format.sh                             (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  2-3
  Non-zero exit status: 1
t3904-stash-patch.sh                             (Wstat: 256 Tests: 6 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t3902-quoted.sh                                  (Wstat: 256 Tests: 13 Failed: 5)
  Failed tests:  1, 4-5, 10-11
  Non-zero exit status: 1
t3900-i18n-commit.sh                             (Wstat: 256 Tests: 30 Failed: 2)
  Failed tests:  5, 29
  Non-zero exit status: 1
t3800-mktag.sh                                   (Wstat: 256 Tests: 26 Failed: 17)
  Failed tests:  1, 11-26
  Non-zero exit status: 1
t3702-add-edit.sh                                (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t3903-stash.sh                                   (Wstat: 256 Tests: 45 Failed: 14)
  Failed tests:  12, 18-20, 22-30, 45
  Non-zero exit status: 1
t3600-rm.sh                                      (Wstat: 256 Tests: 36 Failed: 3)
  Failed tests:  18-19, 28
  Non-zero exit status: 1
t3510-cherry-pick-sequence.sh                    (Wstat: 256 Tests: 39 Failed: 35)
  Failed tests:  1-5, 8-19, 21-35, 37-39
  Non-zero exit status: 1
t3508-cherry-pick-many-commits.sh                (Wstat: 256 Tests: 10 Failed: 10)
  Failed tests:  1-10
  Non-zero exit status: 1
t3509-cherry-pick-merge-df.sh                    (Wstat: 256 Tests: 9 Failed: 6)
  Failed tests:  4-9
  Non-zero exit status: 1
t3506-cherry-pick-ff.sh                          (Wstat: 256 Tests: 10 Failed: 4)
  Failed tests:  1-3, 10
  Non-zero exit status: 1
t3505-cherry-pick-empty.sh                       (Wstat: 256 Tests: 5 Failed: 3)
  Failed tests:  1-2, 4
  Non-zero exit status: 1
t3504-cherry-pick-rerere.sh                      (Wstat: 256 Tests: 6 Failed: 4)
  Failed tests:  2-5
  Non-zero exit status: 1
t3701-add-interactive.sh                         (Wstat: 256 Tests: 35 Failed: 15)
  Failed tests:  2, 4-5, 7, 9-10, 16, 18, 21-25, 29, 31
  Non-zero exit status: 1
t3500-cherry.sh                                  (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t3503-cherry-pick-root.sh                        (Wstat: 256 Tests: 6 Failed: 5)
  Failed tests:  1-2, 4-6
  Non-zero exit status: 1
t3418-rebase-continue.sh                         (Wstat: 256 Tests: 6 Failed: 1)
  Failed test:  6
  Non-zero exit status: 1
t3417-rebase-whitespace-fix.sh                   (Wstat: 256 Tests: 4 Failed: 3)
  Failed tests:  2-4
  Non-zero exit status: 1
t3413-rebase-hook.sh                             (Wstat: 256 Tests: 15 Failed: 13)
  Failed tests:  1-3, 5-10, 12-15
  Non-zero exit status: 1
t3409-rebase-preserve-merges.sh                  (Wstat: 256 Tests: 5 Failed: 5)
  Failed tests:  1-5
  Non-zero exit status: 1
t3408-rebase-multi-line.sh                       (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t3410-rebase-preserve-dropped-merges.sh          (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  2-3
  Non-zero exit status: 1
t3405-rebase-malformed.sh                        (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t3402-rebase-merge.sh                            (Wstat: 256 Tests: 10 Failed: 8)
  Failed tests:  2-4, 6-10
  Non-zero exit status: 1
t3403-rebase-skip.sh                             (Wstat: 256 Tests: 10 Failed: 8)
  Failed tests:  1-2, 4-8, 10
  Non-zero exit status: 1
t3311-notes-merge-fanout.sh                      (Wstat: 256 Tests: 24 Failed: 24)
  Failed tests:  1-24
  Non-zero exit status: 1
t3310-notes-merge-manual-resolve.sh              (Wstat: 256 Tests: 18 Failed: 4)
  Failed tests:  5, 11, 13, 15
  Non-zero exit status: 1
t3400-rebase.sh                                  (Wstat: 256 Tests: 26 Failed: 16)
  Failed tests:  1, 5-8, 12-16, 18-23
  Non-zero exit status: 1
t3300-funny-names.sh                             (Wstat: 256 Tests: 27 Failed: 5)
  Failed tests:  20, 22, 24, 26-27
  Non-zero exit status: 1
t3210-pack-refs.sh                               (Wstat: 256 Tests: 13 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t3203-branch-output.sh                           (Wstat: 256 Tests: 12 Failed: 11)
  Failed tests:  1-10, 12
  Non-zero exit status: 1
t3200-branch.sh                                  (Wstat: 256 Tests: 77 Failed: 6)
  Failed tests:  1, 6, 39, 42, 70, 72
  Non-zero exit status: 1
t3060-ls-files-with-tree.sh                      (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t3031-merge-criscross.sh                         (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t3030-merge-recursive.sh                         (Wstat: 256 Tests: 31 Failed: 27)
  Failed tests:  1-26, 30
  Non-zero exit status: 1
t3032-merge-recursive-options.sh                 (Wstat: 256 Tests: 11 Failed: 11)
  Failed tests:  1-11
  Non-zero exit status: 1
t3003-ls-files-exclude.sh                        (Wstat: 256 Tests: 7 Failed: 3)
  Failed tests:  1, 3, 6
  Non-zero exit status: 1
t2202-add-addremove.sh                           (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t2203-add-intent.sh                              (Wstat: 256 Tests: 7 Failed: 2)
  Failed tests:  5-6
  Non-zero exit status: 1
t2200-add-update.sh                              (Wstat: 256 Tests: 16 Failed: 3)
  Failed tests:  1, 3, 5
  Non-zero exit status: 1
t2105-update-index-gitfile.sh                    (Wstat: 256 Tests: 4 Failed: 2)
  Failed tests:  1, 3
  Non-zero exit status: 1
t2101-update-index-reupdate.sh                   (Wstat: 256 Tests: 7 Failed: 1)
  Failed test:  4
  Non-zero exit status: 1
t2050-git-dir-relative.sh                        (Wstat: 256 Tests: 4 Failed: 3)
  Failed tests:  2-4
  Non-zero exit status: 1
t2030-unresolve-info.sh                          (Wstat: 256 Tests: 8 Failed: 8)
  Failed tests:  1-8
  Non-zero exit status: 1
t2023-checkout-m.sh                              (Wstat: 256 Tests: 4 Failed: 4)
  Failed tests:  1-4
  Non-zero exit status: 1
t2022-checkout-paths.sh                          (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t2020-checkout-detach.sh                         (Wstat: 256 Tests: 19 Failed: 9)
  Failed tests:  1-7, 13-14
  Non-zero exit status: 1
t2019-checkout-ambiguous-ref.sh                  (Wstat: 256 Tests: 9 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t2018-checkout-branch.sh                         (Wstat: 256 Tests: 18 Failed: 15)
  Failed tests:  1, 3-7, 9-10, 12-18
  Non-zero exit status: 1
t3404-rebase-interactive.sh                      (Wstat: 256 Tests: 51 Failed: 22)
  Failed tests:  1, 11, 25-26, 30, 33-41, 43-49, 51
  Non-zero exit status: 1
t2017-checkout-orphan.sh                         (Wstat: 256 Tests: 12 Failed: 6)
  Failed tests:  1-3, 7-9
  Non-zero exit status: 1
t2015-checkout-unborn.sh                         (Wstat: 256 Tests: 5 Failed: 2)
  Failed tests:  1, 4
  Non-zero exit status: 1
t2016-checkout-patch.sh                          (Wstat: 256 Tests: 14 Failed: 14)
  Failed tests:  1-14
  Non-zero exit status: 1
t2014-switch.sh                                  (Wstat: 256 Tests: 4 Failed: 2)
  Failed tests:  1, 3
  Non-zero exit status: 1
t2013-checkout-submodule.sh                      (Wstat: 256 Tests: 6 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t2011-checkout-invalid-head.sh                   (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t2012-checkout-last.sh                           (Wstat: 256 Tests: 18 Failed: 10)
  Failed tests:  1, 3-5, 7-8, 15-18
  Non-zero exit status: 1
t2010-checkout-ambiguous.sh                      (Wstat: 256 Tests: 8 Failed: 5)
  Failed tests:  1, 3, 6-8
  Non-zero exit status: 1
t2009-checkout-statinfo.sh                       (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t2008-checkout-subdir.sh                         (Wstat: 256 Tests: 8 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t2007-checkout-symlink.sh                        (Wstat: 256 Tests: 4 Failed: 2)
  Failed tests:  1, 4
  Non-zero exit status: 1
t1508-at-combinations.sh                         (Wstat: 256 Tests: 11 Failed: 9)
  Failed tests:  1-9
  Non-zero exit status: 1
t1412-reflog-loop.sh                             (Wstat: 256 Tests: 3 Failed: 3)
  Failed tests:  1-3
  Non-zero exit status: 1
t1506-rev-parse-diagnosis.sh                     (Wstat: 256 Tests: 17 Failed: 4)
  Failed tests:  1-2, 11-12
  Non-zero exit status: 1
t1411-reflog-show.sh                             (Wstat: 256 Tests: 10 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t1410-reflog.sh                                  (Wstat: 256 Tests: 12 Failed: 12)
  Failed tests:  1-12
  Non-zero exit status: 1
t1501-worktree.sh                                (Wstat: 256 Tests: 31 Failed: 3)
  Failed tests:  23, 26, 28
  Non-zero exit status: 1
t1400-update-ref.sh                              (Wstat: 256 Tests: 41 Failed: 2)
  Failed tests:  37-38
  Non-zero exit status: 1
t1401-symbolic-ref.sh                            (Wstat: 256 Tests: 4 Failed: 1)
  Failed test:  4
  Non-zero exit status: 1
t1021-rerere-in-workdir.sh                       (Wstat: 256 Tests: 3 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t1004-read-tree-m-u-wf.sh                        (Wstat: 256 Tests: 17 Failed: 9)
  Failed tests:  9-17
  Non-zero exit status: 1
t1200-tutorial.sh                                (Wstat: 256 Tests: 27 Failed: 17)
  Failed tests:  3-4, 6-8, 12-13, 15-24
  Non-zero exit status: 1
t1005-read-tree-reset.sh                         (Wstat: 256 Tests: 6 Failed: 6)
  Failed tests:  1-6
  Non-zero exit status: 1
t0026-eol-config.sh                              (Wstat: 256 Tests: 5 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t1002-read-tree-m-u-2way.sh                      (Wstat: 256 Tests: 22 Failed: 6)
  Failed tests:  3-4, 6, 13-14, 18
  Non-zero exit status: 1
t0025-crlf-auto.sh                               (Wstat: 256 Tests: 11 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
t1001-read-tree-m-2way.sh                        (Wstat: 256 Tests: 28 Failed: 4)
  Failed tests:  3-4, 13-14
  Non-zero exit status: 1
t0020-crlf.sh                                    (Wstat: 256 Tests: 34 Failed: 12)
  Failed tests:  1, 10-17, 21, 25-26
  Non-zero exit status: 1
t0022-crlf-rename.sh                             (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t0000-basic.sh                                   (Wstat: 256 Tests: 48 Failed: 1)
  Failed test:  43
  Non-zero exit status: 1
t7008-grep-binary.sh                             (Wstat: 0 Tests: 20 Failed: 0)
  TODO passed:   12
t0050-filesystem.sh                              (Wstat: 0 Tests: 10 Failed: 0)
  TODO passed:   6
Files=579, Tests=8561, 893 wallclock secs ( 6.48 usr  2.29 sys + 349.46 cusr 473.32 csys = 831.55 CPU)
Result: FAIL

^ permalink raw reply	[relevance 1%]

* [PATCH] Allow git mv FILENAME Filename when core.ignorecase = true
@ 2011-04-10  5:50  9% Torsten Bögershausen
  0 siblings, 0 replies; 200+ results
From: Torsten Bögershausen @ 2011-04-10  5:50 UTC (permalink / raw)
  To: git; +Cc: tboegi

Motivation:
The typical use case is when a file named "FILENAME" should be
renamed into "Filename" and we are on a case ignoring file system
(core.ignorecase = true).

Using "mv FILENAME Filename" outside git succeeds,
(on Windows and MAC OS X, under Linux the mv command rejects
"mv: `Filename' and `FILENAME' are the same file").

"git mv FILENAME Filename" is refused, "fatal: destination exists",
unless "git mv --forced FILENAME Filename" is used.
The underlying file system makes git think that the
destination "Filename" exists.

The following discussion assumes, that we are on a
"case ignoring" file system, and core.ignorecase = true.

This change allows "git mv FILENAME Filename".
Using non ASCII works as well, like "git mv MÄRCHEN Märchen".
The ambition is that "git mv FILENAME Filename" changes both
the git index and the filename in the working tree,
in the same way how "git mv Filename NewFile" works.
Note: Under Linux+vfat The rename() function does not the rename
in the working directory.

Implementation details:
A possible approach to allow the "git mv FILENAME Filename"
is to compare both file names using strcasecmp().

This works for filenames where all characters are ASCII,
It will fail for "git mv MÄRCHEN Märchen".

Git has now idea about the encoding of filenames
(like UTF-8, ISO-8859-1 or any other).
Neither has strcasecmp() an idea how to handle non ASCII characters.

With this patch git lets the underlying file system decide
if 2 file names refer to the same file.

Remember that the file system does this already, by returning the
same values for lstat("FILENAME") and lstat("Filename").

By comparing all members in "struct stat" we can be sure that
both filenames point out the same file.
This is done in the function "equivalent_filenames()".

As lstat() on Windows (mingw.c or cygwin.c) sets st_ino to 0,
(and st_dev and other fields in struct stat)
we need other checks when running under Windows.

Therefore a different implementation of equivalent_filenames() is used
under Windows.
It uses GetFileInformationByHandle() to get and compare
dwVolumeSerialNumber, nFileIndexLow and nFileIndexHigh.
It uses even lstat(), since Windows reports the same nFileIndexLow/High for
a file and a softlink (under cygwin) pointing to it.

To summarize:
equivalent_filenames() is OS specific and checks under Windows:
dwVolumeSerialNumber, nFileIndexLow/High, st_mode, st_size,
st_atime and st_mtime.
All other OS check
st_mode, st_dev, st_ino, st_uid, st_gid, st_size, st_atime, st_mtime.

As a bonus (or regression), a file name can be renamed to a file name
which is already hard-linked to the same inode.

Signed-off-by: Torsten Bögershausen <tboegi@web.de>
---
 builtin/mv.c      |   10 +++++++-
 compat/cygwin.c   |   44 ++++++++++++++++++++++++++++++++++++++++
 compat/cygwin.h   |    3 ++
 compat/mingw.c    |   33 ++++++++++++++++++++++++++++++
 compat/mingw.h    |    3 ++
 git-compat-util.h |   17 +++++++++++++++
 t/t7001-mv.sh     |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 t/test-lib.sh     |    4 +++
 8 files changed, 169 insertions(+), 2 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 40f33ca..7be7d8a 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -165,14 +165,20 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		} else if (cache_name_pos(src, length) < 0)
 			bad = _("not under version control");
 		else if (lstat(dst, &st) == 0) {
+			int allow_force = force;
 			bad = _("destination exists");
-			if (force) {
+			if (!force && ignore_case && equivalent_filenames(src, dst)) {
+				allow_force = 1;
+				bad = NULL;
+			}
+			if (allow_force) {
 				/*
 				 * only files can overwrite each other:
 				 * check both source and destination
 				 */
 				if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-					warning(_("%s; will overwrite!"), bad);
+					if (bad)
+						warning(_("%s; will overwrite!"), bad);
 					bad = NULL;
 				} else
 					bad = _("Cannot overwrite");
diff --git a/compat/cygwin.c b/compat/cygwin.c
index b4a51b9..4fdd94a 100644
--- a/compat/cygwin.c
+++ b/compat/cygwin.c
@@ -1,6 +1,7 @@
 #define WIN32_LEAN_AND_MEAN
 #include "../git-compat-util.h"
 #include "win32.h"
+#include <io.h>
 #include "../cache.h" /* to read configuration */
 
 static inline void filetime_to_timespec(const FILETIME *ft, struct timespec *ts)
@@ -85,6 +86,49 @@ static int cygwin_stat(const char *path, struct stat *buf)
 	return do_stat(path, buf, stat);
 }
 
+int cygwin_equivalent_filenames(const char *a, const char *b)
+{
+	int fd;
+	BY_HANDLE_FILE_INFORMATION hia, hib;
+	HANDLE h;
+	struct stat st_a, st_b;
+
+	if (lstat(a, &st_a) || lstat(b, &st_b))
+		return 0;
+
+	fd = open(a, O_RDONLY);
+	if (-1 == fd)
+		return 0;
+
+	h = (HANDLE)get_osfhandle(fd);
+	if (INVALID_HANDLE_VALUE == h)
+		return 0;
+
+	if (!(GetFileInformationByHandle(h,&hia)))
+		return 0;
+	CloseHandle(h);
+	close(fd);
+
+	fd = open(b, O_RDONLY);
+	if (-1 == fd)
+		return 0;
+
+	h = (HANDLE)get_osfhandle(fd);
+	if (INVALID_HANDLE_VALUE == h)
+		return 0;
+	if (!(GetFileInformationByHandle(h,&hib)))
+		return 0;
+	CloseHandle(h);
+	close(fd);
+
+	return st_a.st_mode == st_b.st_mode &&
+	       st_a.st_size == st_b.st_size &&
+	       st_a.st_atime == st_b.st_atime &&
+	       st_a.st_mtime == st_b.st_mtime &&
+	       hia.dwVolumeSerialNumber == hib.dwVolumeSerialNumber &&
+	       hia.nFileIndexLow == hib.nFileIndexLow &&
+	       hia.nFileIndexHigh == hib.nFileIndexHigh;
+}
 
 /*
  * At start up, we are trying to determine whether Win32 API or cygwin stat
diff --git a/compat/cygwin.h b/compat/cygwin.h
index a3229f5..04cc17e 100644
--- a/compat/cygwin.h
+++ b/compat/cygwin.h
@@ -7,3 +7,6 @@ extern stat_fn_t cygwin_lstat_fn;
 
 #define stat(path, buf) (*cygwin_stat_fn)(path, buf)
 #define lstat(path, buf) (*cygwin_lstat_fn)(path, buf)
+
+int cygwin_equivalent_filenames(const char *a, const char *b);
+#define equivalent_filenames cygwin_equivalent_filenames
diff --git a/compat/mingw.c b/compat/mingw.c
index 878b1de..56be81a 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -474,6 +474,39 @@ int mingw_fstat(int fd, struct stat *buf)
 	return -1;
 }
 
+int mingw_equivalent_filenames(const char *a, const char *b)
+{
+	BY_HANDLE_FILE_INFORMATION hia, hib;
+	HANDLE h;
+	struct stat st_a, st_b;
+
+	if (lstat(a, &st_a) || lstat(b, &st_b))
+		return 0;
+
+	h = CreateFile(a, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
+	if (INVALID_HANDLE_VALUE == h)
+		return 0;
+
+	if (!(GetFileInformationByHandle(h,&hia)))
+		return 0;
+	CloseHandle(h);
+
+	h = CreateFile(b, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
+	if (INVALID_HANDLE_VALUE == h)
+		return 0;
+	if (!(GetFileInformationByHandle(h,&hib)))
+		return 0;
+	CloseHandle(h);
+
+	return st_a.st_mode == st_b.st_mode &&
+	       st_a.st_size == st_b.st_size &&
+	       st_a.st_atime == st_b.st_atime &&
+	       st_a.st_mtime == st_b.st_mtime &&
+	       hia.dwVolumeSerialNumber == hib.dwVolumeSerialNumber &&
+	       hia.nFileIndexLow == hib.nFileIndexLow &&
+	       hia.nFileIndexHigh == hib.nFileIndexHigh;
+}
+
 static inline void time_t_to_filetime(time_t t, FILETIME *ft)
 {
 	long long winTime = t * 10000000LL + 116444736000000000LL;
diff --git a/compat/mingw.h b/compat/mingw.h
index 62eccd3..3445104 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -303,6 +303,9 @@ int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format
 void mingw_open_html(const char *path);
 #define open_html mingw_open_html
 
+int mingw_equivalent_filenames(const char *a, const char *b);
+#define equivalent_filenames mingw_equivalent_filenames
+
 /*
  * helpers
  */
diff --git a/git-compat-util.h b/git-compat-util.h
index 40498b3..d66cffe 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -567,4 +567,21 @@ int rmdir_or_warn(const char *path);
  */
 int remove_or_warn(unsigned int mode, const char *path);
 
+#ifndef equivalent_filenames
+static inline int equivalent_filenames(const char *a, const char *b) {
+	struct stat st_a, st_b;
+	if (lstat(a, &st_a) || lstat(b, &st_b))
+		return 0;
+
+	return st_a.st_mode == st_b.st_mode &&
+	       st_a.st_dev == st_b.st_dev &&
+	       st_a.st_ino == st_b.st_ino &&
+	       st_a.st_uid == st_b.st_uid &&
+	       st_a.st_gid == st_b.st_gid &&
+	       st_a.st_size == st_b.st_size &&
+	       st_a.st_atime == st_b.st_atime &&
+	       st_a.st_mtime == st_b.st_mtime;
+}
+#endif
+
 #endif
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..0c4b96a 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,61 @@ test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
 
 rm -f moved symlink
 
+unset encoding
+ae_upper_asc=AE
+ae_lower_asc=ae
+ae_upper_utf8=$(printf '\303\206')
+ae_lower_utf8=$(printf '\303\246')
+
+for enc in utf8 asc ; do
+	eval ae_lower=\$ae_lower_$enc
+	eval ae_upper=\$ae_upper_$enc
+	if (>./$ae_lower && echo broken > ./$ae_upper && test x"$(cat $ae_lower)" = xbroken ) 2>/dev/null ; then
+		if err=$(mv $ae_lower $ae_upper 2>&1); then
+			unset err
+			encoding=$enc
+			break
+		fi
+	else
+		err="case sensitive file system"
+	fi
+done
+
+if test -n "$encoding"; then
+	test_expect_success "git mv AE ae $encoding" '
+		rm -fr .git * &&
+		git init &&
+		echo $encoding > $ae_upper &&
+		git add $ae_upper &&
+		git commit -m "add AE" &&
+		git mv $ae_upper $ae_lower &&
+		git commit -m "mv AE ae" &&
+		rm -f $ae_upper $ae_lower &&
+		git reset --hard &&
+		test "$(echo *)" = $ae_lower
+	'
+else
+	say "Skipping 'git mv AE ae' $err ($enc)"
+fi
+
+test_expect_success HARDLINKS 'git mv FILE File HARDLINKED' '
+	rm -fr .git * &&
+	git init &&
+	git config core.ignorecase true &&
+	echo FILE > FILE &&
+	git add FILE &&
+	git commit -m add FILE &&
+	{
+		if ! test -f File; then
+			ln FILE File
+		fi
+	} &&
+	git mv FILE File &&
+	git commit -m "mv FILE File" &&
+	rm -f FILE File &&
+	git reset --hard &&
+	test "$(echo *)" = File
+'
+
+
 test_done
diff --git a/t/test-lib.sh b/t/test-lib.sh
index abc47f3..8c71583 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -1080,6 +1080,10 @@ fi
 # test whether the filesystem supports symbolic links
 ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
 rm -f y
+# test whether the filesystem supports hard links
+>x
+ln x y 2>/dev/null && test -f y 2>/dev/null && test_set_prereq HARDLINKS
+rm -f x y
 
 # When the tests are run as root, permission tests will report that
 # things are writable when they shouldn't be.
-- 
1.7.4.3

^ permalink raw reply related	[relevance 9%]

* Re: [PATCH] Allow git mv FileA fILEa when core.ignorecase = true
  2011-03-16 13:18  0%   ` Erik Faye-Lund
@ 2011-03-19 14:28  0%     ` Torsten Bögershausen
  0 siblings, 0 replies; 200+ results
From: Torsten Bögershausen @ 2011-03-19 14:28 UTC (permalink / raw)
  To: kusmabite, git; +Cc: Torsten Bögershausen

On 16.03.11 14:18, Erik Faye-Lund wrote:
> 2011/3/16 Erik Faye-Lund <kusmabite@gmail.com>:
>> 2011/3/4 Torsten Bögershausen <tboegi@web.de>:
>>>    The typical use case is when a file "FileA" should be renamed into fILEa
>>>    and we are on a case insenstive file system (system core.ignorecase = true).
>>>    Source and destination are the same file, it can be accessed under both names.
>>>    This makes git think that the destination file exists.
>>>    Unless used with --forced, git will refuse the "git mv FileA fILEa".
>>>    This change will allow "git mv FileA fILEa", when core.ignorecase = true
>>>    and source and destination filenames only differ in case and the file length
>>>    is identical.
>>>    On Linux/Unix/Mac OS X the mv is allowed when the inode of the source and
>>>    destination are equal.
>>>    On  this allows renames of MÄRCHEN into Märchen on Mac OS X.
>>>    (As a side effect, a file can be renamed to a name which is already
>>>    hard-linked to the same inode)
>>>
>>> Signed-off-by: Torsten Bögershausen <tboegi@web.de>
>>> ---
>>>  builtin/mv.c  |   20 +++++++++++++++-----
>>>  t/t7001-mv.sh |   29 +++++++++++++++++++++++++++++
>>>  2 files changed, 44 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/builtin/mv.c b/builtin/mv.c
>>> index 93e8995..e0aad62 100644
>>> --- a/builtin/mv.c
>>> +++ b/builtin/mv.c
>>> @@ -62,7 +62,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>>>        };
>>>        const char **source, **destination, **dest_path;
>>>        enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
>>> -       struct stat st;
>>> +       struct stat st, st_dst;
>>>        struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
>>>
>>>        git_config(git_default_config, NULL);
>>> @@ -164,15 +164,25 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>>>                        }
>>>                } else if (cache_name_pos(src, length) < 0)
>>>                        bad = "not under version control";
>>> -               else if (lstat(dst, &st) == 0) {
>>> +               else if (lstat(dst, &st_dst) == 0) {
>>> +                       int allow_force = force;
>>>                        bad = "destination exists";
>>> -                       if (force) {
>>> +                       /* Allow when src and dst have the same inode (Mac OS X) */
>>> +                       /* Allow when ignore_case and same file length (Windows) */
>>
>> Wait, what? Same file length is sufficient to trigger overwriting
>> without -f? I find this to be a very dubious heuristic...
>>
>> Shouldn't you be checking something like nFileIndexLow/High from
>> BY_HANDLE_FILE_INFORMATION instead? (ref:
>> http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx)
>>
>> Sure, we'd need some API to check that, but if we assume that this
>> code path is rare-ish we could do something like this (note,
>> untested):
>>
>> diff --git a/compat/mingw.c b/compat/mingw.c
>> index 6750e67..fee4113 100644
>> --- a/compat/mingw.c
>> +++ b/compat/mingw.c
>> @@ -299,6 +299,21 @@ void mingw_mark_as_git_dir(const char *dir)
>>                 "dotGitOnly" : "true"));
>>  }
>>
>> +int is_same_file(const char *a, const char *b)
>> +{
>> +       BY_HANDLE_FILE_INFORMATION hia, hib;
>> +       HANDLE ha = OpenFileA(a, NULL, OF_READ),
>> +              hb = OpenFileA(b, NULL, OF_READ);
>> +       if (!ha || !hb ||
>> +           !GetFileInformationByHandle(ha) ||
>> +           !GetFileInformationByHandle(hb))
>> +               return 0;
>> +
> 
> And if couse:
> CloseHandle(ha);
> CloseHandle(hb);
Good point. I will send a new patch, including your suggestion,
but 50% different ;-)
/Torsten

^ permalink raw reply	[relevance 0%]

* [PATCH v2] Allow git mv FileA fILEa on case ignore file systems
@ 2011-03-19 14:28 11% Torsten Bögershausen
  0 siblings, 0 replies; 200+ results
From: Torsten Bögershausen @ 2011-03-19 14:28 UTC (permalink / raw)
  To: kusmabite, git; +Cc: tboegi

The typical use case is when a file "FileA" should be renamed into fILEa
and we are on a case insenstive file system (system core.ignorecase = true).
Source and destination are the same file, it can be accessed under both names.
This makes git think that the destination file exists.
Unless used with --forced, git will refuse the "git mv FileA fILEa".
This change will allow "git mv FileA fILEa" under the following condition:
On Linux/Unix/Mac OS X the move is allowed when the inode of the source and
destination are equal (and they are on the same device).
This allows renames of MÄRCHEN into Märchen on Mac OS X.
(As a side effect, a file can be renamed to a name which is already
hard-linked to the same inode).
On Windows, the function win_is_same_file() from compat/win32/same-file.c
is used.
It calls GetFileInformationByHandle() to check if both files are
"the same".

Signed-off-by: Torsten Bögershausen <tboegi@web.de>
---
 Makefile                 |    8 +++++---
 builtin/mv.c             |    2 +-
 compat/win32/same-file.c |   26 ++++++++++++++++++++++++++
 git-compat-util.h        |   15 +++++++++++++++
 t/t7001-mv.sh            |   29 +++++++++++++++++++++++++++++
 5 files changed, 76 insertions(+), 4 deletions(-)
 create mode 100644 compat/win32/same-file.c

diff --git a/Makefile b/Makefile
index 5c2b797..55b9a05 100644
--- a/Makefile
+++ b/Makefile
@@ -924,7 +924,7 @@ ifeq ($(uname_O),Cygwin)
 	# Try commenting this out if you suspect MMAP is more efficient
 	NO_MMAP = YesPlease
 	X = .exe
-	COMPAT_OBJS += compat/cygwin.o
+	COMPAT_OBJS += compat/cygwin.o compat/win32/same-file.o
 	UNRELIABLE_FSTAT = UnfortunatelyYes
 endif
 ifeq ($(uname_S),FreeBSD)
@@ -1104,7 +1104,8 @@ ifeq ($(uname_S),Windows)
 	BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
 	COMPAT_OBJS = compat/msvc.o compat/winansi.o \
 		compat/win32/pthread.o compat/win32/syslog.o \
-		compat/win32/sys/poll.o compat/win32/dirent.o
+		compat/win32/sys/poll.o compat/win32/dirent.o \
+		compat/win32/same-file.o
 	COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
 	BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
 	EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
@@ -1177,7 +1178,8 @@ ifneq (,$(findstring MINGW,$(uname_S)))
 	COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
 	COMPAT_OBJS += compat/mingw.o compat/winansi.o \
 		compat/win32/pthread.o compat/win32/syslog.o \
-		compat/win32/sys/poll.o compat/win32/dirent.o
+		compat/win32/sys/poll.o compat/win32/dirent.o \
+		compat/win32/same-file.o
 	EXTLIBS += -lws2_32
 	PTHREAD_LIBS =
 	X = .exe
diff --git a/builtin/mv.c b/builtin/mv.c
index 93e8995..96792bd 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -166,7 +166,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			bad = "not under version control";
 		else if (lstat(dst, &st) == 0) {
 			bad = "destination exists";
-			if (force) {
+			if (force || is_same_file(src, dst)) {
 				/*
 				 * only files can overwrite each other:
 				 * check both source and destination
diff --git a/compat/win32/same-file.c b/compat/win32/same-file.c
new file mode 100644
index 0000000..bb1a791
--- /dev/null
+++ b/compat/win32/same-file.c
@@ -0,0 +1,26 @@
+#include "../../git-compat-util.h"
+#include "../win32.h"
+
+int win_is_same_file(const char *a, const char *b)
+{
+	BY_HANDLE_FILE_INFORMATION hia, hib;
+	HANDLE h;
+
+	h = CreateFile(a, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
+	if (INVALID_HANDLE_VALUE == h)
+		return 0;
+	if (!(GetFileInformationByHandle(h,&hia)))
+		return 0;
+  CloseHandle(h);
+
+	h = CreateFile(b, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
+	if (INVALID_HANDLE_VALUE == h)
+		return 0;
+	if (!(GetFileInformationByHandle(h,&hib)))
+		return 0;
+  CloseHandle(h);
+
+	return hia.dwVolumeSerialNumber == hib.dwVolumeSerialNumber &&
+	       hia.nFileSizeLow == hib.nFileSizeLow &&
+	       hia.nFileSizeHigh == hib.nFileSizeHigh;
+}
diff --git a/git-compat-util.h b/git-compat-util.h
index 49b50ee..df95458 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -152,6 +152,21 @@
 #include "compat/msvc.h"
 #endif
 
+#if defined (WIN32) || defined(__CYGWIN__)
+/* MinGW or MSVC or cygwin */
+int win_is_same_file(const char *a, const char *b);
+#define is_same_file(a,b) win_is_same_file((a),(b))
+#else
+static inline int is_same_file(const char *a, const char *b)
+{
+	struct stat sta, stb;
+	if (lstat(a, &sta) ||
+	    lstat(b, &stb))
+		return 0;
+	return sta.st_ino && sta.st_dev == stb.st_dev && sta.st_ino == stb.st_ino;
+}
+#endif
+
 #ifndef NO_LIBGEN_H
 #include <libgen.h>
 #else
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..d0e73ee 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,33 @@ test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
 
 rm -f moved symlink
 
+touch x
+if ln x y 2>/dev/null; then
+	hardlinks=1
+fi
+rm -f x y
+
+if test "$(git config --bool core.ignorecase)" = true -o "$hardlinks"; then
+	test_expect_success 'git mv FileA fILEa' '
+
+		rm -fr .git * &&
+		git init &&
+		echo FileA > FileA &&
+		git add FileA &&
+		git commit -m add FileA &&
+		{
+			if ! test -f fILEa; then
+				ln FileA fILEa
+			fi
+		} &&
+		git mv FileA fILEa &&
+		git commit -m "mv FileA fILEa" &&
+		rm -f FileA fILEa &&
+		git reset --hard &&
+		test "$(echo *)" = fILEa
+	'
+else
+	say "Neither ignorecase nor hardlinks, skipping git mv FileA fILEa"
+fi
+
 test_done
-- 
1.7.4

^ permalink raw reply related	[relevance 11%]

* Re: [PATCH] Allow git mv FileA fILEa when core.ignorecase = true
  2011-03-04 21:40 12% [PATCH] Allow git mv FileA fILEa when core.ignorecase = true Torsten Bögershausen
@ 2011-03-16 13:05  0% ` Erik Faye-Lund
  2011-03-16 13:18  0%   ` Erik Faye-Lund
  0 siblings, 1 reply; 200+ results
From: Erik Faye-Lund @ 2011-03-16 13:05 UTC (permalink / raw)
  To: Torsten Bögershausen; +Cc: git

2011/3/4 Torsten Bögershausen <tboegi@web.de>:
>    The typical use case is when a file "FileA" should be renamed into fILEa
>    and we are on a case insenstive file system (system core.ignorecase = true).
>    Source and destination are the same file, it can be accessed under both names.
>    This makes git think that the destination file exists.
>    Unless used with --forced, git will refuse the "git mv FileA fILEa".
>    This change will allow "git mv FileA fILEa", when core.ignorecase = true
>    and source and destination filenames only differ in case and the file length
>    is identical.
>    On Linux/Unix/Mac OS X the mv is allowed when the inode of the source and
>    destination are equal.
>    On  this allows renames of MÄRCHEN into Märchen on Mac OS X.
>    (As a side effect, a file can be renamed to a name which is already
>    hard-linked to the same inode)
>
> Signed-off-by: Torsten Bögershausen <tboegi@web.de>
> ---
>  builtin/mv.c  |   20 +++++++++++++++-----
>  t/t7001-mv.sh |   29 +++++++++++++++++++++++++++++
>  2 files changed, 44 insertions(+), 5 deletions(-)
>
> diff --git a/builtin/mv.c b/builtin/mv.c
> index 93e8995..e0aad62 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -62,7 +62,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>        };
>        const char **source, **destination, **dest_path;
>        enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
> -       struct stat st;
> +       struct stat st, st_dst;
>        struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
>
>        git_config(git_default_config, NULL);
> @@ -164,15 +164,25 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>                        }
>                } else if (cache_name_pos(src, length) < 0)
>                        bad = "not under version control";
> -               else if (lstat(dst, &st) == 0) {
> +               else if (lstat(dst, &st_dst) == 0) {
> +                       int allow_force = force;
>                        bad = "destination exists";
> -                       if (force) {
> +                       /* Allow when src and dst have the same inode (Mac OS X) */
> +                       /* Allow when ignore_case and same file length (Windows) */

Wait, what? Same file length is sufficient to trigger overwriting
without -f? I find this to be a very dubious heuristic...

Shouldn't you be checking something like nFileIndexLow/High from
BY_HANDLE_FILE_INFORMATION instead? (ref:
http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx)

Sure, we'd need some API to check that, but if we assume that this
code path is rare-ish we could do something like this (note,
untested):

diff --git a/compat/mingw.c b/compat/mingw.c
index 6750e67..fee4113 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -299,6 +299,21 @@ void mingw_mark_as_git_dir(const char *dir)
 		 "dotGitOnly" : "true"));
 }

+int is_same_file(const char *a, const char *b)
+{
+	BY_HANDLE_FILE_INFORMATION hia, hib;
+	HANDLE ha = OpenFileA(a, NULL, OF_READ),
+	       hb = OpenFileA(b, NULL, OF_READ);
+	if (!ha || !hb ||
+	    !GetFileInformationByHandle(ha) ||
+	    !GetFileInformationByHandle(hb))
+		return 0;
+
+	return hia.dwVolumeSerialNumber == hib.dwVolumeSerialNumber &&
+	    hia.nFileSizeLow == hib.nFileSizeLow &&
+	    hia.nFileSizeHigh == hib.nFileSizeHigh;
+}
+
 #undef mkdir
 int mingw_mkdir(const char *path, int mode)
 {
diff --git a/compat/mingw.h b/compat/mingw.h
index 9c00e75..43c0b5f 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -297,6 +297,9 @@ void mingw_open_html(const char *path);
 void mingw_mark_as_git_dir(const char *dir);
 #define mark_as_git_dir mingw_mark_as_git_dir

+int mingw_is_same_file(const char *a, const char *b);
+#define is_same_file mingw_is_same_file
+
 /*
  * helpers
  */
diff --git a/git-compat-util.h b/git-compat-util.h
index 2ca2fad..b95b9e2 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -558,6 +558,17 @@ int remove_or_warn(unsigned int mode, const char *path);
 #define mark_as_git_dir(x) /* noop */
 #endif

+#ifndef is_same_file
+static inline int mingw_is_same_file(const char *a, const char *b)
+{
+	struct stat sta, stb;
+	if (lstat(a, &sta) ||
+	    lstat(b, &stb))
+		return 0;
+	return sta.st_dev == stb.st_deb && sta.st_ino == stb.st_ino;
+}
+#endif
+
 #ifndef get_home_directory
 #define get_home_directory() getenv("HOME")
 #endif

^ permalink raw reply related	[relevance 0%]

* Re: [PATCH] Allow git mv FileA fILEa when core.ignorecase = true
  2011-03-16 13:05  0% ` Erik Faye-Lund
@ 2011-03-16 13:18  0%   ` Erik Faye-Lund
  2011-03-19 14:28  0%     ` Torsten Bögershausen
  0 siblings, 1 reply; 200+ results
From: Erik Faye-Lund @ 2011-03-16 13:18 UTC (permalink / raw)
  To: Torsten Bögershausen; +Cc: git

2011/3/16 Erik Faye-Lund <kusmabite@gmail.com>:
> 2011/3/4 Torsten Bögershausen <tboegi@web.de>:
>>    The typical use case is when a file "FileA" should be renamed into fILEa
>>    and we are on a case insenstive file system (system core.ignorecase = true).
>>    Source and destination are the same file, it can be accessed under both names.
>>    This makes git think that the destination file exists.
>>    Unless used with --forced, git will refuse the "git mv FileA fILEa".
>>    This change will allow "git mv FileA fILEa", when core.ignorecase = true
>>    and source and destination filenames only differ in case and the file length
>>    is identical.
>>    On Linux/Unix/Mac OS X the mv is allowed when the inode of the source and
>>    destination are equal.
>>    On  this allows renames of MÄRCHEN into Märchen on Mac OS X.
>>    (As a side effect, a file can be renamed to a name which is already
>>    hard-linked to the same inode)
>>
>> Signed-off-by: Torsten Bögershausen <tboegi@web.de>
>> ---
>>  builtin/mv.c  |   20 +++++++++++++++-----
>>  t/t7001-mv.sh |   29 +++++++++++++++++++++++++++++
>>  2 files changed, 44 insertions(+), 5 deletions(-)
>>
>> diff --git a/builtin/mv.c b/builtin/mv.c
>> index 93e8995..e0aad62 100644
>> --- a/builtin/mv.c
>> +++ b/builtin/mv.c
>> @@ -62,7 +62,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>>        };
>>        const char **source, **destination, **dest_path;
>>        enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
>> -       struct stat st;
>> +       struct stat st, st_dst;
>>        struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
>>
>>        git_config(git_default_config, NULL);
>> @@ -164,15 +164,25 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
>>                        }
>>                } else if (cache_name_pos(src, length) < 0)
>>                        bad = "not under version control";
>> -               else if (lstat(dst, &st) == 0) {
>> +               else if (lstat(dst, &st_dst) == 0) {
>> +                       int allow_force = force;
>>                        bad = "destination exists";
>> -                       if (force) {
>> +                       /* Allow when src and dst have the same inode (Mac OS X) */
>> +                       /* Allow when ignore_case and same file length (Windows) */
>
> Wait, what? Same file length is sufficient to trigger overwriting
> without -f? I find this to be a very dubious heuristic...
>
> Shouldn't you be checking something like nFileIndexLow/High from
> BY_HANDLE_FILE_INFORMATION instead? (ref:
> http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx)
>
> Sure, we'd need some API to check that, but if we assume that this
> code path is rare-ish we could do something like this (note,
> untested):
>
> diff --git a/compat/mingw.c b/compat/mingw.c
> index 6750e67..fee4113 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -299,6 +299,21 @@ void mingw_mark_as_git_dir(const char *dir)
>                 "dotGitOnly" : "true"));
>  }
>
> +int is_same_file(const char *a, const char *b)
> +{
> +       BY_HANDLE_FILE_INFORMATION hia, hib;
> +       HANDLE ha = OpenFileA(a, NULL, OF_READ),
> +              hb = OpenFileA(b, NULL, OF_READ);
> +       if (!ha || !hb ||
> +           !GetFileInformationByHandle(ha) ||
> +           !GetFileInformationByHandle(hb))
> +               return 0;
> +

And if couse:
CloseHandle(ha);
CloseHandle(hb);

^ permalink raw reply	[relevance 0%]

* [PATCH]     Allow git mv FileA fILEa when core.ignorecase = true
@ 2011-03-04 21:40 12% Torsten Bögershausen
  2011-03-16 13:05  0% ` Erik Faye-Lund
  0 siblings, 1 reply; 200+ results
From: Torsten Bögershausen @ 2011-03-04 21:40 UTC (permalink / raw)
  To: git; +Cc: tboegi

    The typical use case is when a file "FileA" should be renamed into fILEa
    and we are on a case insenstive file system (system core.ignorecase = true).
    Source and destination are the same file, it can be accessed under both names.
    This makes git think that the destination file exists.
    Unless used with --forced, git will refuse the "git mv FileA fILEa".
    This change will allow "git mv FileA fILEa", when core.ignorecase = true
    and source and destination filenames only differ in case and the file length
    is identical.
    On Linux/Unix/Mac OS X the mv is allowed when the inode of the source and
    destination are equal.
    On  this allows renames of MÄRCHEN into Märchen on Mac OS X.
    (As a side effect, a file can be renamed to a name which is already
    hard-linked to the same inode)

Signed-off-by: Torsten Bögershausen <tboegi@web.de>
---
 builtin/mv.c  |   20 +++++++++++++++-----
 t/t7001-mv.sh |   29 +++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 93e8995..e0aad62 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -62,7 +62,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	};
 	const char **source, **destination, **dest_path;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
-	struct stat st;
+	struct stat st, st_dst;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
 
 	git_config(git_default_config, NULL);
@@ -164,15 +164,25 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 			}
 		} else if (cache_name_pos(src, length) < 0)
 			bad = "not under version control";
-		else if (lstat(dst, &st) == 0) {
+		else if (lstat(dst, &st_dst) == 0) {
+			int allow_force = force;
 			bad = "destination exists";
-			if (force) {
+			/* Allow when src and dst have the same inode (Mac OS X) */
+			/* Allow when ignore_case and same file length (Windows) */
+			if (((st_dst.st_ino) && (st_dst.st_ino == st.st_ino)) ||
+					((ignore_case) && !strcasecmp(src, dst) &&
+					 (st.st_size == st_dst.st_size))) {
+				allow_force = 1;
+				bad = NULL;
+			}
+			if (allow_force) {
 				/*
 				 * only files can overwrite each other:
 				 * check both source and destination
 				 */
-				if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-					warning("%s; will overwrite!", bad);
+				if (S_ISREG(st_dst.st_mode) || S_ISLNK(st_dst.st_mode)) {
+					if (bad)
+						warning("%s; will overwrite!", bad);
 					bad = NULL;
 				} else
 					bad = "Cannot overwrite";
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..d0e73ee 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,33 @@ test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
 
 rm -f moved symlink
 
+touch x
+if ln x y 2>/dev/null; then
+	hardlinks=1
+fi
+rm -f x y
+
+if test "$(git config --bool core.ignorecase)" = true -o "$hardlinks"; then
+	test_expect_success 'git mv FileA fILEa' '
+
+		rm -fr .git * &&
+		git init &&
+		echo FileA > FileA &&
+		git add FileA &&
+		git commit -m add FileA &&
+		{
+			if ! test -f fILEa; then
+				ln FileA fILEa
+			fi
+		} &&
+		git mv FileA fILEa &&
+		git commit -m "mv FileA fILEa" &&
+		rm -f FileA fILEa &&
+		git reset --hard &&
+		test "$(echo *)" = fILEa
+	'
+else
+	say "Neither ignorecase nor hardlinks, skipping git mv FileA fILEa"
+fi
+
 test_done
-- 
1.7.4

^ permalink raw reply related	[relevance 12%]

* [ANNOUNCE] Git 1.7.4
@ 2011-01-31  5:05  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2011-01-31  5:05 UTC (permalink / raw)
  To: git

The latest feature release Git 1.7.4 is available at the usual
places:

  http://www.kernel.org/pub/software/scm/git/

  git-1.7.4.tar.{gz,bz2}			(source tarball)
  git-htmldocs-1.7.4.tar.{gz,bz2}		(preformatted docs)
  git-manpages-1.7.4.tar.{gz,bz2}		(preformatted docs)

The RPM binary packages for a few architectures are found in:

  RPMS/$arch/git-*-1.7.4-1.fc13.$arch.rpm	(RPM)

Git v1.7.4 Release Notes
========================

Updates since v1.7.3
--------------------

 * The documentation Makefile now assumes by default asciidoc 8 and
   docbook-xsl >= 1.73. If you have older versions, you can set
   ASCIIDOC7 and ASCIIDOC_ROFF, respectively.

 * The option parsers of various commands that create new branches (or
   rename existing ones to a new name) were too loose and users were
   allowed to give a branch a name that begins with a dash by creative
   abuse of their command line options, which only led to burning
   themselves.  The name of a branch cannot begin with a dash now.

 * System-wide fallback default attributes can be stored in
   /etc/gitattributes; the core.attributesfile configuration variable can
   be used to customize the path to this file.

 * The thread structure generated by "git send-email" has changed
   slightly.  Setting the cover letter of the latest series as a reply
   to the cover letter of the previous series with --in-reply-to used
   to make the new cover letter and all the patches replies to the
   cover letter of the previous series; this has been changed to make
   the patches in the new series replies to the new cover letter.

 * The Bash completion script in contrib/ has been adjusted to be usable with
   Bash 4 (options with '=value' didn't complete).  It has been also made
   usable with zsh.

 * Different pagers can be chosen depending on which subcommand is
   being run under the pager, using the "pager.<subcommand>" variable.

 * The hardcoded tab-width of 8 that is used in whitespace breakage checks is now
   configurable via the attributes mechanism.

 * Support of case insensitive filesystems (i.e. "core.ignorecase") has
   been improved.  For example, the gitignore mechanism didn't pay attention
   to case insensitivity.

 * The <tree>:<path> syntax for naming a blob in a tree, and the :<path>
   syntax for naming a blob in the index (e.g. "master:Makefile",
   ":hello.c") have been extended.  You can start <path> with "./" to
   implicitly have the (sub)directory you are in prefixed to the
   lookup.  Similarly, ":../Makefile" from a subdirectory would mean
   "the Makefile of the parent directory in the index".

 * "git blame" learned the --show-email option to display the e-mail
   addresses instead of the names of authors.

 * "git commit" learned the --fixup and --squash options to help later invocation
   of interactive rebase.

 * Command line options to "git cvsimport" whose names are in capital
   letters (-A, -M, -R and -S) can now be specified as the default in
   the .git/config file by their longer names (cvsimport.authorsFile,
   cvsimport.mergeRegex, cvsimport.trackRevisions, cvsimport.ignorePaths).

 * "git daemon" can be built in the MinGW environment.

 * "git daemon" can take more than one --listen option to listen to
   multiple addresses.

 * "git describe --exact-match" was optimized not to read commit
   objects unnecessarily.

 * "git diff" and "git grep" learned what functions and subroutines
   in Fortran, Pascal and Perl look like.

 * "git fetch" learned the "--recurse-submodules" option.

 * "git mergetool" tells vim/gvim to show a three-way diff by default
   (use vimdiff2/gvimdiff2 as the tool name for old behavior).

 * "git log -G<pattern>" limits the output to commits whose change has
   added or deleted lines that match the given pattern.

 * "git read-tree" with no argument as a way to empty the index is
   deprecated; we might want to remove it in the future.  Users can
   use the new --empty option to be more explicit instead.

 * "git repack -f" does not spend cycles to recompress objects in the
   non-delta representation anymore (use -F if you really mean it
   e.g. after you changed the core.compression variable setting).

 * "git merge --log" used to limit the resulting merge log to 20
   entries; this is now customizable by giving e.g. "--log=47".

 * "git merge" may work better when all files were moved out of a
   directory in one branch while a new file is created in place of that
   directory in the other branch.

 * "git merge" learned the "--abort" option, synonymous to
   "git reset --merge" when a merge is in progress.

 * "git notes" learned the "merge" subcommand to merge notes refs.
   In addition to the default manual conflict resolution, there are
   also several notes merge strategies for automatically resolving
   notes merge conflicts.

 * "git rebase --autosquash" can use SHA-1 object names to name the
   commit which is to be fixed up (e.g. "fixup! e83c5163").

 * The default "recursive" merge strategy learned the --rename-threshold
   option to influence the rename detection, similar to the -M option
   of "git diff".  From the "git merge" frontend, the "-X<strategy option>"
   interface, e.g. "git merge -Xrename-threshold=50% ...", can be used
   to trigger this.

 * The "recursive" strategy also learned to ignore various whitespace
   changes; the most notable is -Xignore-space-at-eol.

 * "git send-email" learned "--to-cmd", similar to "--cc-cmd", to read
   the recipient list from a command output.

 * "git send-email" learned to read and use "To:" from its input files.

 * you can extend "git shell", which is often used on boxes that allow
   git-only login over ssh as login shell, with a custom set of
   commands.

 * The current branch name in "git status" output can be colored differently
   from the generic header color by setting the "color.status.branch" variable.

 * "git submodule sync" updates metainformation for all submodules,
   not just the ones that have been checked out.

 * gitweb can use a custom 'highlight' command with its configuration file.

 * other gitweb updates.


Also contains various documentation updates.


Fixes since v1.7.3
------------------

All of the fixes in the v1.7.3.X maintenance series are included in this
release, unless otherwise noted.

 * "git log --author=me --author=her" did not find commits written by
   me or by her; instead it looked for commits written by me and by
   her, which is impossible.

 * "git push --progress" shows progress indicators now.

 * "git rebase -i" showed a confusing error message when given a
   branch name that does not exist.

 * "git repack" places its temporary packs under $GIT_OBJECT_DIRECTORY/pack
   instead of $GIT_OBJECT_DIRECTORY/ to avoid cross directory renames.

 * "git submodule update --recursive --other-flags" passes flags down
   to its subinvocations.


----------------------------------------------------------------

Changes since v1.7.3 are as follows:

Adam Tkac (1):
      Don't pass "--xhtml" to hightlight in gitweb.perl script.

Alan Raison (1):
      contrib/hooks/post-receive-email: fix return values from prep_for_email

Alejandro R. Sedeño (1):
      Add --force to git-send-email documentation

Aleksi Aalto (1):
      status: show branchname with a configurable color

Alexander Sulfrian (2):
      daemon: add helper function named_sock_setup
      daemon: allow more than one host address given via --listen

Alexandre Erwin Ittner (1):
      gitk: Add Brazilian Portuguese (pt-BR) translation

Alexey Shumkin (1):
      userdiff: match Pascal class methods

Anders Kaseorg (6):
      apply: Recognize epoch timestamps with : in the timezone
      describe: Use for_each_rawref
      describe: Do not use a flex array in struct commit_name
      describe: Store commit_names in a hash table by commit SHA1
      describe: Delay looking up commits until searching for an inexact match
      Mark gitk script executable

Andreas Gruenbacher (1):
      Clarify and extend the "git diff" format documentation

Andreas Köhler (1):
      submodule sync: Update "submodule.<name>.url" for empty directories

Andrew Waters (1):
      Fix handling of git-p4 on deleted files

Antonio Ospite (3):
      t/t9001-send-email.sh: fix stderr redirection in 'Invalid In-Reply-To'
      git-send-email.perl: make initial In-Reply-To apply only to first email
      t/t9001-send-email.sh: fix '&&' chain in some tests

Bert Wesarg (1):
      Documentation: update-index: -z applies also to --index-info

Björn Steinbrink (1):
      Correctly report corrupted objects

Brandon Casey (13):
      userdiff.c: add builtin fortran regex patterns
      t/t3903-stash: improve testing of git-stash show
      builtin/revert.c: don't dereference a NULL pointer
      wt-status.c: don't leak directory entries when processing untracked,ignored
      git-send-email.perl: ensure $domain is defined before using it
      diffcore-pickaxe.c: remove unnecessary curly braces
      diffcore-pickaxe.c: a void function shouldn't try to return something
      test-lib.sh/test_decode_color(): use octal not hex in awk script
      Makefile: add NO_FNMATCH_CASEFOLD to IRIX sections
      t9001: use older Getopt::Long boolean prefix '--no' rather than '--no-'
      trace.c: ensure NULL is not passed to printf
      t0001,t1510,t3301: use sane_unset which always returns with status 0
      t3032: limit sed branch labels to 8 characters

Brian Gernhardt (3):
      git-stash: fix flag parsing
      t/gitweb-lib: Don't pass constant to decode_utf8
      t6022: Use -eq not = to test output of wc -l

Christian Couder (1):
      t6050 (replace): fix bogus "fetch branch with replacement" test

Christoph Mallon (1):
      diff --check: correct line numbers of new blank lines at EOF

Christopher Wilson (1):
      Enable highlight executable path as a configuration option

Clemens Buchacher (15):
      add rebase patch id tests
      do not search functions for patch ID
      t7607: use test-lib functions and check MERGE_HEAD
      t7607: add leading-path tests
      add function check_ok_to_remove()
      lstat_cache: optionally return match_len
      do not overwrite files in leading path
      do not overwrite untracked during merge from unborn branch
      use persistent memory for rejected paths
      t7607: use test-lib functions and check MERGE_HEAD
      t7607: add leading-path tests
      add function check_ok_to_remove()
      lstat_cache: optionally return match_len
      do not overwrite files in leading path
      use persistent memory for rejected paths

Cliff Frey (1):
      documentation: git-config minor cleanups

Dan McGee (3):
      mergetool-lib: combine vimdiff and gvimdiff run blocks
      mergetool-lib: add a three-way diff view for vim/gvim
      mergetool-lib: make the three-way diff the default for vim/gvim

Daniel Knittl-Frank (1):
      Improvements to `git checkout -h`

David Barr (3):
      fast-import: Allow filemodify to set the root
      fast-import: insert new object entries at start of hash bucket
      fast-import: let importers retrieve blobs

David Kågedal (1):
      git-blame.el: Add (require 'format-spec)

Diego Elio Pettenò (1):
      imap-send: link against libcrypto for HMAC and others

Elijah Newren (54):
      Document pre-condition for tree_entry_interesting
      tree-walk: Correct bitrotted comment about tree_entry()
      tree_entry_interesting(): Make return value more specific
      diff_tree(): Skip skip_uninteresting() when all remaining paths interesting
      t3509: Add rename + D/F conflict testcase that recursive strategy fails
      merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir
      t6032: Add a test checking for excessive output from merge
      t6022: Add test combinations of {content conflict?, D/F conflict remains?}
      t6022: Add tests for reversing order of merges when D/F conflicts present
      t6022: Add tests with both rename source & dest involved in D/F conflicts
      t6022: Add paired rename+D/F conflict: (two/file, one/file) -> (one, two)
      t6022: Add tests for rename/rename combined with D/F conflicts
      t6020: Modernize style a bit
      t6020: Add a testcase for modify/delete + directory/file conflict
      t6036: Test index and worktree state, not just that merge fails
      t6036: Add a second testcase similar to the first but with content changes
      t6036: Add testcase for undetected conflict
      merge-recursive: Small code clarification -- variable name and comments
      merge-recursive: Rename conflict_rename_rename*() for clarity
      merge-recursive: Nuke rename/directory conflict detection
      merge-recursive: Move rename/delete handling into dedicated function
      merge-recursive: Move delete/modify handling into dedicated function
      merge-recursive: Move process_entry's content merging into a function
      merge-recursive: New data structures for deferring of D/F conflicts
      merge-recursive: New function to assist resolving renames in-core only
      merge-recursive: Have process_entry() skip D/F or rename entries
      merge-recursive: Structure process_df_entry() to handle more cases
      merge-recursive: Update conflict_rename_rename_1to2() call signature
      merge-recursive: Update merge_content() call signature
      merge-recursive: Avoid doubly merging rename/add conflict contents
      merge-recursive: Move handling of double rename of one file to two
      merge-recursive: Move handling of double rename of one file to other file
      merge-recursive: Delay handling of rename/delete conflicts
      merge-recursive: Delay content merging for renames
      merge-recursive: Delay modify/delete conflicts if D/F conflict present
      conflict_rename_delete(): Check whether D/F conflicts are still present
      conflict_rename_rename_1to2(): Fix checks for presence of D/F conflicts
      merge_content(): Check whether D/F conflicts are still present
      handle_delete_modify(): Check whether D/F conflicts are still present
      merge-recursive: Make room for directories in D/F conflicts
      merge-recursive: Remove redundant path clearing for D/F conflicts
      t3020 (ls-files-error-unmatch): remove stray '1' from end of file
      t4017 (diff-retval): replace manual exit code check with test_expect_code
      t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
      t4002 (diff-basic): use test_might_fail for commands that might fail
      t4202 (log): Replace '<git-command> || :' with test_might_fail
      t4019 (diff-wserror): add lots of missing &&
      t4026 (color): remove unneeded and unchained command
      t5602 (clone-remote-exec): add missing &&
      t6016 (rev-list-graph-simplify-history): add missing &&
      t7001 (mv): add missing &&
      t7601 (merge-pull-config): add missing &&
      t7800 (difftool): add missing &&
      Introduce sane_unset and use it to ensure proper && chaining

Eric Sunshine (5):
      Side-step sed line-ending "corruption" leading to t6038 failure.
      Side-step MSYS-specific path "corruption" leading to t5560 failure.
      Fix 'clone' failure at DOS root directory.
      Fix Windows-specific macro redefinition warning.
      Add MinGW-specific execv() override.

Eric Wong (1):
      Documentation/git-svn: discourage "noMetadata"

Erik Faye-Lund (23):
      mingw: do not crash on open(NULL, ...)
      do not depend on signed integer overflow
      inet_ntop: fix a couple of old-style decls
      mingw: use real pid
      mingw: support waitpid with pid > 0 and WNOHANG
      mingw: add kill emulation
      daemon: use run-command api for async serving
      daemon: use full buffered mode for stderr
      daemon: get remote host address from root-process
      mingw: import poll-emulation from gnulib
      mingw: use poll-emulation from gnulib
      daemon: use socklen_t
      daemon: make --inetd and --detach incompatible
      daemon: opt-out on features that require posix
      msvc: opendir: fix malloc-failure
      msvc: opendir: allocate enough memory
      msvc: opendir: do not start the search
      win32: dirent: handle errors
      msvc: opendir: handle paths ending with a slash
      win32: use our own dirent.h
      mingw: do not set errno to 0 on success
      help: always suggest common-cmds if prefix of cmd
      exec_cmd: remove unused extern

Federico Cuello (1):
      Fix git-apply with -p greater than 1

Gabriel Corona (2):
      t5550: test HTTP authentication and userinfo decoding
      Fix username and password extraction from HTTP URLs

Giuseppe Bilotta (16):
      gitweb: use fullname as hash_base in heads link
      gitweb: introduce remote_heads feature
      gitweb: git_get_heads_list accepts an optional list of refs
      gitweb: separate heads and remotes lists
      gitweb: nagivation menu for tags, heads and remotes
      gitweb: allow action specialization in page header
      gitweb: remotes view for a single remote
      gitweb: refactor repository URL printing
      gitweb: provide a routine to display (sub)sections
      gitweb: group remote heads by remote
      git instaweb: enable remote_heads
      web--browse: coding style
      web--browse: split valid_tool list
      web--browse: support opera, seamonkey and elinks
      web--browse: better support for chromium
      CodingGuidelines: mention whitespace preferences for shell scripts

Greg Brockman (4):
      Allow creation of arbitrary git-shell commands
      Add interactive mode to git-shell for user-friendliness
      Add sample commands for git-shell
      shell: Display errors from improperly-formatted command lines

Ilari Liusvaara (4):
      Add bidirectional_transfer_loop()
      git-remote-fd
      git-remote-ext
      remote-fd/ext: finishing touches after code review

Jakub Narebski (14):
      t/gitweb-lib.sh: Use GIT_BUILD_DIR
      t/gitweb-lib.sh: Use tabs for indent consistently
      gitweb: Move call to evaluate_git_version after evaluate_gitweb_config
      t/gitweb-lib.sh: Add support for GITWEB_TEST_INSTALLED
      gitweb/Makefile: Add 'test' and 'test-installed' targets
      gitweb/Makefile: Include gitweb/config.mak
      gitweb: Fix test of highlighting support in t9500
      gitweb: Fix bug in evaluate_path_info
      gitweb: Improve behavior for actionless path_info gitweb URLs
      gitweb: Time::HiRes is in core for Perl 5.8
      gitweb: selectable configurations that change with each request
      gitweb: Fix handling of whitespace in generated links
      gitweb: Introduce esc_attr to escape attributes of HTML elements
      gitweb: Include links to feeds in HTML header only for '200 OK' response

Jan Krüger (3):
      read-tree: deprecate syntax without tree-ish args
      repack: add -F flag to let user choose between --no-reuse-delta/object
      Documentation: pack.compression: explain how to recompress

Jari Aalto (2):
      git-commit.txt: (synopsis): move -i and -o before "--"
      git-pull.txt: Mention branch.autosetuprebase

Jeff King (27):
      diff: don't use pathname-based diff drivers for symlinks
      prefer test -h over test -L in shell scripts
      rev-list: handle %x00 NUL in user format
      tests: factor out terminal handling from t7006
      tests: test terminal output to both stdout and stderr
      push: pass --progress down to git-pack-objects
      docs: give more hints about how "add -e" works
      config: treat non-existent config files as empty
      diff: report bogus input to -C/-M/-B
      apply: don't segfault on binary files with missing data
      docs: clarify git diff modes of operation
      docs: give more hints about how "add -e" works
      document sigchain api
      log.decorate: accept 0/1 bool values
      allow command-specific pagers in pager.<cmd>
      reflogs: clear flags properly in corner case
      docs: default to more modern toolset
      default color.status.branch to "same as header"
      tests: add some script lint checks
      tests: flip executable bit on t9158
      handle arbitrary ints in git_config_maybe_bool
      t2107: mark passing test as success
      ident: die on bogus date format
      docs: explain diff.*.binary option
      rebase: use explicit "--" with checkout
      rebase: give a better error message for bogus branch
      tests: sanitize more git environment variables

Jens Lehmann (6):
      pull: Remove --tags option from manpage
      clone: Add the --recurse-submodules option as alias for --recursive
      fetch/pull: Add the --recurse-submodules option
      Add the 'fetch.recurseSubmodules' config setting
      Submodules: Add the "fetchRecurseSubmodules" config option
      git submodule: Remove now obsolete tests before cloning a repo

Jiang Xin (1):
      Fix typo in git-gc document.

Jim Meyering (1):
      mailmap: fix use of freed memory

Joe Perches (2):
      git-send-email.perl: Add --to-cmd
      git-send-email.perl: Deduplicate "to:" and "cc:" entries with names

Johan Herland (23):
      notes.c: Hexify SHA1 in die() message from init_notes()
      (trivial) notes.h: Minor documentation fixes to copy_notes()
      notes.h: Make default_notes_ref() available in notes API
      notes.c: Reorder functions in preparation for next commit
      notes.h/c: Allow combine_notes functions to remove notes
      notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond
      (trivial) t3303: Indent with tabs instead of spaces for consistency
      notes.c: Use two newlines (instead of one) when concatenating notes
      builtin/notes.c: Split notes ref DWIMmery into a separate function
      git notes merge: Initial implementation handling trivial merges only
      builtin/notes.c: Refactor creation of notes commits.
      git notes merge: Handle real, non-conflicting notes merges
      git notes merge: Add automatic conflict resolvers (ours, theirs, union)
      Documentation: Preliminary docs on 'git notes merge'
      git notes merge: Manual conflict resolution, part 1/2
      git notes merge: Manual conflict resolution, part 2/2
      git notes merge: List conflicting notes in notes merge commit message
      git notes merge: --commit should fail if underlying notes ref has moved
      git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"
      git notes merge: Add testcases for merging notes trees at different fanouts
      Provide 'git notes get-ref' to easily retrieve current notes ref
      cmd_merge(): Parse options before checking MERGE_HEAD
      Provide 'git merge --abort' as a synonym to 'git reset --merge'

Johannes Schindelin (3):
      Make sure that git_getpass() never returns NULL
      Fix typo in pack-objects' usage
      merge-octopus: Work around environment issue on Windows

Johannes Sixt (6):
      t7300: add a missing SYMLINKS prerequisite
      apply --whitespace=fix: fix tab-in-indent
      Make the tab width used for whitespace checks configurable
      Avoid duplicate test number t7609
      Fix expected values of setup tests on Windows
      t/README: hint about using $(pwd) rather than $PWD in tests

Jon Seymour (2):
      stash: fix git stash branch regression when branch creation fails
      stash: simplify parsing fixes

Jonathan "Duke" Leto (1):
      Correct help blurb in checkout -p and friends

Jonathan Nieder (89):
      merge-recursive: expose merge options for builtin merge
      ll-merge: replace flag argument with options struct
      t0004 (unwritable files): simplify error handling
      environment.c: remove unused variable
      setup: make sure git dir path is in a permanent buffer
      init: plug tiny one-time memory leak
      xdiff: cast arguments for ctype functions to unsigned char
      commit-tree: free commit message before exiting
      Documentation: No argument of ALLOC_GROW should have side-effects
      Documentation: gitrevisions is in section 7
      Documentation: diff can compare blobs
      Documentation: expand 'git diff' SEE ALSO section
      Documentation: update implicit "--no-index" behavior in "git diff"
      t4203 (mailmap): stop hardcoding commit ids and dates
      send-pack: avoid redundant "pack-objects died with strange error"
      test-lib: allow test code to check the list of declared prerequisites
      test_terminal: catch use without TTY prerequisite
      test_terminal: ensure redirections work reliably
      fast-import: filemodify after M 040000 <tree> "" crashes
      fast-import: tighten M 040000 syntax
      t9300 (fast-import): another test for the "replace root" feature
      fast-import: do not clear notes in do_change_note_fanout()
      user-manual: remote-tracking can be checked out, with detached HEAD
      Documentation: document show -s
      tests: add missing &&
      tests: add missing &&, batch 2
      test-lib: introduce test_line_count to measure files
      t6022 (renaming merge): chain test commands with &&
      t1502 (rev-parse --parseopt): test exit code from "-h"
      t1400 (update-ref): use test_must_fail
      t3301 (notes): use test_expect_code for clarity
      t3404 (rebase -i): unroll test_commit loops
      t3404 (rebase -i): move comment to description
      t3404 (rebase -i): introduce helper to check position of HEAD
      t4124 (apply --whitespace): use test_might_fail
      apply: handle patches with funny filename and colon in timezone
      cherry-pick/revert: transparently refresh index
      wrapper: move xmmap() to sha1_file.c
      wrapper: move odb_* to environment.c
      path helpers: move git_mkstemp* to wrapper.c
      strbuf: move strbuf_branchname to sha1_name.c
      wrapper: give zlib wrappers their own translation unit
      pack-objects: mark file-local variable static
      Remove pack file handling dependency from wrapper.o
      Documentation: split gitignore page into sections
      Documentation: point to related commands from gitignore
      Describe various forms of "be quiet" using OPT__QUIET
      vcs-svn: Error out for v3 dumps
      fast-import: treat SIGUSR1 as a request to access objects early
      git-rev-parse.txt: clarify --git-dir
      gitweb: document $per_request_config better
      fast-import: stricter parsing of integer options
      fast-import: clarify documentation of "feature" command
      fast-import: Allow cat-blob requests at arbitrary points in stream
      add: introduce add.ignoreerrors synonym for add.ignore-errors
      Documentation: do not misinterpret pull refspec as bold text
      git submodule -b ... of current HEAD fails
      Makefile: dependencies for vcs-svn tests
      parse-options: clearer reporting of API misuse
      parse-options: move NODASH sanity checks to parse_options_check
      parse-options: sanity check PARSE_OPT_NOARG flag
      parse-options: never suppress arghelp if LITERAL_ARGHELP is set
      parse-options: allow git commands to invent new option types
      parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTION
      update-index: migrate to parse-options API
      treap: make treap_insert return inserted node
      vcs-svn: fix intermittent repo_tree corruption
      Makefile: transport-helper uses thread-utils.h
      t9300: avoid short reads from dd
      bash: simple reimplementation of _get_comp_words_by_ref
      t9300: use perl "head -c" clone in place of "dd bs=1 count=16000" kluge
      t0050: fix printf format strings for portability
      t0001: test git init when run via an alias
      diff: funcname and word patterns for perl
      gitweb: skip logo in atom feed when there is none
      gitweb: make logo optional
      daemon: support <directory> arguments again
      t9010: svnadmin can fail even if available
      ll-merge: simplify opts == NULL case
      Documentation/fast-import: capitalize beginning of sentence
      remote-ext: do not segfault for blank lines
      Documentation/fast-import: put explanation of M 040000 <dataref> "" in context
      tests: cosmetic improvements to the repo-setup test
      tests: compress the setup tests
      Documentation: do not treat reset --keep as a special case
      Subject: setup: officially support --work-tree without --git-dir
      t1510: fix typo in the comment of a test
      fast-import: treat filemodify with empty tree as delete
      rebase -i: clarify in-editor documentation of "exec"

Joshua Jensen (6):
      Add string comparison functions that respect the ignore_case variable.
      Case insensitivity support for .gitignore via core.ignorecase
      Add case insensitivity support for directories when using git status
      Add case insensitivity support when using git ls-files
      Support case folding for git add when core.ignorecase=true
      Support case folding in git fast-import when core.ignorecase=true

Junio C Hamano (59):
      gitdiffcore doc: update pickaxe description
      diff: pass the entire diff-options to diffcore_pickaxe()
      git log/diff: add -G<regexp> that greps in the patch text
      diff/log -G<pattern>: tests
      grep: move logic to compile header pattern into a separate helper
      log --author: take union of multiple "author" requests
      disallow branch names that start with a hyphen
      CodingGuidelines: spell Arithmetic Expansion with $(($var))
      Git 1.7.3.1
      MinGW: avoid collisions between "tags" and "TAGS"
      Start 1.7.4 cycle
      merge-recursive: Restructure showing how to chain more process_* functions
      Martin Langhoff has a new e-mail address
      Make test script t9157 executable
      CodingGuidelines: reword parameter expansion section
      shell portability: no "export VAR=VAL"
      t4203: do not let "git shortlog" DWIM based on tty
      merge-recursive:make_room_for_directories - work around dumb compilers
      Git 1.7.3.2
      core.abbrevguard: Ensure short object names stay unique a bit longer
      read_sha1_file(): report correct name of packfile with a corrupt object
      A loose object is not corrupt if it cannot be read due to EMFILE
      t9001: send-email interation with --in-reply-to and --chain-reply-to
      test: git-apply -p2 rename/chmod only
      t3404: do not use 'describe' to implement test_cmp_rev
      t3402: test "rebase -s<strategy> -X<opt>"
      Update draft release notes to 1.7.4
      Documentation: Fix mark-up of lines with more than one tilde
      Git 1.7.0.8
      Update draft release notes to 1.7.4
      t9300: remove unnecessary use of /dev/stdin
      Git 1.7.3.3
      t9119: do not compare "Text Last Updated" line from "svn info"
      Do not link with -lcrypto under NO_OPENSSL
      t9010 fails when no svn is available
      get_sha1: teach ":$n:<path>" the same relative path logic
      Documentation/git.txt: update list of maintenance releases
      fetch_populated_submodules(): document dynamic allocation
      thread-utils.h: simplify the inclusion
      Prepare for 1.7.3.4
      Relnotes: remove items fixed on 'maint'
      get_sha1_oneline: fix lifespan rule of temp_commit_buffer variable
      Prepare for 1.7.3.4
      Git 1.6.4.5
      Update draft release notes to 1.7.4
      commit: die before asking to edit the log message
      set_try_to_free_routine(NULL) means "do nothing special"
      am --abort: keep unrelated commits since the last failure and warn
      t0021: avoid getting filter killed with SIGPIPE
      rebase --skip: correctly wrap-up when skipping the last patch
      userdiff/perl: catch BEGIN/END/... and POD as headers
      Prepare for 1.7.3.5
      Git 1.7.4-rc0
      Git 1.7.3.5
      Git 1.7.4-rc1
      Git 1.7.4-rc2
      Documentation updates for 'GIT_WORK_TREE without GIT_DIR' historical usecase
      Git 1.7.4-rc3
      Git 1.7.4

Justin Frankel (2):
      merge-recursive --patience
      merge-recursive: options to ignore whitespace changes

Kevin Ballard (13):
      merge-recursive: option to specify rename threshold
      diff: add synonyms for -M, -C, -B
      completion: Support the DWIM mode for git checkout
      blame: Add option to show author email instead of name
      Update test script annotate-tests.sh to handle missing/extra authors
      test-lib: extend test_decode_color to handle more color codes
      diff: handle lines containing only whitespace and tabs better
      submodule: preserve all arguments exactly when recursing
      submodule: only preserve flags across recursive status/update invocations
      status: Quote paths with spaces in short format
      rebase: better rearranging of fixup!/squash! lines with --autosquash
      rebase: teach --autosquash to match on sha1 in addition to message
      diff: add --detect-copies-harder as a synonym for --find-copies-harder

Kevin P. Fleming (1):
      post-receive-email: ensure sent messages are not empty

Kirill Smelkov (8):
      gitk: Show notes by default (like git log does)
      user-manual: be consistent in illustrations to 'git rebase'
      blame,cat-file: Prepare --textconv tests for correctly-failing conversion program
      blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks
      blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
      setup: make sure git_dir path is in a permanent buffer, getenv(3) case
      t/t8006: Demonstrate blame is broken when cachetextconv is on
      fill_textconv(): Don't get/put cache if sha1 is not valid

Linus Torvalds (1):
      Fix missing 'does' in man-page for 'git checkout'

Mark Lodato (3):
      completion: make compatible with zsh
      completion: fix zsh check under bash with 'set -u'
      fsck docs: remove outdated and useless diagnostic

Markus Duft (2):
      add support for the SUA layer (interix; windows)
      Interix: add configure checks

Martin Storsjö (1):
      Improve the mingw getaddrinfo stub to handle more use cases

Martin von Zweigbergk (7):
      rebase -X: do not clobber strategy
      Documentation/git-pull: clarify configuration
      rebase: support --verify
      rebase --abort: do not update branch ref
      rebase: only show stat if configured to true
      Use reflog in 'pull --rebase . foo'
      completion: add missing configuration variables

Mathias Lafeldt (1):
      git-svn: fix processing of decorated commit hashes

Matthieu Moy (12):
      update comment and documentation for :/foo syntax
      diff: trivial fix for --output file error message
      Better "Changed but not updated" message in git-status
      Replace "remote tracking" with "remote-tracking"
      Change remote tracking to remote-tracking in non-trivial places
      everyday.txt: change "tracking branch" to "remote-tracking branch"
      Change "tracking branch" to "remote-tracking branch"
      Change incorrect uses of "remote branch" meaning "remote-tracking"
      Change incorrect "remote branch" to "remote tracking branch" in C code
      user-manual.txt: explain better the remote(-tracking) branch terms
      git-branch.txt: mention --set-upstream as a way to change upstream configuration
      commit: suggest --amend --reset-author to fix commiter identity

Michael J Gruber (26):
      git-reset.txt: clarify branch vs. branch head
      git-reset.txt: reset does not change files in target
      git-reset.txt: reset --soft is not a no-op
      git-reset.txt: use "working tree" consistently
      git-reset.txt: point to git-checkout
      git-reset.txt: make modes description more consistent
      remote-helpers: build in platform independent directory
      contrib/completion: --no-index option to git diff
      user-manual: fix anchor name Finding-comments-With-given-Content
      rev-list-options: clarify --parents and --children
      t5503: fix typo
      git-show-ref.txt: clarify the pattern matching
      test: allow running the tests under "prove"
      t/t7004-tag: test handling of rfc1991 signatures
      verify-tag: factor out signature detection
      tag: factor out sig detection for body edits
      tag: factor out sig detection for tag display
      tag: recognize rfc1991 signatures
      cvsimport: partial whitespace cleanup
      git-rm.txt: Fix quoting
      t800?-blame.sh: retitle uniquely
      git-difftool.txt: correct the description of $BASE and describe $MERGED
      difftool: provide basename to external tools
      t1020-subdirectory: test alias expansion in a subdirectory
      cvsimport: handle the parsing of uppercase config options
      RelNotes/1.7.4: minor fixes

Mike Pape (3):
      mingw: add network-wrappers for daemon
      mingw: implement syslog
      compat: add inet_pton and inet_ntop prototypes

Nathan W. Panike (1):
      Fix a formatting error in git-merge.txt

Nguyễn Thái Ngọc Duy (68):
      branch -h: show usage even in an invalid repository
      checkout-index -h: show usage even in an invalid repository
      commit/status -h: show usage even with broken configuration
      gc -h: show usage even with broken configuration
      ls-files -h: show usage even with corrupt index
      merge -h: show usage even with corrupt index
      update-index -h: show usage even with corrupt index
      dir.c: fix EXC_FLAG_MUSTBEDIR match in sparse checkout
      add: do not rely on dtype being NULL behavior
      clean: avoid quoting twice
      clean: remove redundant variable baselen
      get_cwd_relative(): do not misinterpret root path
      builtins: print setup info if repo is found
      Add t1510 and basic rules that run repo setup
      t1510: setup case #0
      t1510: setup case #1
      t1510: setup case #2
      t1510: setup case #3
      t1510: setup case #4
      t1510: setup case #5
      t1510: setup case #6
      t1510: setup case #7
      t1510: setup case #8
      t1510: setup case #9
      t1510: setup case #10
      t1510: setup case #11
      t1510: setup case #12
      t1510: setup case #13
      t1510: setup case #14
      t1510: setup case #15
      t1510: setup case #16
      t1510: setup case #17
      t1510: setup case #18
      t1510: setup case #19
      t1510: setup case #20
      t1510: setup case #21
      t1510: setup case #22
      t1510: setup case #23
      t1510: setup case #24
      t1510: setup case #25
      t1510: setup case #26
      t1510: setup case #27
      t1510: setup case #28
      t1510: setup case #29
      t1510: setup case #30
      t1510: setup case #31
      cache.h: realign and use (1 << x) form for CE_* constants
      dir.c: add free_excludes()
      unpack-trees: move all skip-worktree checks back to unpack_trees()
      entry.c: remove "checkout-index" from error messages
      unpack-trees: fix sparse checkout's "unable to match directories"
      Revert "excluded_1(): support exclude files in index"
      setup: save prefix (original cwd relative to toplevel) in startup_info
      Make prefix_path() return char* without const
      get_sha1: support relative path ":path" syntax
      get_sha1_oneline: make callers prepare the commit list to traverse
      get_sha1: support $commit^{/regex} syntax
      get_sha1: handle special case $commit^{/}
      Add git_config_early()
      Use git_config_early() instead of git_config() during repo setup
      setup: limit get_git_work_tree()'s to explicit setup case only
      setup: clean up setup_bare_git_dir()
      setup: clean up setup_discovered_git_dir()
      setup: rework setup_explicit_git_dir()
      Remove all logic from get_git_work_tree()
      Revert "Documentation: always respect core.worktree if set"
      git.txt: correct where --work-tree path is relative to
      setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwd

Nicolas Pitre (2):
      diff: don't presume empty file when corresponding object is missing
      make pack-objects a bit more resilient to repo corruption

Pascal Obry (3):
      Minor indentation fix.
      Remove @smtp_host_parts variable as not used.
      New send-email option smtpserveroption.

Pat Notz (8):
      strbuf.h: fix comment typo
      dir.c: squelch false uninitialized memory warning
      commit: helper methods to reduce redundant blocks of code
      pretty.c: teach format_commit_message() to reencode the output
      commit: --fixup option for use with rebase --autosquash
      add tests of commit --fixup
      commit: --squash option for use with rebase --autosquash
      add tests of commit --squash

Pat Thoyts (13):
      MinGW: fix stat() and lstat() implementations for handling symlinks
      MinGW: Report errors when failing to launch the html browser.
      Skip t1300.70 and 71 on msysGit.
      Do not strip CR when grepping HTTP headers.
      Skip 'git archive --remote' test on msysGit
      git-am: fix detection of absolute paths for windows
      git-gui: show command-line errors in a messagebox on Windows
      git-gui: enable the Tk console when tracing/debugging on Windows
      git-gui: generic version trimming
      git-gui: use full dialog width for old name when renaming branch
      git-gui: correct assignment of work-tree
      git-gui: use wordprocessor tab style to ensure tabs work as expected
      git-gui: apply color information from git diff output

Pete Wyckoff (1):
      convert filter: supply path to external driver

Peter Krefting (1):
      gitk: Update Swedish translation (290t)

Peter van der Does (1):
      bash: get --pretty=m<tab> completion to work with bash v4

Petr Onderka (1):
      Add global and system-wide gitattributes

Ralf Thielow (1):
      commit.c: Remove backward goto in read_craft_line()

Ralf Wildenhues (1):
      Fix typos in the documentation

Ramkumar Ramachandra (11):
      shell: Rewrite documentation and improve error message
      t4014-format-patch: Call test_tick before committing
      format-patch: Don't go over merge commits
      fmt_merge_msg: Change fmt_merge_msg API to accept shortlog_len
      merge: Make '--log' an integer option for number of shortlog entries
      merge: Make 'merge.log' an integer or boolean option
      t6200-fmt-merge-msg: Exercise 'merge.log' to configure shortlog length
      t6200-fmt-merge-msg: Exercise '--log' to configure shortlog length
      SubmittingPatches: Document some extra tags used in commit messages
      Porcelain scripts: Rewrite cryptic "needs update" error message
      t9010 (svn-fe): Eliminate dependency on svn perl bindings

Ramsay Allan Jones (20):
      t1503: Fix arithmetic expansion syntax error when using dash
      msvc: Fix compilation errors in compat/win32/sys/poll.c
      msvc: git-daemon.exe: Fix linker "unresolved externals" error
      msvc: Fix build by adding missing INTMAX_MAX define
      msvc: Fix macro redefinition warnings
      t3600-rm.sh: Don't pass a non-existent prereq to test #15
      t9142: Move call to start_httpd into the setup test
      lib-git-svn.sh: Avoid setting web server variables unnecessarily
      lib-git-svn.sh: Add check for mis-configured web server variables
      t9501-*.sh: Fix a test failure on Cygwin
      difftool: Fix failure on Cygwin
      t3419-*.sh: Fix arithmetic expansion syntax error
      lib-git-svn.sh: Move web-server handling code into separate function
      t9157-*.sh: Add an svn version check
      t6038-*.sh: Pass the -b (--binary) option to sed on cygwin
      t3032-*.sh: Pass the -b (--binary) option to sed on cygwin
      t3032-*.sh: Do not strip CR from line-endings while grepping on MinGW
      t4135-*.sh: Skip the "backslash" tests on cygwin
      t9157-*.sh: Make the svn version check more precise
      svndump.c: Fix a printf format compiler warning

René Scharfe (10):
      diff: avoid repeated scanning while looking for funcname
      work around buggy S_ISxxx(m) implementations
      add description parameter to OPT__VERBOSE
      add description parameter to OPT__DRY_RUN
      add description parameter to OPT__QUIET
      add OPT__FORCE
      archive: improve --verbose description
      branch: improve --verbose description
      verify-tag: document --verbose
      close file on error in read_mmfile()

Robin H. Johnson (2):
      Fix false positives in t3404 due to SHELL=/bin/false
      t9001: Fix test prerequisites

SZEDER Gábor (7):
      bisect: improve error message of 'bisect log' while not bisecting
      bisect: improve error msg of 'bisect reset' when original HEAD is deleted
      bisect: check for mandatory argument of 'bisect replay'
      bash: offer refs for 'git bisect start'
      bash: not all 'git bisect' subcommands make sense when not bisecting
      bash: support more 'git notes' subcommands and their options
      bash: support pretty format aliases

Santi Béjar (1):
      parse-remote: handle detached HEAD

Schalk, Ken (1):
      t3030: Add a testcase for resolvable rename/add conflict with symlinks

Sebastian Schuberth (3):
      MinGW: Use pid_t more consequently, introduce uid_t for greater compatibility
      MinGW: Add missing file mode bit defines
      On Windows, avoid git-gui to call Cygwin's nice utility

Shawn O. Pearce (2):
      Use git_open_noatime when accessing pack data
      Work around EMFILE when there are too many pack files

Stefan Haller (2):
      gitk: Prevent the text pane from becoming editable
      gitk: Make text selectable on Mac

Stephen Boyd (4):
      send-email: Use To: headers in patch files
      send-email: Don't leak To: headers between patches
      parse-options: Don't call parse_options_check() so much
      parse-options: do not infer PARSE_OPT_NOARG from option type

StephenB (1):
      git svn: fix the final example in man page

Steven Walter (2):
      git-svn: check_cherry_pick should exclude commits already in our history
      git-svn: allow the mergeinfo property to be set

Sven Eckelmann (1):
      contrib/ciabot: git-describe commit instead of HEAD

Sylvain Rabot (2):
      gitweb: add extensions to highlight feature map
      gitweb: remove unnecessary test when closing file descriptor

Tay Ray Chuan (14):
      smart-http: Don't change POST to GET when following redirect
      t5523-push-upstream: add function to ensure fresh upstream repo
      t5523-push-upstream: test progress messages
      format-patch: page output with --stdout
      t5550-http-fetch: add missing '&&'
      t5550-http-fetch: add test for http-fetch
      shift end_url_with_slash() from http.[ch] to url.[ch]
      url: add str wrapper for end_url_with_slash()
      http-backend: use end_url_with_slash()
      http-push: Normalise directory names when pushing to some WebDAV servers
      http-push: check path length before using it
      http-push: add trailing slash at arg-parse time, instead of later on
      http-fetch: rework url handling
      bash completion: add basic support for git-reflog

Thiago Farina (3):
      commit: Add commit_list prefix in two function names.
      builtin/branch.c: Use ALLOC_GROW instead of alloc_nr and xrealloc.
      builtin/rm.c: Use ALLOC_GROW instead of alloc_nr and xrealloc.

Thomas Rast (12):
      send-email: Refuse to send cover-letter template subject
      prefix_filename(): safely handle the case where pfx_len=0
      merge-file: correctly find files when called in subdir
      repack: place temporary packs under .git/objects/pack/
      {cvs,svn}import: use the new 'git read-tree --empty'
      t0003: properly quote $HOME
      gitk: Add the equivalent of diff --color-words
      userdiff: fix typo in ruby and python word regexes
      Documentation/git-archive: spell --worktree-attributes correctly
      Documentation/githooks: post-rewrite-copy-notes never existed
      submodule: fix relative url parsing for scp-style origin
      t0000: quote TAP snippets in test code

Tomas Carnecky (1):
      stash drops the stash even if creating the branch fails because it already exists

Tony Luck (1):
      Better advice on using topic branches for kernel development

Torsten Bögershausen (1):
      t9143: do not fail when unhandled.log.gz is not created

Uwe Kleine-König (2):
      get_author_ident_from_commit(): remove useless quoting
      Documentation/git-clone: describe --mirror more verbosely

Vasyl' Vavrychuk (1):
      trace.c: mark file-local function static

Wesley J. Landaker (1):
      Documentation: Refer to git-commit-tree in git-filter-branch help

Yann Dirson (5):
      t/t3415: use && where applicable.
      Fix copy-pasted comments related to tree diff handling.
      Keep together options controlling the behaviour of diffcore-rename.
      Document that rev-list --graph triggers parent rewriting.
      diff: use "find" instead of "detect" as prefix for long forms of -M and -C

knittl (1):
      bash: Match lightweight tags in prompt

Ævar Arnfjörð Bjarmason (25):
      send-email: use catfile() to concatenate files
      Makefile: add CC to TRACK_CFLAGS
      perl: bump the required Perl version to 5.8 from 5.6.[21]
      perl: use "use warnings" instead of -w
      send-email: use lexical filehandle for opendir
      send-email: use lexical filehandles for $compose
      send-email: use lexical filehandles during sending
      send-email: get_patch_subject doesn't need a prototype
      send-email: file_declares_8bit_cte doesn't need a prototype
      send-email: unique_email_list doesn't need a prototype
      send-email: cleanup_compose_files doesn't need a prototype
      send-email: use \E***\Q instead of \*\*\*
      send-email: sanitize_address use $foo, not "$foo"
      send-email: sanitize_address use qq["foo"], not "\"foo\""
      send-email: use (?:) instead of () if no match variables are needed
      send-email: send_message die on $!, not $?
      send-email: make_message_id use "require" instead of "use"
      send-email: use Perl idioms in while loop
      send-email: is_rfc2047_quoted use qr// regexes
      send-email: extract_valid_address use qr// regexes
      Makefile & configure: add a NO_FNMATCH flag
      Makefile & configure: add a NO_FNMATCH_CASEFOLD flag
      test-lib: make test_expect_code a test command
      t7004-tag.sh: re-arrange git tag comment for clarity
      tests: use test_cmp instead of piping to diff(1)

Štěpán Němec (8):
      Use angles for placeholders consistently
      Fix odd markup in --diff-filter documentation
      Use parentheses and `...' where appropriate
      Remove stray quotes in --pretty and --format documentation
      Put a space between `<' and argument in pack-objects usage string
      Fix {update,checkout}-index usage strings
      CodingGuidelines: Add a section on writing documentation
      diff,difftool: Don't use the {0,2} notation in usage strings

^ permalink raw reply	[relevance 1%]

* [PATCH] Handle rename of case only, for Windows
@ 2011-01-29 23:45  9% Tim Abell
  0 siblings, 0 replies; 200+ results
From: Tim Abell @ 2011-01-29 23:45 UTC (permalink / raw)
  To: git; +Cc: Erik Faye-Lund, Nguyen Thai Ngoc Duy, msysGit

>From ddab003ede9f25d93f4e7eea833523a0aa29d16d Mon Sep 17 00:00:00 2001
From: Tim Abell <tim@timwise.co.uk>
Date: Thu, 27 Jan 2011 22:53:31 +0000
Subject: [PATCH] Handle rename of case only, for Windows

Added test to show rename failing in windows.
Added test to show that this patch doesn't break protection against overwriting
an existing file, and another to show that "mv --force" still works.

Altered mv.c to check whether the source and destination file are actually
the same file based on inode number before failing.
If the inode is zero then the data is no use so old behaviour is maintained.

A message from Linus on the subject:
 http://kerneltrap.org/mailarchive/git/2008/3/21/1220814
 (apparently he never got the energy :-)

Signed-off-by: Tim Abell <tim@timwise.co.uk>
---

Hi folks, this is my second attempt at providing a useful patch for this issue.
Thanks for all the great feedback from my first attempt. I've attempted to address the problems raised.

Hopefully my commit message is more like what is needed this time.
I hadn't realised before that you can split the commit message from this bit with the "---".

>Hmm, not so good. st_ino is always 0 on Windows, so this would make
>false positives, no?

I tested this on windows 7 under cygwin (which is what I have available) and st_ino reports real numbers for me, I also tested that attempting to overwrite another file without --force still fails and added a new test case for this scenario. I have now made sure that if zero is returned then git won't accidentally overwrite other files as I hadn't thought of this before. So this patch shouldn't be regressive even if other versions of windows or other filesystems don't provide valid inode data.

Adding the following line after "lstat(src, &src_st);" shows the inode numbers when calling git mv:
 printf("src inode: %lu, dst inode: %lu", (unsigned long) src_st.st_ino, (unsigned long) st.st_ino);
And here is my ouput showing it in action:

$ git mv foo.txt bar.txt
  fatal: destination exists, source=foo.txt, destination=bar.txt
  src inode: 67064, dst inode: 229369
$ git mv foo.txt Foo.txt
  src inode: 67064, dst inode: 67064

>I wonder if we can make lstat_case() that would only return 0 if it
>matches exactly the filename, even on FAT. FindFirstFile/FindNextFile
>should return true file name, I think. If not, we can make
>lstat_case() take two paths (src and dst) and move all inode
>comparison code in there. Much cleaner.

I'm afraid this is a bit beyond me at the moment, but I'm fairly happy with the solution I have. Thanks for the feedback though.

>Couldn't this be moved inside the scope around "cache_name_pos"?
>That's the only scope it is valid inside anyway...

Done. I wasn't sure about this initially as I'm not very experienced with C programming. Thanks for the pointer.

>Perhaps you could use the full URL (and maybe put it in the commit
>message insted)? It'd be nice if we could reach this information even
>if is.gd disappears...

Good point. I've put the full url in the commit message instead.

>Uhm, is this debug-leftovers? #warning is a preprocessor-construct,
>and it can't understand varaibles in c. Especially not formatted as
>strings. Can #warning even do varags? :P

Yes, it was a debug line. Doh! Complete chance that it compiled, I've been doing too much bash scripting recently it seems. I've stripped it out. A better version is available above should anyone want to see the inode numbers.

Thanks all, I welcome any more feedback.

Does this now look like something that anyone on the git project would like to pick up as a contribution?

Yours

Tim Abell


 builtin/mv.c  |   32 +++++++++++++++++++++-----------
 t/t7001-mv.sh |   35 +++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 11 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index cdbb094..c2f726a 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -165,17 +165,27 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		} else if (cache_name_pos(src, length) < 0)
 			bad = "not under version control";
 		else if (lstat(dst, &st) == 0) {
-			bad = "destination exists";
-			if (force) {
-				/*
-				 * only files can overwrite each other:
-				 * check both source and destination
-				 */
-				if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-					warning("%s; will overwrite!", bad);
-					bad = NULL;
-				} else
-					bad = "Cannot overwrite";
+			/* If we are on a case insensitive file system (windows) and we are only
+			 * changing the case of the file then lstat for the destination will
+			 * return != 0 because it sees the source file.
+			 * To prevent this causing failure, lstat is used to get the inode of the src
+			 * and see if it's actually the same file as dst. If the inode == 0 then
+			 * we can't tell whether it is the same file so we fail regardless. */
+			struct stat src_st;
+			lstat(src, &src_st);
+			if (src_st.st_ino == 0 || src_st.st_ino != st.st_ino) {
+				bad = "destination exists";
+				if (force) {
+					/*
+					 * only files can overwrite each other:
+					 * check both source and destination
+					 */
+					if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
+						warning("%s; will overwrite!", bad);
+						bad = NULL;
+					} else
+						bad = "Cannot overwrite";
+				}
 			}
 		} else if (string_list_has_string(&src_for_dst, dst))
 			bad = "multiple sources for the same target";
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 65a35d9..abaecb6 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,39 @@ test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
 
 rm -f moved symlink
 
+test_expect_success 'git mv should not fail when only changing case' '
+
+	rm -fr .git &&
+	git init &&
+	>foo.txt &&
+	git add foo.txt &&
+	git mv foo.txt Foo.txt
+'
+
+rm *.txt
+
+test_expect_success 'git mv should not overwrite existing file' '
+
+	rm -fr .git &&
+	git init &&
+	>foo.txt &&
+	>bar.txt &&
+	git add foo.txt &&
+	test_must_fail git mv foo.txt bar.txt
+'
+
+rm *.txt
+
+test_expect_success 'git mv -f should overwrite existing file' '
+
+	rm -fr .git &&
+	git init &&
+	>foo.txt &&
+	>bar.txt &&
+	git add foo.txt &&
+	git mv -f foo.txt bar.txt
+'
+
+rm *.txt
+
 test_done
-- 
1.7.3.5.3.g2b35a

^ permalink raw reply related	[relevance 9%]

* Re: [PATCH] handle rename of case only, for windows
  2011-01-14 13:41 10% [PATCH] handle rename of case only, for windows Tim Abell
@ 2011-01-14 14:22  0% ` Erik Faye-Lund
  0 siblings, 0 replies; 200+ results
From: Erik Faye-Lund @ 2011-01-14 14:22 UTC (permalink / raw)
  To: Tim Abell; +Cc: git, msysGit

On Fri, Jan 14, 2011 at 2:41 PM, Tim Abell <tim@timwise.co.uk> wrote:
> Hi folks,
>
> I've never contributed to git before so be gentle :-)
>
> Would someone have the time to help me get this patch into mailine git?
>

First of all, welcome!

There are some problems with your patch that aren't directly related
to the code:
- It's become white-space damaged, most likely from when you e-mailed
it. Perhaps you could try again with git-send-email?
- There's no real commit-message. This e-mail description isn't really
suited as a commit message as it is, IMO. It might just be a matter of
snipping away some stuff, though.
- The patch lacks a sign-off
- Since this is a Windows-issue, it would be nice if you CC'ed
msysgit@googlegroups.com as well. I've done that for now.

I suggest you read through Documentation/SubmittingPatches to get to
know the process.

> I tripped over a failure to rename files on windows when only the case
> has changed. I've created a patch which fixes it for me and doesn't seem
> to break on linux or windows. I also created a test to demonstrate the
> issue (part of this patch). This test passes on linux and fails on
> windows before my patch for mv.c is applied, and passes on both windows
> and linux for me after my patch is applied.
>
> The problem with changing the case of a file happens because git mv
> checks if the destination filename exists before performing a
> move/rename, and on windows lstat reports that the destination file
> *does* already exist because it ignores case for this check and
> semi-erroneously finds the source file.
>
<snip>
> When using "git mv" it is possible to work around the error by using
> --force.
>

Your reasoning seems to match what we've discussed on the msysGit
mailing list. Good work, and a clear description.

> The way I've attempted to fix it in my patch is by checking if the inode
> of the source and destination are the same before deciding to fail with
> a "destination exists" error.
>

Hmm, not so good. st_ino is always 0 on Windows, so this would make
false positives, no?

> The fault exists in both the current cygwin git and the current msysgit,
> so I figured it would be good to get a patch to upstream (you) so that
> it could work everywhere.
>

It also affects MacOS X, AFAIK. So yes, it'd be good for upstream.

> ---
>  builtin/mv.c  |   33 ++++++++++++++++++++++-----------
>  t/t7001-mv.sh |    9 +++++++++
>  2 files changed, 31 insertions(+), 11 deletions(-)
>
> diff --git a/builtin/mv.c b/builtin/mv.c
> index 93e8995..6bb262e 100644
> --- a/builtin/mv.c
> +++ b/builtin/mv.c
> @@ -63,6 +63,7 @@ int cmd_mv(int argc, const char **argv, const char
> *prefix)
>        const char **source, **destination, **dest_path;
>        enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
>        struct stat st;
> +       struct stat src_st;

Couldn't this be moved inside the scope around "cache_name_pos"?
That's the only scope it is valid inside anyway...

And if not, perhaps you could piggy-back on the st-definition, like this:
-       struct stat st;
+       struct stat st, src_st;

>        struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
>
>        git_config(git_default_config, NULL);
> @@ -165,17 +166,27 @@ int cmd_mv(int argc, const char **argv, const char
> *prefix)
>                } else if (cache_name_pos(src, length) < 0)
>                        bad = "not under version control";
>                else if (lstat(dst, &st) == 0) {
> -                       bad = "destination exists";
> -                       if (force) {
> -                               /*
> -                                * only files can overwrite each other:
> -                                * check both source and destination
> -                                */
> -                               if (S_ISREG(st.st_mode) ||
> S_ISLNK(st.st_mode)) {
> -                                       warning("%s; will overwrite!",
> bad);
> -                                       bad = NULL;
> -                               } else
> -                                       bad = "Cannot overwrite";
> +                       /* If we are on a case insensitive files= system
> (windows) http://is.gd/kyxgg

Perhaps you could use the full URL (and maybe put it in the commit
message insted)? It'd be nice if we could reach this information even
if is.gd disappears...

> +                        * and we are only changing the case of the file
> then lstat for the
> +                        * destination will return != 0 because it sees
> the source file.
> +                        * To prevent this causing failure, lstat is
> used to get the inode of the src
> +                        * and see if it's actually the same file.
> +                        */
> +                       lstat(src, &src_st); //get file serial number
> (inode) for source
> +                       #warning("src inode: %s, dst inode: %s",
> src_st.st_ino, st.st_ino);

Uhm, is this debug-leftovers? #warning is a preprocessor-construct,
and it can't understand varaibles in c. Especially not formatted as
strings. Can #warning even do varags? :P

Blah, it's too tiresome to review this white-space broken version, and
I seen now that you have re-posted a non-broken version. Thanks!

^ permalink raw reply	[relevance 0%]

* [PATCH] handle rename of case only, for windows (resend)
@ 2011-01-14 13:54 10% Tim Abell
  0 siblings, 0 replies; 200+ results
From: Tim Abell @ 2011-01-14 13:54 UTC (permalink / raw)
  To: git

Sorry folks, resending because my mail client wrapped the lines in my
patch on my first attempt.

If there's any more problems with the way I've sent it you can grab a
copy from http://is.gd/iWupI8

Tim

--------

Hi folks,

I've never contributed to git before so be gentle :-)

Would someone have the time to help me get this patch into mailine git?

I tripped over a failure to rename files on windows when only the case
has changed. I've created a patch which fixes it for me and doesn't seem
to break on linux or windows. I also created a test to demonstrate the
issue (part of this patch). This test passes on linux and fails on
windows before my patch for mv.c is applied, and passes on both windows
and linux for me after my patch is applied.

The problem with changing the case of a file happens because git mv
checks if the destination filename exists before performing a
move/rename, and on windows lstat reports that the destination file
*does* already exist because it ignores case for this check and
semi-erroneously finds the source file.

The way I've attempted to fix it in my patch is by checking if the inode
of the source and destination are the same before deciding to fail with
a "destination exists" error.

When using "git mv" it is possible to work around the error by using
--force.

I've also seen a problem with windows users pulling from remotes where a
case only rename has been performed which is more problematic as you
have to tell every user how to handle the issue. I'm not sure if I've
managed to fix that case or not.

The fault exists in both the current cygwin git and the current msysgit,
so I figured it would be good to get a patch to upstream (you) so that
it could work everywhere. 

I found an email from Linus relating to this issue here:
http://marc.info/?l=git&m=120612172706823 so it's a known problem.

Thanks

Tim Abell

---
 builtin/mv.c  |   33 ++++++++++++++++++++++-----------
 t/t7001-mv.sh |    9 +++++++++
 2 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 93e8995..6bb262e 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -63,6 +63,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	const char **source, **destination, **dest_path;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
 	struct stat st;
+	struct stat src_st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
 
 	git_config(git_default_config, NULL);
@@ -165,17 +166,27 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		} else if (cache_name_pos(src, length) < 0)
 			bad = "not under version control";
 		else if (lstat(dst, &st) == 0) {
-			bad = "destination exists";
-			if (force) {
-				/*
-				 * only files can overwrite each other:
-				 * check both source and destination
-				 */
-				if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-					warning("%s; will overwrite!", bad);
-					bad = NULL;
-				} else
-					bad = "Cannot overwrite";
+			/* If we are on a case insensitive files= system (windows) http://is.gd/kyxgg
+			 * and we are only changing the case of the file then lstat for the
+			 * destination will return != 0 because it sees the source file.
+			 * To prevent this causing failure, lstat is used to get the inode of the src
+			 * and see if it's actually the same file.
+			 */
+			lstat(src, &src_st); //get file serial number (inode) for source
+			#warning("src inode: %s, dst inode: %s", src_st.st_ino, st.st_ino);
+			if (src_st.st_ino != st.st_ino) {
+				bad = "destination exists";
+				if (force) {
+					/*
+					 * only files can overwrite each other:
+					 * check both source and destination
+					 */
+					if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
+						warning("%s; will overwrite!", bad);
+						bad = NULL;
+					} else
+						bad = "Cannot overwrite";
+				}
 			}
 		} else if (string_list_has_string(&src_for_dst, dst))
 			bad = "multiple sources for the same target";
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..95146bf 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,13 @@ test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
 
 rm -f moved symlink
 
+test_expect_success 'git mv should not fail when only changing case' '
+
+	rm -fr .git &&
+	git init &&
+	>foo.txt &&
+	git add foo.txt &&
+	git mv foo.txt Foo.txt
+'
+
 test_done
-- 
1.5.6.5

^ permalink raw reply related	[relevance 10%]

* [PATCH] handle rename of case only, for windows
@ 2011-01-14 13:44 10% Tim Abell
  0 siblings, 0 replies; 200+ results
From: Tim Abell @ 2011-01-14 13:44 UTC (permalink / raw)
  To: git

Hi folks,

I've never contributed to git before so be gentle :-)

Would someone have the time to help me get this patch into mailine git?

I tripped over a failure to rename files on windows when only the case
has changed. I've created a patch which fixes it for me and doesn't seem
to break on linux or windows. I also created a test to demonstrate the
issue (part of this patch). This test passes on linux and fails on
windows before my patch for mv.c is applied, and passes on both windows
and linux for me after my patch is applied.

The problem with changing the case of a file happens because git mv
checks if the destination filename exists before performing a
move/rename, and on windows lstat reports that the destination file
*does* already exist because it ignores case for this check and
semi-erroneously finds the source file.

The way I've attempted to fix it in my patch is by checking if the inode
of the source and destination are the same before deciding to fail with
a "destination exists" error.

When using "git mv" it is possible to work around the error by using
--force.

I've also seen a problem with windows users pulling from remotes where a
case only rename has been performed which is more problematic as you
have to tell every user how to handle the issue. I'm not sure if I've
managed to fix that case or not.

The fault exists in both the current cygwin git and the current msysgit,
so I figured it would be good to get a patch to upstream (you) so that
it could work everywhere. 

I found an email from Linus relating to this issue here:
http://marc.info/?l=git&m=120612172706823 so it's a known problem.

Thanks

Tim Abell

---
 builtin/mv.c  |   33 ++++++++++++++++++++++-----------
 t/t7001-mv.sh |    9 +++++++++
 2 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 93e8995..6bb262e 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -63,6 +63,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 	const char **source, **destination, **dest_path;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
 	struct stat st;
+	struct stat src_st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
 
 	git_config(git_default_config, NULL);
@@ -165,17 +166,27 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 		} else if (cache_name_pos(src, length) < 0)
 			bad = "not under version control";
 		else if (lstat(dst, &st) == 0) {
-			bad = "destination exists";
-			if (force) {
-				/*
-				 * only files can overwrite each other:
-				 * check both source and destination
-				 */
-				if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-					warning("%s; will overwrite!", bad);
-					bad = NULL;
-				} else
-					bad = "Cannot overwrite";
+			/* If we are on a case insensitive files= system (windows) http://is.gd/kyxgg
+			 * and we are only changing the case of the file then lstat for the
+			 * destination will return != 0 because it sees the source file.
+			 * To prevent this causing failure, lstat is used to get the inode of the src
+			 * and see if it's actually the same file.
+			 */
+			lstat(src, &src_st); //get file serial number (inode) for source
+			#warning("src inode: %s, dst inode: %s", src_st.st_ino, st.st_ino);
+			if (src_st.st_ino != st.st_ino) {
+				bad = "destination exists";
+				if (force) {
+					/*
+					 * only files can overwrite each other:
+					 * check both source and destination
+					 */
+					if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
+						warning("%s; will overwrite!", bad);
+						bad = NULL;
+					} else
+						bad = "Cannot overwrite";
+				}
 			}
 		} else if (string_list_has_string(&src_for_dst, dst))
 			bad = "multiple sources for the same target";
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..95146bf 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,13 @@ test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
 
 rm -f moved symlink
 
+test_expect_success 'git mv should not fail when only changing case' '
+
+	rm -fr .git &&
+	git init &&
+	>foo.txt &&
+	git add foo.txt &&
+	git mv foo.txt Foo.txt
+'
+
 test_done
-- 
1.5.6.5

^ permalink raw reply related	[relevance 10%]

* [PATCH] handle rename of case only, for windows
@ 2011-01-14 13:41 10% Tim Abell
  2011-01-14 14:22  0% ` Erik Faye-Lund
  0 siblings, 1 reply; 200+ results
From: Tim Abell @ 2011-01-14 13:41 UTC (permalink / raw)
  To: git

Hi folks,

I've never contributed to git before so be gentle :-)

Would someone have the time to help me get this patch into mailine git?

I tripped over a failure to rename files on windows when only the case
has changed. I've created a patch which fixes it for me and doesn't seem
to break on linux or windows. I also created a test to demonstrate the
issue (part of this patch). This test passes on linux and fails on
windows before my patch for mv.c is applied, and passes on both windows
and linux for me after my patch is applied.

The problem with changing the case of a file happens because git mv
checks if the destination filename exists before performing a
move/rename, and on windows lstat reports that the destination file
*does* already exist because it ignores case for this check and
semi-erroneously finds the source file.

The way I've attempted to fix it in my patch is by checking if the inode
of the source and destination are the same before deciding to fail with
a "destination exists" error.

When using "git mv" it is possible to work around the error by using
--force.

I've also seen a problem with windows users pulling from remotes where a
case only rename has been performed which is more problematic as you
have to tell every user how to handle the issue. I'm not sure if I've
managed to fix that case or not.

The fault exists in both the current cygwin git and the current msysgit,
so I figured it would be good to get a patch to upstream (you) so that
it could work everywhere. 

I found an email from Linus relating to this issue here:
http://marc.info/?l=git&m=120612172706823 so it's a known problem.

Thanks

Tim Abell

---
 builtin/mv.c  |   33 ++++++++++++++++++++++-----------
 t/t7001-mv.sh |    9 +++++++++
 2 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index 93e8995..6bb262e 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -63,6 +63,7 @@ int cmd_mv(int argc, const char **argv, const char
*prefix)
 	const char **source, **destination, **dest_path;
 	enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
 	struct stat st;
+       struct stat src_st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
 
 	git_config(git_default_config, NULL);
@@ -165,17 +166,27 @@ int cmd_mv(int argc, const char **argv, const char
*prefix)
 		} else if (cache_name_pos(src, length) < 0)
 			bad = "not under version control";
 		else if (lstat(dst, &st) == 0) {
-                       bad = "destination exists";
-                       if (force) {
-                               /*
-                                * only files can overwrite each other:
-                                * check both source and destination
-                                */
-                               if (S_ISREG(st.st_mode) ||
S_ISLNK(st.st_mode)) {
-                                       warning("%s; will overwrite!",
bad);
-                                       bad = NULL;
-                               } else
-                                       bad = "Cannot overwrite";
+                       /* If we are on a case insensitive files= system
(windows) http://is.gd/kyxgg
+                        * and we are only changing the case of the file
then lstat for the
+                        * destination will return != 0 because it sees
the source file.
+                        * To prevent this causing failure, lstat is
used to get the inode of the src
+                        * and see if it's actually the same file.
+                        */
+                       lstat(src, &src_st); //get file serial number
(inode) for source
+                       #warning("src inode: %s, dst inode: %s",
src_st.st_ino, st.st_ino);
+                       if (src_st.st_ino != st.st_ino) {
+                               bad = "destination exists";
+                               if (force) {
+                                       /*
+                                        * only files can overwrite each
other:
+                                        * check both source and
destination
+                                        */
+                                       if (S_ISREG(st.st_mode) ||
S_ISLNK(st.st_mode)) {
+                                               warning("%s; will
overwrite!", bad);
+                                               bad = NULL;
+                                       } else
+                                               bad = "Cannot
overwrite";
+                               }
 			}
 		} else if (string_list_has_string(&src_for_dst, dst))
 			bad = "multiple sources for the same target";
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index a845b15..95146bf 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -255,4 +255,13 @@ test_expect_success SYMLINKS 'git mv should
overwrite file with a symlink' '
 
 rm -f moved symlink
 
+test_expect_success 'git mv should not fail when only changing case' '
+
+       rm -fr .git &&
+       git init &&
+       >foo.txt &&
+       git add foo.txt &&
+       git mv foo.txt Foo.txt
+'
+
 test_done
-- 
1.5.6.5

^ permalink raw reply related	[relevance 10%]

* What's cooking in git.git (Nov 2010, #03; Wed, 24)
@ 2010-11-25  3:16  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2010-11-25  3:16 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with '-' are
only in 'pu' while commits prefixed with '+' are in 'next'.  The ones
marked with '.' do not appear in any of the integration branches, but I am
still holding onto them.

Tonight's pushout may be a bit less stable than usual, as I am pushing
this out without waiting for the usual test cycle I ran on the kernel.org
machine, but hey, small breakage here and there will give something for
people to take a look at when they are bored eating roasted bird ;-)

--------------------------------------------------
[New Topics]

* ef/win32-dirent (2010-11-23) 6 commits
 - win32: use our own dirent.h
 - msvc: opendir: handle paths ending with a slash
 - win32: dirent: handle errors
 - msvc: opendir: do not start the search
 - msvc: opendir: allocate enough memory
 - msvc: opendir: fix malloc-failure

* jk/asciidoc-update (2010-11-19) 1 commit
 - docs: default to more modern toolset

* jk/maint-reflog-bottom (2010-11-21) 1 commit
 - reflogs: clear flags properly in corner case

* jn/fast-import-ondemand-checkpoint (2010-11-22) 1 commit
 - fast-import: treat SIGUSR1 as a request to access objects early

* jn/maint-fast-import-object-reuse (2010-11-23) 1 commit
 - fast-import: insert new object entries at start of hash bucket

* jn/maint-svn-fe (2010-10-10) 1 commit
 - t9010 (svn-fe): Eliminate dependency on svn perl bindings

* jn/svn-fe (2010-11-19) 17 commits
 - vcs-svn: Implement Prop-delta handling
 - vcs-svn: Sharpen parsing of property lines
 - vcs-svn: Split off function for handling of individual properties
 - vcs-svn: Make source easier to read on small screens
 - vcs-svn: More dump format sanity checks
 - vcs-svn: Reject path nodes without Node-action
 - vcs-svn: Delay read of per-path properties
 - vcs-svn: Combine repo_replace and repo_modify functions
 - vcs-svn: Replace = Delete + Add
 - vcs-svn: handle_node: Handle deletion case early
 - vcs-svn: Use mark to indicate nodes with included text
 - vcs-svn: Unclutter handle_node by introducing have_props var
 - vcs-svn: Eliminate node_ctx.mark global
 - vcs-svn: Eliminate node_ctx.srcRev global
 - vcs-svn: Check for errors from open()
 - vcs-svn: Allow simple v3 dumps (no deltas yet)
 - vcs-svn: Error out for v3 dumps

Some RFC patches, to give them early and wider exposure.

* mz/rebase-abort-reflog-fix (2010-11-21) 1 commit
 - rebase --abort: do not update branch ref

* mz/rebase-i-verify (2010-11-22) 1 commit
 - rebase: support --verify

* nd/maint-relative (2010-11-20) 1 commit
 - get_cwd_relative(): do not misinterpret root path

* tc/format-patch-p (2010-11-23) 1 commit
 - format-patch: page output with --stdout

* tc/http-urls-ends-with-slash (2010-11-22) 7 commits
 - http-push: add trailing slash at arg-parse time, instead of later on
 - http-push: check path length before using it
 - http-push: Normalise directory names when pushing to some WebDAV servers
 - http-backend: use end_url_with_slash()
 - url: add str wrapper for end_url_with_slash()
 - shift end_url_with_slash() from http.[ch] to url.[ch]
 - t5550-http-fetch: add missing '&&'

--------------------------------------------------
[Graduated to "master"]

* ao/send-email-irt (2010-11-12) 2 commits
  (merged to 'next' on 2010-11-15 at 257c77a)
 + git-send-email.perl: make initial In-Reply-To apply only to first email
  (merged to 'next' on 2010-11-08 at d103166)
 + t9001: send-email interation with --in-reply-to and --chain-reply-to

* cb/maint-orphan-merge-noclobber (2010-11-14) 1 commit
  (merged to 'next' on 2010-11-15 at 046c5e5)
 + do not overwrite untracked during merge from unborn branch

* ef/mingw-daemon (2010-11-04) 16 commits
  (merged to 'next' on 2010-11-17 at 4a295c7)
 + daemon: opt-out on features that require posix
 + daemon: make --inetd and --detach incompatible
 + daemon: use socklen_t
 + mingw: use poll-emulation from gnulib
 + mingw: import poll-emulation from gnulib
 + daemon: get remote host address from root-process
 + Improve the mingw getaddrinfo stub to handle more use cases
 + daemon: use full buffered mode for stderr
 + daemon: use run-command api for async serving
 + mingw: add kill emulation
 + mingw: support waitpid with pid > 0 and WNOHANG
 + mingw: use real pid
 + inet_ntop: fix a couple of old-style decls
 + compat: add inet_pton and inet_ntop prototypes
 + mingw: implement syslog
 + mingw: add network-wrappers for daemon

* en/and-cascade-tests (2010-10-31) 25 commits
  (merged to 'next' on 2010-11-15 at d51ec77)
 + t4124 (apply --whitespace): use test_might_fail
 + t3404: do not use 'describe' to implement test_cmp_rev
 + t3404 (rebase -i): introduce helper to check position of HEAD
 + t3404 (rebase -i): move comment to description
 + t3404 (rebase -i): unroll test_commit loops
 + t3301 (notes): use test_expect_code for clarity
 + t1400 (update-ref): use test_must_fail
 + t1502 (rev-parse --parseopt): test exit code from "-h"
 + t6022 (renaming merge): chain test commands with &&
 + test-lib: introduce test_line_count to measure files
 + tests: add missing &&, batch 2
 + tests: add missing &&
 + Introduce sane_unset and use it to ensure proper && chaining
 + t7800 (difftool): add missing &&
 + t7601 (merge-pull-config): add missing &&
 + t7001 (mv): add missing &&
 + t6016 (rev-list-graph-simplify-history): add missing &&
 + t5602 (clone-remote-exec): add missing &&
 + t4026 (color): remove unneeded and unchained command
 + t4019 (diff-wserror): add lots of missing &&
 + t4202 (log): Replace '<git-command> || :' with test_might_fail
 + t4002 (diff-basic): use test_might_fail for commands that might fail
 + t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
 + t4017 (diff-retval): replace manual exit code check with test_expect_code
 + test-lib: make test_expect_code a test command
 (this branch is used by jn/git-cmd-h-bypass-setup.)

* jk/add-e-doc (2010-11-08) 2 commits
  (merged to 'next' on 2010-11-15 at e971401)
 + docs: give more hints about how "add -e" works
  (merged to 'next' on 2010-11-05 at 389fee7)
 + docs: give more hints about how "add -e" works

* kb/maint-rebase-autosquash (2010-11-04) 2 commits
  (merged to 'next' on 2010-11-15 at 9b8c830)
 + rebase: teach --autosquash to match on sha1 in addition to message
 + rebase: better rearranging of fixup!/squash! lines with --autosquash

* mm/phrase-remote-tracking (2010-11-02) 10 commits
  (merged to 'next' on 2010-11-15 at 07d67f4)
 + git-branch.txt: mention --set-upstream as a way to change upstream configuration
 + user-manual: remote-tracking can be checked out, with detached HEAD
 + user-manual.txt: explain better the remote(-tracking) branch terms
 + Change incorrect "remote branch" to "remote tracking branch" in C code
 + Change incorrect uses of "remote branch" meaning "remote-tracking"
 + Change "tracking branch" to "remote-tracking branch"
 + everyday.txt: change "tracking branch" to "remote-tracking branch"
 + Change remote tracking to remote-tracking in non-trivial places
 + Replace "remote tracking" with "remote-tracking"
 + Better "Changed but not updated" message in git-status

* rs/opt-help-text (2010-11-08) 8 commits
  (merged to 'next' on 2010-11-15 at 631c222)
 + verify-tag: document --verbose
 + branch: improve --verbose description
 + archive: improve --verbose description
 + Describe various forms of "be quiet" using OPT__QUIET
 + add OPT__FORCE
 + add description parameter to OPT__QUIET
 + add description parameter to OPT__DRY_RUN
 + add description parameter to OPT__VERBOSE

--------------------------------------------------
[Stalled]

* nd/index-doc (2010-09-06) 1 commit
 - doc: technical details about the index file format

Half-written but it is a good start.  I may need to give some help in
describing more recent index extensions.

* cb/ignored-paths-are-precious (2010-08-21) 1 commit
 - checkout/merge: optionally fail operation when ignored files need to be overwritten

This needs tests; also we know of longstanding bugs in related area that
needs to be addressed---they do not have to be part of this series but
their reproduction recipe would belong to the test script for this topic.

It would hurt users to make the new feature on by default, especially the
ones with subdirectories that come and go.

* jk/tag-contains (2010-07-05) 4 commits
 - Why is "git tag --contains" so slow?
 - default core.clockskew variable to one day
 - limit "contains" traversals based on commit timestamp
 - tag: speed up --contains calculation

The idea of the bottom one is probably Ok, except that the use of object
flags needs to be rethought, or at least the helper needs to be moved to
builtin/tag.c to make it clear that it should not be used outside the
current usage context.

* tr/config-doc (2010-10-24) 2 commits
 . Documentation: complete config list from other manpages
 . Documentation: Move variables from config.txt to separate file

This unfortunately heavily conflicts with patches in flight...

--------------------------------------------------
[Cooking]

* gb/gitweb-remote-heads (2010-11-11) 11 commits
  (merged to 'next' on 2010-11-24 at 6fb4a6f)
 + git instaweb: enable remote_heads
 + gitweb: group remote heads by remote
 + gitweb: provide a routine to display (sub)sections
 + gitweb: refactor repository URL printing
 + gitweb: remotes view for a single remote
 + gitweb: allow action specialization in page header
 + gitweb: nagivation menu for tags, heads and remotes
 + gitweb: separate heads and remotes lists
 + gitweb: git_get_heads_list accepts an optional list of refs
 + gitweb: introduce remote_heads feature
 + gitweb: use fullname as hash_base in heads link

* gc/http-with-non-ascii-username-url (2010-11-14) 2 commits
  (merged to 'next' on 2010-11-24 at 08f317f)
 + Fix username and password extraction from HTTP URLs
 + t5550: test HTTP authentication and userinfo decoding

* jk/maint-decorate-01-bool (2010-11-17) 1 commit
  (merged to 'next' on 2010-11-24 at 347f73b)
 + log.decorate: accept 0/1 bool values
 (this branch is used by jk/pager-per-command.)

* jk/pager-per-command (2010-11-17) 1 commit
  (merged to 'next' on 2010-11-24 at 9ebcffc)
 + allow command-specific pagers in pager.<cmd>
 (this branch uses jk/maint-decorate-01-bool.)

* jn/getenv-poison (2010-11-12) 1 commit
 . add GETENV_POISON option to simulate unfriendly getenv()
 (this branch uses ks/maint-getenv-fix.)

* jn/gitweb-time-hires-comes-with-5.8 (2010-11-09) 1 commit
  (merged to 'next' on 2010-11-24 at 6b91b41)
 + gitweb: Time::HiRes is in core for Perl 5.8

* jn/ignore-doc (2010-11-10) 2 commits
  (merged to 'next' on 2010-11-24 at c0a9730)
 + Documentation: point to related commands from gitignore
 + Documentation: split gitignore page into sections

* jn/thinner-wrapper (2010-11-06) 7 commits
  (merged to 'next' on 2010-11-24 at 3f2227d)
 + Remove pack file handling dependency from wrapper.o
 + pack-objects: mark file-local variable static
 + wrapper: give zlib wrappers their own translation unit
 + strbuf: move strbuf_branchname to sha1_name.c
 + path helpers: move git_mkstemp* to wrapper.c
 + wrapper: move odb_* to environment.c
 + wrapper: move xmmap() to sha1_file.c

* ks/maint-getenv-fix (2010-11-11) 1 commit
  (merged to 'next' on 2010-11-24 at fa89826)
 + setup: make sure git_dir path is in a permanent buffer, getenv(3) case
 (this branch is used by jn/getenv-poison.)

* nd/extended-sha1-relpath (2010-11-11) 2 commits
 - get_sha1: support relative path ":path" syntax
 - Make prefix_path() return char* without const
 (this branch uses jn/parse-options-extra.)

* nd/maint-fix-add-typo-detection (2010-11-11) 1 commit
  (merged to 'next' on 2010-11-24 at 6832306)
 + add: do not rely on dtype being NULL behavior

* jh/gitweb-caching (2010-11-01) 4 commits
 - gitweb: Minimal testing of gitweb caching
 - gitweb: File based caching layer (from git.kernel.org)
 - gitweb: add output buffering and associated functions
 - gitweb: Prepare for splitting gitweb

* jc/abbrev-guard (2010-10-28) 1 commit
  (merged to 'next' on 2010-11-24 at f26c943)
 + core.abbrevguard: Ensure short object names stay unique a bit longer

* jc/emfile (2010-10-28) 2 commits
  (merged to 'next' on 2010-11-17 at dac1bc6)
 + A loose object is not corrupt if it cannot be read due to EMFILE
 + read_sha1_file(): report correct name of packfile with a corrupt object
 (this branch is used by sp/emfile.)

* sp/emfile (2010-11-01) 2 commits
  (merged to 'next' on 2010-11-24 at f46d2ce)
 + Work around EMFILE when there are too many pack files
 + Use git_open_noatime when accessing pack data
 (this branch uses jc/emfile.)

* jl/add-p-reverse-message (2010-10-27) 1 commit
  (merged to 'next' on 2010-11-17 at db2ce14)
 + Correct help blurb in checkout -p and friends

* jl/clone-recurse-sm-synonym (2010-11-04) 1 commit
  (merged to 'next' on 2010-11-17 at 8c326c2)
 + clone: Add the --recurse-submodules option as alias for --recursive

* jn/cherry-pick-refresh-index (2010-10-31) 1 commit
  (merged to 'next' on 2010-11-17 at 75e9103)
 + cherry-pick/revert: transparently refresh index

* jn/parse-options-extra (2010-10-24) 4 commits
 - update-index: migrate to parse-options API
 - setup: save prefix (original cwd relative to toplevel) in startup_info
 - parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTION
 - parse-options: allow git commands to invent new option types
 (this branch is used by nd/extended-sha1-relpath.)

Wait for a reroll from Jonathan (2010-11-09).

* md/interix (2010-10-27) 2 commits
  (merged to 'next' on 2010-11-17 at 2a8b562)
 + Interix: add configure checks
 + add support for the SUA layer (interix; windows)

* nd/setup (2010-11-11) 47 commits
 - git.txt: correct where --work-tree path is relative to
 - Revert "Documentation: always respect core.worktree if set"
 - t0001: test git init when run via an alias
 - Remove all logic from get_git_work_tree()
 - setup: rework setup_explicit_git_dir()
 - setup: clean up setup_discovered_git_dir()
 - t1020-subdirectory: test alias expansion in a subdirectory
 - setup: clean up setup_bare_git_dir()
 - setup: limit get_git_work_tree()'s to explicit setup case only
 - Use git_config_early() instead of git_config() during repo setup
 - Add git_config_early()
 - rev-parse: prints --git-dir relative to user's cwd
 - git-rev-parse.txt: clarify --git-dir
 - t1510: setup case #31
 - t1510: setup case #30
 - t1510: setup case #29
 - t1510: setup case #28
 - t1510: setup case #27
 - t1510: setup case #26
 - t1510: setup case #25
 - t1510: setup case #24
 - t1510: setup case #23
 - t1510: setup case #22
 - t1510: setup case #21
 - t1510: setup case #20
 - t1510: setup case #19
 - t1510: setup case #18
 - t1510: setup case #17
 - t1510: setup case #16
 - t1510: setup case #15
 - t1510: setup case #14
 - t1510: setup case #13
 - t1510: setup case #12
 - t1510: setup case #11
 - t1510: setup case #10
 - t1510: setup case #9
 - t1510: setup case #8
 - t1510: setup case #7
 - t1510: setup case #6
 - t1510: setup case #5
 - t1510: setup case #4
 - t1510: setup case #3
 - t1510: setup case #2
 - t1510: setup case #1
 - t1510: setup case #0
 - Add t1510 and basic rules that run repo setup
 - builtins: print setup info if repo is found

I have to queue a handful of fixups still in flight.

* rr/needs-clean-work-tree (2010-10-19) 1 commit
  (merged to 'next' on 2010-11-17 at b8aee21)
 + Porcelain scripts: Rewrite cryptic "needs update" error message

Will merge to master soonish.

* sn/diff-doc (2010-11-04) 3 commits
  (merged to 'next' on 2010-11-24 at 77190a5)
 + docs: clarify git diff modes of operation
 + diff,difftool: Don't use the {0,2} notation in usage strings
 + CodingGuidelines: Add a section on writing documentation

* kb/maint-status-cquote (2010-11-08) 1 commit
  (merged to 'next' on 2010-11-24 at e15b73d)
 + status: Quote paths with spaces in short format

* mg/maint-tag-rfc1991 (2010-11-10) 5 commits
  (merged to 'next' on 2010-11-24 at 03864ed)
 + tag: recognize rfc1991 signatures
 + tag: factor out sig detection for tag display
 + tag: factor out sig detection for body edits
 + verify-tag: factor out signature detection
 + t/t7004-tag: test handling of rfc1991 signatures

* cm/diff-check-at-eol (2010-10-10) 1 commit
  (merged to 'next' on 2010-11-17 at ad7005a)
 + diff --check: correct line numbers of new blank lines at EOF

* fc/apply-p2-get-header-name (2010-10-21) 2 commits
  (merged to 'next' on 2010-11-17 at 05a8e94)
 + test: git-apply -p2 rename/chmod only
 + Fix git-apply with -p greater than 1

* jk/diff-CBM (2010-10-21) 1 commit
  (merged to 'next' on 2010-11-05 at 9d1ec14)
 + diff: report bogus input to -C/-M/-B

Will merge to master soonish.

* jn/fast-import-fix (2010-10-20) 4 commits
  (merged to 'next' on 2010-11-17 at ef3b791)
 + fast-import: do not clear notes in do_change_note_fanout()
 + t9300 (fast-import): another test for the "replace root" feature
 + fast-import: tighten M 040000 syntax
 + fast-import: filemodify after M 040000 <tree> "" crashes

* jn/git-cmd-h-bypass-setup (2010-10-22) 7 commits
 - update-index -h: show usage even with corrupt index
 - merge -h: show usage even with corrupt index
 - ls-files -h: show usage even with corrupt index
 - gc -h: show usage even with broken configuration
 - commit/status -h: show usage even with broken configuration
 - checkout-index -h: show usage even in an invalid repository
 - branch -h: show usage even in an invalid repository

* kb/blame-author-email (2010-10-15) 1 commit
  (merged to 'next' on 2010-11-17 at 6fd6a2f)
 + blame: Add option to show author email instead of name

* np/diff-in-corrupt-repository (2010-10-22) 1 commit
  (merged to 'next' on 2010-11-17 at b57a6cb)
 + diff: don't presume empty file when corresponding object is missing

* np/pack-broken-boundary (2010-10-22) 1 commit
  (merged to 'next' on 2010-11-17 at 69a9f46)
 + make pack-objects a bit more resilient to repo corruption

* yd/dir-rename (2010-10-29) 5 commits
 - Allow hiding renames of individual files involved in a directory rename.
 - Unified diff output format for bulk moves.
 - Add testcases for the --detect-bulk-moves diffcore flag.
 - Raw diff output format for bulk moves.
 - Introduce bulk-move detection in diffcore.

Yet to be rerolled.

* en/merge-recursive (2010-11-08) 40 commits
  (merged to 'next' on 2010-11-17 at 1b6f865)
 + t6022: Use -eq not = to test output of wc -l
  (merged to 'next' on 2010-11-05 at 16902eb)
 + merge-recursive:make_room_for_directories - work around dumb compilers
 + merge-recursive: Remove redundant path clearing for D/F conflicts
 + merge-recursive: Make room for directories in D/F conflicts
 + handle_delete_modify(): Check whether D/F conflicts are still present
 + merge_content(): Check whether D/F conflicts are still present
 + conflict_rename_rename_1to2(): Fix checks for presence of D/F conflicts
 + conflict_rename_delete(): Check whether D/F conflicts are still present
 + merge-recursive: Delay modify/delete conflicts if D/F conflict present
 + merge-recursive: Delay content merging for renames
 + merge-recursive: Delay handling of rename/delete conflicts
 + merge-recursive: Move handling of double rename of one file to other file
 + merge-recursive: Move handling of double rename of one file to two
 + merge-recursive: Avoid doubly merging rename/add conflict contents
 + merge-recursive: Update merge_content() call signature
 + merge-recursive: Update conflict_rename_rename_1to2() call signature
 + merge-recursive: Structure process_df_entry() to handle more cases
 + merge-recursive: Have process_entry() skip D/F or rename entries
 + merge-recursive: New function to assist resolving renames in-core only
 + merge-recursive: New data structures for deferring of D/F conflicts
 + merge-recursive: Move process_entry's content merging into a function
 + merge-recursive: Move delete/modify handling into dedicated function
 + merge-recursive: Move rename/delete handling into dedicated function
 + merge-recursive: Nuke rename/directory conflict detection
 + merge-recursive: Rename conflict_rename_rename*() for clarity
 + merge-recursive: Small code clarification -- variable name and comments
 + t6036: Add testcase for undetected conflict
 + t6036: Add a second testcase similar to the first but with content changes
 + t6036: Test index and worktree state, not just that merge fails
 + t6020: Add a testcase for modify/delete + directory/file conflict
 + t6020: Modernize style a bit
 + t6022: Add tests for rename/rename combined with D/F conflicts
 + t6022: Add paired rename+D/F conflict: (two/file, one/file) -> (one, two)
 + t6022: Add tests with both rename source & dest involved in D/F conflicts
 + t6022: Add tests for reversing order of merges when D/F conflicts present
 + t6022: Add test combinations of {content conflict?, D/F conflict remains?}
 + t6032: Add a test checking for excessive output from merge
 + merge-recursive: Restructure showing how to chain more process_* functions
 + t3030: Add a testcase for resolvable rename/add conflict with symlinks
 + Merge branch 'en/rename-d-f' into en/merge-recursive
 (this branch uses en/rename-d-f.)

* il/remote-fd-ext (2010-11-17) 4 commits
  (merged to 'next' on 2010-11-24 at ef80cf1)
 + remote-fd/ext: finishing touches after code review
  (merged to 'next' on 2010-11-05 at 7413413)
 + git-remote-ext
 + git-remote-fd
 + Add bidirectional_transfer_loop()

* ak/apply-non-git-epoch (2010-09-29) 2 commits
  (merged to 'next' on 2010-11-17 at a00579c)
 + apply: handle patches with funny filename and colon in timezone
 + apply: Recognize epoch timestamps with : in the timezone

* cb/leading-path-removal (2010-11-15) 6 commits
  (merged to 'next' on 2010-11-17 at ec7d709)
 + use persistent memory for rejected paths
  (merged to 'next' on 2010-11-05 at 55ea322)
 + do not overwrite files in leading path
 + lstat_cache: optionally return match_len
 + add function check_ok_to_remove()
 + t7607: add leading-path tests
 + t7607: use test-lib functions and check MERGE_HEAD

* jh/notes-merge (2010-11-09) 23 commits
  (merged to 'next' on 2010-11-24 at 6218115)
 + Provide 'git merge --abort' as a synonym to 'git reset --merge'
 + cmd_merge(): Parse options before checking MERGE_HEAD
 + Provide 'git notes get-ref' to easily retrieve current notes ref
 + git notes merge: Add testcases for merging notes trees at different fanouts
 + git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"
 + git notes merge: --commit should fail if underlying notes ref has moved
 + git notes merge: List conflicting notes in notes merge commit message
 + git notes merge: Manual conflict resolution, part 2/2
 + git notes merge: Manual conflict resolution, part 1/2
 + Documentation: Preliminary docs on 'git notes merge'
 + git notes merge: Add automatic conflict resolvers (ours, theirs, union)
 + git notes merge: Handle real, non-conflicting notes merges
 + builtin/notes.c: Refactor creation of notes commits.
 + git notes merge: Initial implementation handling trivial merges only
 + builtin/notes.c: Split notes ref DWIMmery into a separate function
 + notes.c: Use two newlines (instead of one) when concatenating notes
 + (trivial) t3303: Indent with tabs instead of spaces for consistency
 + notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond
 + notes.h/c: Allow combine_notes functions to remove notes
 + notes.c: Reorder functions in preparation for next commit
 + notes.h: Make default_notes_ref() available in notes API
 + (trivial) notes.h: Minor documentation fixes to copy_notes()
 + notes.c: Hexify SHA1 in die() message from init_notes()

* pn/commit-autosquash (2010-11-02) 6 commits
  (merged to 'next' on 2010-11-24 at acc9c78)
 + add tests of commit --squash
 + commit: --squash option for use with rebase --autosquash
 + add tests of commit --fixup
 + commit: --fixup option for use with rebase --autosquash
 + pretty.c: teach format_commit_message() to reencode the output
 + commit: helper methods to reduce redundant blocks of code

* jj/icase-directory (2010-10-03) 8 commits
  (merged to 'next' on 2010-11-24 at 0da9385)
 + Support case folding in git fast-import when core.ignorecase=true
 + Support case folding for git add when core.ignorecase=true
 + Add case insensitivity support when using git ls-files
 + Add case insensitivity support for directories when using git status
 + Case insensitivity support for .gitignore via core.ignorecase
 + Add string comparison functions that respect the ignore_case variable.
 + Makefile & configure: add a NO_FNMATCH_CASEFOLD flag
 + Makefile & configure: add a NO_FNMATCH flag

* nd/struct-pathspec (2010-09-20) 5 commits
 - ce_path_match: drop prefix matching in favor of match_pathspec
 - Convert ce_path_match() to use struct pathspec
 - tree_entry_interesting: turn to match_pathspec if wildcard is present
 - pathspec: add tree_recursive_diff parameter
 - pathspec: mark wildcard pathspecs from the beginning
 (this branch uses en/object-list-with-pathspec.)

This is related to something I have long been wanting to see happen.
Wait Nguyen for another round (2010-11-11).

* en/object-list-with-pathspec (2010-09-20) 8 commits
 - Add testcases showing how pathspecs are handled with rev-list --objects
 - Make rev-list --objects work together with pathspecs
 - Move tree_entry_interesting() to tree-walk.c and export it
 - tree_entry_interesting(): remove dependency on struct diff_options
 - Convert struct diff_options to use struct pathspec
 - pathspec: cache string length when initializing pathspec
 - diff-no-index: use diff_tree_setup_paths()
 - Add struct pathspec
 (this branch is used by nd/struct-pathspec.)

* tc/smart-http-post-redirect (2010-09-25) 1 commit
  (merged to 'next' on 2010-11-17 at 6478f7f)
 + smart-http: Don't change POST to GET when following redirect

* en/rename-d-f (2010-09-08) 2 commits
 + merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir
 + t3509: Add rename + D/F conflict testcase that recursive strategy fails
 (this branch is used by en/merge-recursive.)

* jl/fetch-submodule-recursive (2010-11-11) 3 commits
 - Submodules: Add the "fetchRecurseSubmodules" config option
 - Add the 'fetch.recurseSubmodules' config setting
 - fetch/pull: Add the --recurse-submodules option

* tr/merge-unborn-clobber (2010-08-22) 1 commit
 - Exhibit merge bug that clobbers index&WT

* ab/i18n (2010-10-07) 161 commits
 - po/de.po: complete German translation
 - po/sv.po: add Swedish translation
 - gettextize: git-bisect bisect_next_check "You need to" message
 - gettextize: git-bisect [Y/n] messages
 - gettextize: git-bisect bisect_replay + $1 messages
 - gettextize: git-bisect bisect_reset + $1 messages
 - gettextize: git-bisect bisect_run + $@ messages
 - gettextize: git-bisect die + eval_gettext messages
 - gettextize: git-bisect die + gettext messages
 - gettextize: git-bisect echo + eval_gettext message
 - gettextize: git-bisect echo + gettext messages
 - gettextize: git-bisect gettext + echo message
 - gettextize: git-bisect add git-sh-i18n
 - gettextize: git-stash drop_stash say/die messages
 - gettextize: git-stash "unknown option" message
 - gettextize: git-stash die + eval_gettext $1 messages
 - gettextize: git-stash die + eval_gettext $* messages
 - gettextize: git-stash die + eval_gettext messages
 - gettextize: git-stash die + gettext messages
 - gettextize: git-stash say + gettext messages
 - gettextize: git-stash echo + gettext message
 - gettextize: git-stash add git-sh-i18n
 - gettextize: git-submodule "blob" and "submodule" messages
 - gettextize: git-submodule "path not initialized" message
 - gettextize: git-submodule "[...] path is ignored" message
 - gettextize: git-submodule "Entering [...]" message
 - gettextize: git-submodule $errmsg messages
 - gettextize: git-submodule "Submodule change[...]" messages
 - gettextize: git-submodule "cached cannot be used" message
 - gettextize: git-submodule $update_module say + die messages
 - gettextize: git-submodule die + eval_gettext messages
 - gettextize: git-submodule say + eval_gettext messages
 - gettextize: git-submodule echo + eval_gettext messages
 - gettextize: git-submodule add git-sh-i18n
 - gettextize: git-pull "rebase against" / "merge with" messages
 - gettextize: git-pull "[...] not currently on a branch" message
 - gettextize: git-pull "You asked to pull" message
 - gettextize: git-pull split up "no candidate" message
 - gettextize: git-pull eval_gettext + warning message
 - gettextize: git-pull eval_gettext + die message
 - gettextize: git-pull die messages
 - gettextize: git-pull add git-sh-i18n
 - gettext docs: add "Testing marked strings" section to po/README
 - gettext docs: the Git::I18N Perl interface
 - gettext docs: the git-sh-i18n.sh Shell interface
 - gettext docs: the gettext.h C interface
 - gettext docs: add "Marking strings for translation" section in po/README
 - gettext docs: add a "Testing your changes" section to po/README
 - po/pl.po: add Polish translation
 - po/hi.po: add Hindi Translation
 - po/en_GB.po: add British English translation
 - po/de.po: add German translation
 - Makefile: only add gettext tests on XGETTEXT_INCLUDE_TESTS=YesPlease
 - gettext docs: add po/README file documenting Git's gettext
 - gettextize: git-am printf(1) message to eval_gettext
 - gettextize: git-am core say messages
 - gettextize: git-am "Apply?" message
 - gettextize: git-am clean_abort messages
 - gettextize: git-am cannot_fallback messages
 - gettextize: git-am die messages
 - gettextize: git-am eval_gettext messages
 - gettextize: git-am multi-line getttext $msg; echo
 - gettextize: git-am one-line gettext $msg; echo
 - gettextize: git-am add git-sh-i18n
 - gettext tests: add GETTEXT_POISON tests for shell scripts
 - gettext tests: add GETTEXT_POISON support for shell scripts
 - Makefile: MSGFMT="msgfmt --check" under GNU_GETTEXT
 - Makefile: add GNU_GETTEXT, set when we expect GNU gettext
 - gettextize: git-shortlog basic messages
 - gettextize: git-revert split up "could not revert/apply" message
 - gettextize: git-revert literal "me" messages
 - gettextize: git-revert "Your local changes" message
 - gettextize: git-revert basic messages
 - gettextize: git-notes "Refusing to %s notes in %s" message
 - gettextize: git-notes GIT_NOTES_REWRITE_MODE error message
 - gettextize: git-notes basic commands
 - gettextize: git-gc "Auto packing the repository" message
 - gettextize: git-gc basic messages
 - gettextize: git-describe basic messages
 - gettextize: git-clean clean.requireForce messages
 - gettextize: git-clean basic messages
 - gettextize: git-bundle basic messages
 - gettextize: git-archive basic messages
 - gettextize: git-status "renamed: " message
 - gettextize: git-status "Initial commit" message
 - gettextize: git-status "Changes to be committed" message
 - gettextize: git-status shortstatus messages
 - gettextize: git-status "nothing to commit" messages
 - gettextize: git-status basic messages
 - gettextize: git-push "prevent you from losing" message
 - gettextize: git-push basic messages
 - gettextize: git-tag tag_template message
 - gettextize: git-tag basic messages
 - gettextize: git-reset "Unstaged changes after reset" message
 - gettextize: git-reset reset_type_names messages
 - gettextize: git-reset basic messages
 - gettextize: git-rm basic messages
 - gettextize: git-mv "bad" messages
 - gettextize: git-mv basic messages
 - gettextize: git-merge "Wonderful" message
 - gettextize: git-merge "You have not concluded your merge" messages
 - gettextize: git-merge "Updating %s..%s" message
 - gettextize: git-merge basic messages
 - gettextize: git-log "--OPT does not make sense" messages
 - gettextize: git-log basic messages
 - gettextize: git-grep "--open-files-in-pager" message
 - gettextize: git-grep basic messages
 - gettextize: git-fetch split up "(non-fast-forward)" message
 - gettextize: git-fetch update_local_ref messages
 - gettextize: git-fetch formatting messages
 - gettextize: git-fetch basic messages
 - gettextize: git-diff basic messages
 - gettextize: git-commit advice messages
 - gettextize: git-commit "enter the commit message" message
 - gettextize: git-commit print_summary messages
 - gettextize: git-commit formatting messages
 - gettextize: git-commit "middle of a merge" message
 - gettextize: git-commit basic messages
 - gettextize: git-checkout "Switched to a .. branch" message
 - gettextize: git-checkout "HEAD is now at" message
 - gettextize: git-checkout describe_detached_head messages
 - gettextize: git-checkout: our/their version message
 - gettextize: git-checkout basic messages
 - gettextize: git-branch "(no branch)" message
 - gettextize: git-branch "git branch -v" messages
 - gettextize: git-branch "Deleted branch [...]" message
 - gettextize: git-branch "remote branch '%s' not found" message
 - gettextize: git-branch basic messages
 - gettextize: git-add refresh_index message
 - gettextize: git-add "remove '%s'" message
 - gettextize: git-add "pathspec [...] did not match" message
 - gettextize: git-add "Use -f if you really want" message
 - gettextize: git-add "no files added" message
 - gettextize: git-add basic messages
 - gettextize: git-clone "Cloning into" message
 - gettextize: git-clone basic messages
 - gettext tests: test message re-encoding under C
 - po/is.po: add Icelandic translation
 - gettext tests: mark a test message as not needing translation
 - gettext tests: test re-encoding with a UTF-8 msgid under Shell
 - gettext tests: test message re-encoding under Shell
 - gettext tests: add detection for is_IS.ISO-8859-1 locale
 - gettext tests: test if $VERSION exists before using it
 - gettextize: git-init "Initialized [...] repository" message
 - gettextize: git-init basic messages
 - gettext tests: skip lib-gettext.sh tests under GETTEXT_POISON
 - gettext tests: add GETTEXT_POISON=YesPlease Makefile parameter
 - gettext.c: use libcharset.h instead of langinfo.h when available
 - gettext.c: work around us not using setlocale(LC_CTYPE, "")
 - builtin.h: Include gettext.h
 - Makefile: use variables and shorter lines for xgettext
 - Makefile: tell xgettext(1) that our source is in UTF-8
 - Makefile: provide a --msgid-bugs-address to xgettext(1)
 - Makefile: A variable for options used by xgettext(1) calls
 - gettext tests: locate i18n lib&data correctly under --valgrind
 - gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions
 - gettext tests: rename test to work around GNU gettext bug
 - gettext: add infrastructure for translating Git with gettext
 - builtin: use builtin.h for all builtin commands
 - tests: use test_cmp instead of piping to diff(1)
 - t7004-tag.sh: re-arrange git tag comment for clarity

It is getting ridiculously painful to keep re-resolving the conflicts with
other topics in flight, even with the help with rerere.

Needs a bit more minor work to get the basic code structure right.

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Nov 2010, #02; Wed, 17)
@ 2010-11-18  0:56  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2010-11-18  0:56 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with '-' are
only in 'pu' while commits prefixed with '+' are in 'next'.  The ones
marked with '.' do not appear in any of the integration branches, but I am
still holding onto them.

--------------------------------------------------
[Graduated to "master"]

* ak/submodule-sync (2010-10-08) 1 commit
  (merged to 'next' on 2010-11-05 at 5a2f940)
 + submodule sync: Update "submodule.<name>.url" for empty directories

* bg/maint-gitweb-test-lib (2010-10-20) 1 commit
  (merged to 'next' on 2010-11-05 at 0ead869)
 + t/gitweb-lib: Don't pass constant to decode_utf8

* cb/diff-fname-optim (2010-09-26) 3 commits
  (merged to 'next' on 2010-11-05 at b3b09f3)
 + diff: avoid repeated scanning while looking for funcname
 + do not search functions for patch ID
 + add rebase patch id tests

* dk/maint-blame-el (2010-05-25) 1 commit
  (merged to 'next' on 2010-11-05 at 8456c66)
 + git-blame.el: Add (require 'format-spec)

* jk/maint-apply-no-binary (2010-10-18) 1 commit
  (merged to 'next' on 2010-11-05 at 8b7543a)
 + apply: don't segfault on binary files with missing data

* jk/maint-rev-list-nul (2010-10-07) 1 commit
  (merged to 'next' on 2010-11-05 at 406cba1)
 + rev-list: handle %x00 NUL in user format

* jk/missing-config (2010-10-21) 1 commit
  (merged to 'next' on 2010-11-05 at 31fda69)
 + config: treat non-existent config files as empty

* jk/no-textconv-symlink (2010-09-21) 1 commit
  (merged to 'next' on 2010-11-05 at 0a99e75)
 + diff: don't use pathname-based diff drivers for symlinks
 (this branch is used by ks/no-textconv-symlink.)

* jk/push-progress (2010-10-17) 8 commits
  (merged to 'next' on 2010-11-05 at 9207c6d)
 + push: pass --progress down to git-pack-objects
 + t5523-push-upstream: test progress messages
 + t5523-push-upstream: add function to ensure fresh upstream repo
 + test_terminal: ensure redirections work reliably
 + test_terminal: catch use without TTY prerequisite
 + test-lib: allow test code to check the list of declared prerequisites
 + tests: test terminal output to both stdout and stderr
 + tests: factor out terminal handling from t7006

* jl/maint-pull-tags-doc (2010-11-03) 1 commit
  (merged to 'next' on 2010-11-05 at 861d16a)
 + pull: Remove --tags option from manpage

* jm/mailmap (2010-10-19) 3 commits
  (merged to 'next' on 2010-11-05 at ef1e754)
 + t4203: do not let "git shortlog" DWIM based on tty
 + t4203 (mailmap): stop hardcoding commit ids and dates
 + mailmap: fix use of freed memory

* jn/gitweb-test (2010-09-26) 4 commits
  (merged to 'next' on 2010-11-05 at 90b3adf)
 + gitweb/Makefile: Include gitweb/config.mak
 + gitweb/Makefile: Add 'test' and 'test-installed' targets
 + t/gitweb-lib.sh: Add support for GITWEB_TEST_INSTALLED
 + gitweb: Move call to evaluate_git_version after evaluate_gitweb_config
 (this branch is used by jh/gitweb-caching.)

* jn/send-pack-error (2010-10-16) 1 commit
  (merged to 'next' on 2010-11-05 at ef559d4)
 + send-pack: avoid redundant "pack-objects died with strange error"

* kb/completion-checkout (2010-10-12) 1 commit
  (merged to 'next' on 2010-11-05 at 6836d70)
 + completion: Support the DWIM mode for git checkout

* kb/maint-diff-ws-check (2010-10-20) 2 commits
  (merged to 'next' on 2010-11-05 at 861b5ac)
 + diff: handle lines containing only whitespace and tabs better
 + test-lib: extend test_decode_color to handle more color codes

* kb/maint-submodule-savearg (2010-11-02) 2 commits
  (merged to 'next' on 2010-11-05 at 10e1aeb)
 + submodule: only preserve flags across recursive status/update invocations
 + submodule: preserve all arguments exactly when recursing

* ks/no-textconv-symlink (2010-09-29) 3 commits
  (merged to 'next' on 2010-11-05 at 32f0580)
 + blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
 + blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks
 + blame,cat-file: Prepare --textconv tests for correctly-failing conversion program
 (this branch uses jk/no-textconv-symlink.)

* mg/make-prove (2010-10-14) 1 commit
  (merged to 'next' on 2010-11-05 at ec4f806)
 + test: allow running the tests under "prove"

* sg/bisect (2010-10-10) 3 commits
  (merged to 'next' on 2010-11-05 at 4a8b88d)
 + bisect: check for mandatory argument of 'bisect replay'
 + bisect: improve error msg of 'bisect reset' when original HEAD is deleted
 + bisect: improve error message of 'bisect log' while not bisecting

* sg/completion (2010-10-11) 4 commits
  (merged to 'next' on 2010-11-05 at 4967932)
 + bash: support pretty format aliases
 + bash: support more 'git notes' subcommands and their options
 + bash: not all 'git bisect' subcommands make sense when not bisecting
 + bash: offer refs for 'git bisect start'

* tr/maint-git-repack-tmpfile (2010-10-19) 1 commit
  (merged to 'next' on 2010-11-05 at 80ad03a)
 + repack: place temporary packs under .git/objects/pack/

* tr/maint-merge-file-subdir (2010-10-17) 2 commits
  (merged to 'next' on 2010-11-05 at a2873a4)
 + merge-file: correctly find files when called in subdir
 + prefix_filename(): safely handle the case where pfx_len=0

--------------------------------------------------
[New Topics]

* cb/maint-orphan-merge-noclobber (2010-11-14) 1 commit
  (merged to 'next' on 2010-11-15 at 046c5e5)
 + do not overwrite untracked during merge from unborn branch

Will merge to master soonish.

* gb/gitweb-remote-heads (2010-11-11) 11 commits
 - git instaweb: enable remote_heads
 - gitweb: group remote heads by remote
 - gitweb: provide a routine to display (sub)sections
 - gitweb: refactor repository URL printing
 - gitweb: remotes view for a single remote
 - gitweb: allow action specialization in page header
 - gitweb: nagivation menu for tags, heads and remotes
 - gitweb: separate heads and remotes lists
 - gitweb: git_get_heads_list accepts an optional list of refs
 - gitweb: introduce remote_heads feature
 - gitweb: use fullname as hash_base in heads link

Acked by Jakub.  Will merge to next.

* gc/http-with-non-ascii-username-url (2010-11-14) 2 commits
 - Fix username and password extraction from HTTP URLs
 - t5550: test HTTP authentication and userinfo decoding

Acked by Tay.  Will merge to next.

* jk/maint-decorate-01-bool (2010-11-17) 1 commit
 - log.decorate: accept 0/1 bool values
 (this branch is used by jk/pager-per-command.)

Looked reasonable.  Will merge to next.

* jk/pager-per-command (2010-11-17) 1 commit
 - allow command-specific pagers in pager.<cmd>
 (this branch uses jk/maint-decorate-01-bool.)

Looked reasonable.  Will merge to next.

* jn/getenv-poison (2010-11-12) 1 commit
 . add GETENV_POISON option to simulate unfriendly getenv()
 (this branch uses ks/maint-getenv-fix.)

* jn/gitweb-time-hires-comes-with-5.8 (2010-11-09) 1 commit
 - gitweb: Time::HiRes is in core for Perl 5.8

Looked reasonable.  Will merge to next.

* jn/ignore-doc (2010-11-10) 2 commits
 - Documentation: point to related commands from gitignore
 - Documentation: split gitignore page into sections

Looked reasonable.  Will merge to next.

* jn/thinner-wrapper (2010-11-06) 7 commits
 - Remove pack file handling dependency from wrapper.o
 - pack-objects: mark file-local variable static
 - wrapper: give zlib wrappers their own translation unit
 - strbuf: move strbuf_branchname to sha1_name.c
 - path helpers: move git_mkstemp* to wrapper.c
 - wrapper: move odb_* to environment.c
 - wrapper: move xmmap() to sha1_file.c

Looked reasonable.  Will merge to next.

* ks/maint-getenv-fix (2010-11-11) 1 commit
 - setup: make sure git_dir path is in a permanent buffer, getenv(3) case
 (this branch is used by jn/getenv-poison.)

Looked reasonable.  Will merge to next.

* nd/extended-sha1-relpath (2010-11-11) 2 commits
 - get_sha1: support relative path ":path" syntax
 - Make prefix_path() return char* without const
 (this branch uses jn/parse-options-extra.)

Perhaps needs a documentation update.

* nd/maint-fix-add-typo-detection (2010-11-11) 1 commit
 - add: do not rely on dtype being NULL behavior

Looked reasonable.  Will merge to next.

* rs/opt-help-text (2010-11-08) 8 commits
  (merged to 'next' on 2010-11-15 at 631c222)
 + verify-tag: document --verbose
 + branch: improve --verbose description
 + archive: improve --verbose description
 + Describe various forms of "be quiet" using OPT__QUIET
 + add OPT__FORCE
 + add description parameter to OPT__QUIET
 + add description parameter to OPT__DRY_RUN
 + add description parameter to OPT__VERBOSE

Will merge to master soonish.

--------------------------------------------------
[Stalled]

* nd/index-doc (2010-09-06) 1 commit
 - doc: technical details about the index file format

Half-written but it is a good start.  I may need to give some help in
describing more recent index extensions.

* cb/ignored-paths-are-precious (2010-08-21) 1 commit
 - checkout/merge: optionally fail operation when ignored files need to be overwritten

This needs tests; also we know of longstanding bugs in related area that
needs to be addressed---they do not have to be part of this series but
their reproduction recipe would belong to the test script for this topic.

It would hurt users to make the new feature on by default, especially the
ones with subdirectories that come and go.

* jk/tag-contains (2010-07-05) 4 commits
 - Why is "git tag --contains" so slow?
 - default core.clockskew variable to one day
 - limit "contains" traversals based on commit timestamp
 - tag: speed up --contains calculation

The idea of the bottom one is probably Ok, except that the use of object
flags needs to be rethought, or at least the helper needs to be moved to
builtin/tag.c to make it clear that it should not be used outside the
current usage context.

* jh/gitweb-caching (2010-11-01) 4 commits
 . gitweb: Minimal testing of gitweb caching
 . gitweb: File based caching layer (from git.kernel.org)
 . gitweb: add output buffering and associated functions
 . gitweb: Prepare for splitting gitweb

Temporarily ejected while I shuffled jn/gitweb-testing; will queue the
latest back in pu or perhaps in next.

* tr/config-doc (2010-10-24) 2 commits
 . Documentation: complete config list from other manpages
 . Documentation: Move variables from config.txt to separate file

This unfortunately heavily conflicts with patches in flight...

--------------------------------------------------
[Cooking]

* ef/mingw-daemon (2010-11-04) 16 commits
  (merged to 'next' on 2010-11-17 at 4a295c7)
 + daemon: opt-out on features that require posix
 + daemon: make --inetd and --detach incompatible
 + daemon: use socklen_t
 + mingw: use poll-emulation from gnulib
 + mingw: import poll-emulation from gnulib
 + daemon: get remote host address from root-process
 + Improve the mingw getaddrinfo stub to handle more use cases
 + daemon: use full buffered mode for stderr
 + daemon: use run-command api for async serving
 + mingw: add kill emulation
 + mingw: support waitpid with pid > 0 and WNOHANG
 + mingw: use real pid
 + inet_ntop: fix a couple of old-style decls
 + compat: add inet_pton and inet_ntop prototypes
 + mingw: implement syslog
 + mingw: add network-wrappers for daemon

* jc/abbrev-guard (2010-10-28) 1 commit
 - core.abbrevguard: Ensure short object names stay unique a bit longer

Will merge to next.

* jc/emfile (2010-10-28) 2 commits
  (merged to 'next' on 2010-11-17 at dac1bc6)
 + A loose object is not corrupt if it cannot be read due to EMFILE
 + read_sha1_file(): report correct name of packfile with a corrupt object
 (this branch is used by sp/emfile.)

* sp/emfile (2010-11-01) 2 commits
 - Work around EMFILE when there are too many pack files
 - Use git_open_noatime when accessing pack data
 (this branch uses jc/emfile.)

Will merge to 'next', but might want to restructure the API a bit.

* jl/add-p-reverse-message (2010-10-27) 1 commit
  (merged to 'next' on 2010-11-17 at db2ce14)
 + Correct help blurb in checkout -p and friends

* jl/clone-recurse-sm-synonym (2010-11-04) 1 commit
  (merged to 'next' on 2010-11-17 at 8c326c2)
 + clone: Add the --recurse-submodules option as alias for --recursive

* jn/cherry-pick-refresh-index (2010-10-31) 1 commit
  (merged to 'next' on 2010-11-17 at 75e9103)
 + cherry-pick/revert: transparently refresh index

* jn/parse-options-extra (2010-10-24) 4 commits
 - update-index: migrate to parse-options API
 - setup: save prefix (original cwd relative to toplevel) in startup_info
 - parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTION
 - parse-options: allow git commands to invent new option types
 (this branch is used by nd/extended-sha1-relpath.)

Wait for a reroll from Jonathan (2010-11-09).

* md/interix (2010-10-27) 2 commits
  (merged to 'next' on 2010-11-17 at 2a8b562)
 + Interix: add configure checks
 + add support for the SUA layer (interix; windows)

* mm/phrase-remote-tracking (2010-11-02) 10 commits
  (merged to 'next' on 2010-11-15 at 07d67f4)
 + git-branch.txt: mention --set-upstream as a way to change upstream configuration
 + user-manual: remote-tracking can be checked out, with detached HEAD
 + user-manual.txt: explain better the remote(-tracking) branch terms
 + Change incorrect "remote branch" to "remote tracking branch" in C code
 + Change incorrect uses of "remote branch" meaning "remote-tracking"
 + Change "tracking branch" to "remote-tracking branch"
 + everyday.txt: change "tracking branch" to "remote-tracking branch"
 + Change remote tracking to remote-tracking in non-trivial places
 + Replace "remote tracking" with "remote-tracking"
 + Better "Changed but not updated" message in git-status

Will merge to master soonish.

* nd/setup (2010-11-11) 47 commits
 - git.txt: correct where --work-tree path is relative to
 - Revert "Documentation: always respect core.worktree if set"
 - t0001: test git init when run via an alias
 - Remove all logic from get_git_work_tree()
 - setup: rework setup_explicit_git_dir()
 - setup: clean up setup_discovered_git_dir()
 - t1020-subdirectory: test alias expansion in a subdirectory
 - setup: clean up setup_bare_git_dir()
 - setup: limit get_git_work_tree()'s to explicit setup case only
 - Use git_config_early() instead of git_config() during repo setup
 - Add git_config_early()
 - rev-parse: prints --git-dir relative to user's cwd
 - git-rev-parse.txt: clarify --git-dir
 - t1510: setup case #31
 - t1510: setup case #30
 - t1510: setup case #29
 - t1510: setup case #28
 - t1510: setup case #27
 - t1510: setup case #26
 - t1510: setup case #25
 - t1510: setup case #24
 - t1510: setup case #23
 - t1510: setup case #22
 - t1510: setup case #21
 - t1510: setup case #20
 - t1510: setup case #19
 - t1510: setup case #18
 - t1510: setup case #17
 - t1510: setup case #16
 - t1510: setup case #15
 - t1510: setup case #14
 - t1510: setup case #13
 - t1510: setup case #12
 - t1510: setup case #11
 - t1510: setup case #10
 - t1510: setup case #9
 - t1510: setup case #8
 - t1510: setup case #7
 - t1510: setup case #6
 - t1510: setup case #5
 - t1510: setup case #4
 - t1510: setup case #3
 - t1510: setup case #2
 - t1510: setup case #1
 - t1510: setup case #0
 - Add t1510 and basic rules that run repo setup
 - builtins: print setup info if repo is found

I have to queue a handful of fixups still in flight.

* rr/needs-clean-work-tree (2010-10-19) 1 commit
  (merged to 'next' on 2010-11-17 at b8aee21)
 + Porcelain scripts: Rewrite cryptic "needs update" error message

Will merge to master soonish.

* sn/diff-doc (2010-11-04) 3 commits
 - docs: clarify git diff modes of operation
 - diff,difftool: Don't use the {0,2} notation in usage strings
 - CodingGuidelines: Add a section on writing documentation

Will merge to next.

* kb/maint-rebase-autosquash (2010-11-04) 2 commits
  (merged to 'next' on 2010-11-15 at 9b8c830)
 + rebase: teach --autosquash to match on sha1 in addition to message
 + rebase: better rearranging of fixup!/squash! lines with --autosquash

Will merge to master soonish.

* kb/maint-status-cquote (2010-11-08) 1 commit
 - status: Quote paths with spaces in short format

Will merge to next.

* mg/maint-tag-rfc1991 (2010-11-10) 5 commits
 - tag: recognize rfc1991 signatures
 - tag: factor out sig detection for tag display
 - tag: factor out sig detection for body edits
 - verify-tag: factor out signature detection
 - t/t7004-tag: test handling of rfc1991 signatures

Will merge to next.

* ao/send-email-irt (2010-11-12) 2 commits
  (merged to 'next' on 2010-11-15 at 257c77a)
 + git-send-email.perl: make initial In-Reply-To apply only to first email
  (merged to 'next' on 2010-11-08 at d103166)
 + t9001: send-email interation with --in-reply-to and --chain-reply-to

Will merge to master soonish.

* cm/diff-check-at-eol (2010-10-10) 1 commit
  (merged to 'next' on 2010-11-17 at ad7005a)
 + diff --check: correct line numbers of new blank lines at EOF

* fc/apply-p2-get-header-name (2010-10-21) 2 commits
  (merged to 'next' on 2010-11-17 at 05a8e94)
 + test: git-apply -p2 rename/chmod only
 + Fix git-apply with -p greater than 1

* jk/add-e-doc (2010-11-08) 2 commits
  (merged to 'next' on 2010-11-15 at e971401)
 + docs: give more hints about how "add -e" works
  (merged to 'next' on 2010-11-05 at 389fee7)
 + docs: give more hints about how "add -e" works

Will merge to master soonish.

* jk/diff-CBM (2010-10-21) 1 commit
  (merged to 'next' on 2010-11-05 at 9d1ec14)
 + diff: report bogus input to -C/-M/-B

Will merge to master soonish.

* jn/fast-import-fix (2010-10-20) 4 commits
  (merged to 'next' on 2010-11-17 at ef3b791)
 + fast-import: do not clear notes in do_change_note_fanout()
 + t9300 (fast-import): another test for the "replace root" feature
 + fast-import: tighten M 040000 syntax
 + fast-import: filemodify after M 040000 <tree> "" crashes

* jn/git-cmd-h-bypass-setup (2010-10-22) 7 commits
 - update-index -h: show usage even with corrupt index
 - merge -h: show usage even with corrupt index
 - ls-files -h: show usage even with corrupt index
 - gc -h: show usage even with broken configuration
 - commit/status -h: show usage even with broken configuration
 - checkout-index -h: show usage even in an invalid repository
 - branch -h: show usage even in an invalid repository
 (this branch uses en/and-cascade-tests.)

Will merge to next.

* kb/blame-author-email (2010-10-15) 1 commit
  (merged to 'next' on 2010-11-17 at 6fd6a2f)
 + blame: Add option to show author email instead of name

* np/diff-in-corrupt-repository (2010-10-22) 1 commit
  (merged to 'next' on 2010-11-17 at b57a6cb)
 + diff: don't presume empty file when corresponding object is missing

* np/pack-broken-boundary (2010-10-22) 1 commit
  (merged to 'next' on 2010-11-17 at 69a9f46)
 + make pack-objects a bit more resilient to repo corruption

* yd/dir-rename (2010-10-29) 5 commits
 - Allow hiding renames of individual files involved in a directory rename.
 - Unified diff output format for bulk moves.
 - Add testcases for the --detect-bulk-moves diffcore flag.
 - Raw diff output format for bulk moves.
 - Introduce bulk-move detection in diffcore.

Yet to be rerolled.

* en/merge-recursive (2010-11-08) 40 commits
  (merged to 'next' on 2010-11-17 at 1b6f865)
 + t6022: Use -eq not = to test output of wc -l
  (merged to 'next' on 2010-11-05 at 16902eb)
 + merge-recursive:make_room_for_directories - work around dumb compilers
 + merge-recursive: Remove redundant path clearing for D/F conflicts
 + merge-recursive: Make room for directories in D/F conflicts
 + handle_delete_modify(): Check whether D/F conflicts are still present
 + merge_content(): Check whether D/F conflicts are still present
 + conflict_rename_rename_1to2(): Fix checks for presence of D/F conflicts
 + conflict_rename_delete(): Check whether D/F conflicts are still present
 + merge-recursive: Delay modify/delete conflicts if D/F conflict present
 + merge-recursive: Delay content merging for renames
 + merge-recursive: Delay handling of rename/delete conflicts
 + merge-recursive: Move handling of double rename of one file to other file
 + merge-recursive: Move handling of double rename of one file to two
 + merge-recursive: Avoid doubly merging rename/add conflict contents
 + merge-recursive: Update merge_content() call signature
 + merge-recursive: Update conflict_rename_rename_1to2() call signature
 + merge-recursive: Structure process_df_entry() to handle more cases
 + merge-recursive: Have process_entry() skip D/F or rename entries
 + merge-recursive: New function to assist resolving renames in-core only
 + merge-recursive: New data structures for deferring of D/F conflicts
 + merge-recursive: Move process_entry's content merging into a function
 + merge-recursive: Move delete/modify handling into dedicated function
 + merge-recursive: Move rename/delete handling into dedicated function
 + merge-recursive: Nuke rename/directory conflict detection
 + merge-recursive: Rename conflict_rename_rename*() for clarity
 + merge-recursive: Small code clarification -- variable name and comments
 + t6036: Add testcase for undetected conflict
 + t6036: Add a second testcase similar to the first but with content changes
 + t6036: Test index and worktree state, not just that merge fails
 + t6020: Add a testcase for modify/delete + directory/file conflict
 + t6020: Modernize style a bit
 + t6022: Add tests for rename/rename combined with D/F conflicts
 + t6022: Add paired rename+D/F conflict: (two/file, one/file) -> (one, two)
 + t6022: Add tests with both rename source & dest involved in D/F conflicts
 + t6022: Add tests for reversing order of merges when D/F conflicts present
 + t6022: Add test combinations of {content conflict?, D/F conflict remains?}
 + t6032: Add a test checking for excessive output from merge
 + merge-recursive: Restructure showing how to chain more process_* functions
 + t3030: Add a testcase for resolvable rename/add conflict with symlinks
 + Merge branch 'en/rename-d-f' into en/merge-recursive
 (this branch uses en/rename-d-f.)

* il/remote-fd-ext (2010-10-12) 3 commits
  (merged to 'next' on 2010-11-05 at 7413413)
 + git-remote-ext
 + git-remote-fd
 + Add bidirectional_transfer_loop()

* ak/apply-non-git-epoch (2010-09-29) 2 commits
  (merged to 'next' on 2010-11-17 at a00579c)
 + apply: handle patches with funny filename and colon in timezone
 + apply: Recognize epoch timestamps with : in the timezone

* cb/leading-path-removal (2010-11-15) 6 commits
  (merged to 'next' on 2010-11-17 at ec7d709)
 + use persistent memory for rejected paths
  (merged to 'next' on 2010-11-05 at 55ea322)
 + do not overwrite files in leading path
 + lstat_cache: optionally return match_len
 + add function check_ok_to_remove()
 + t7607: add leading-path tests
 + t7607: use test-lib functions and check MERGE_HEAD

* jh/notes-merge (2010-11-09) 23 commits
 - Provide 'git merge --abort' as a synonym to 'git reset --merge'
 - cmd_merge(): Parse options before checking MERGE_HEAD
 - Provide 'git notes get-ref' to easily retrieve current notes ref
 - git notes merge: Add testcases for merging notes trees at different fanouts
 - git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"
 - git notes merge: --commit should fail if underlying notes ref has moved
 - git notes merge: List conflicting notes in notes merge commit message
 - git notes merge: Manual conflict resolution, part 2/2
 - git notes merge: Manual conflict resolution, part 1/2
 - Documentation: Preliminary docs on 'git notes merge'
 - git notes merge: Add automatic conflict resolvers (ours, theirs, union)
 - git notes merge: Handle real, non-conflicting notes merges
 - builtin/notes.c: Refactor creation of notes commits.
 - git notes merge: Initial implementation handling trivial merges only
 - builtin/notes.c: Split notes ref DWIMmery into a separate function
 - notes.c: Use two newlines (instead of one) when concatenating notes
 - (trivial) t3303: Indent with tabs instead of spaces for consistency
 - notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond
 - notes.h/c: Allow combine_notes functions to remove notes
 - notes.c: Reorder functions in preparation for next commit
 - notes.h: Make default_notes_ref() available in notes API
 - (trivial) notes.h: Minor documentation fixes to copy_notes()
 - notes.c: Hexify SHA1 in die() message from init_notes()

Rerolled; will merge to next.

* pn/commit-autosquash (2010-11-02) 6 commits
 - add tests of commit --squash
 - commit: --squash option for use with rebase --autosquash
 - add tests of commit --fixup
 - commit: --fixup option for use with rebase --autosquash
 - pretty.c: teach format_commit_message() to reencode the output
 - commit: helper methods to reduce redundant blocks of code

Will merge to next.

* jj/icase-directory (2010-10-03) 8 commits
 - Support case folding in git fast-import when core.ignorecase=true
 - Support case folding for git add when core.ignorecase=true
 - Add case insensitivity support when using git ls-files
 - Add case insensitivity support for directories when using git status
 - Case insensitivity support for .gitignore via core.ignorecase
 - Add string comparison functions that respect the ignore_case variable.
 - Makefile & configure: add a NO_FNMATCH_CASEFOLD flag
 - Makefile & configure: add a NO_FNMATCH flag

Will merge to next.

* en/and-cascade-tests (2010-10-31) 25 commits
  (merged to 'next' on 2010-11-15 at d51ec77)
 + t4124 (apply --whitespace): use test_might_fail
 + t3404: do not use 'describe' to implement test_cmp_rev
 + t3404 (rebase -i): introduce helper to check position of HEAD
 + t3404 (rebase -i): move comment to description
 + t3404 (rebase -i): unroll test_commit loops
 + t3301 (notes): use test_expect_code for clarity
 + t1400 (update-ref): use test_must_fail
 + t1502 (rev-parse --parseopt): test exit code from "-h"
 + t6022 (renaming merge): chain test commands with &&
 + test-lib: introduce test_line_count to measure files
 + tests: add missing &&, batch 2
 + tests: add missing &&
 + Introduce sane_unset and use it to ensure proper && chaining
 + t7800 (difftool): add missing &&
 + t7601 (merge-pull-config): add missing &&
 + t7001 (mv): add missing &&
 + t6016 (rev-list-graph-simplify-history): add missing &&
 + t5602 (clone-remote-exec): add missing &&
 + t4026 (color): remove unneeded and unchained command
 + t4019 (diff-wserror): add lots of missing &&
 + t4202 (log): Replace '<git-command> || :' with test_might_fail
 + t4002 (diff-basic): use test_might_fail for commands that might fail
 + t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
 + t4017 (diff-retval): replace manual exit code check with test_expect_code
 + test-lib: make test_expect_code a test command
 (this branch is used by jn/git-cmd-h-bypass-setup.)

* nd/struct-pathspec (2010-09-20) 5 commits
 - ce_path_match: drop prefix matching in favor of match_pathspec
 - Convert ce_path_match() to use struct pathspec
 - tree_entry_interesting: turn to match_pathspec if wildcard is present
 - pathspec: add tree_recursive_diff parameter
 - pathspec: mark wildcard pathspecs from the beginning
 (this branch uses en/object-list-with-pathspec.)

This is related to something I have long been wanting to see happen.
Wait Nguyen for another round (2010-11-11).

* en/object-list-with-pathspec (2010-09-20) 8 commits
 - Add testcases showing how pathspecs are handled with rev-list --objects
 - Make rev-list --objects work together with pathspecs
 - Move tree_entry_interesting() to tree-walk.c and export it
 - tree_entry_interesting(): remove dependency on struct diff_options
 - Convert struct diff_options to use struct pathspec
 - pathspec: cache string length when initializing pathspec
 - diff-no-index: use diff_tree_setup_paths()
 - Add struct pathspec
 (this branch is used by nd/struct-pathspec.)

* tc/smart-http-post-redirect (2010-09-25) 1 commit
  (merged to 'next' on 2010-11-17 at 6478f7f)
 + smart-http: Don't change POST to GET when following redirect

* en/rename-d-f (2010-09-08) 2 commits
 + merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir
 + t3509: Add rename + D/F conflict testcase that recursive strategy fails
 (this branch is used by en/merge-recursive.)

* jl/fetch-submodule-recursive (2010-11-11) 3 commits
 - Submodules: Add the "fetchRecurseSubmodules" config option
 - Add the 'fetch.recurseSubmodules' config setting
 - fetch/pull: Add the --recurse-submodules option

* tr/merge-unborn-clobber (2010-08-22) 1 commit
 - Exhibit merge bug that clobbers index&WT

* ab/i18n (2010-10-07) 161 commits
 - po/de.po: complete German translation
 - po/sv.po: add Swedish translation
 - gettextize: git-bisect bisect_next_check "You need to" message
 - gettextize: git-bisect [Y/n] messages
 - gettextize: git-bisect bisect_replay + $1 messages
 - gettextize: git-bisect bisect_reset + $1 messages
 - gettextize: git-bisect bisect_run + $@ messages
 - gettextize: git-bisect die + eval_gettext messages
 - gettextize: git-bisect die + gettext messages
 - gettextize: git-bisect echo + eval_gettext message
 - gettextize: git-bisect echo + gettext messages
 - gettextize: git-bisect gettext + echo message
 - gettextize: git-bisect add git-sh-i18n
 - gettextize: git-stash drop_stash say/die messages
 - gettextize: git-stash "unknown option" message
 - gettextize: git-stash die + eval_gettext $1 messages
 - gettextize: git-stash die + eval_gettext $* messages
 - gettextize: git-stash die + eval_gettext messages
 - gettextize: git-stash die + gettext messages
 - gettextize: git-stash say + gettext messages
 - gettextize: git-stash echo + gettext message
 - gettextize: git-stash add git-sh-i18n
 - gettextize: git-submodule "blob" and "submodule" messages
 - gettextize: git-submodule "path not initialized" message
 - gettextize: git-submodule "[...] path is ignored" message
 - gettextize: git-submodule "Entering [...]" message
 - gettextize: git-submodule $errmsg messages
 - gettextize: git-submodule "Submodule change[...]" messages
 - gettextize: git-submodule "cached cannot be used" message
 - gettextize: git-submodule $update_module say + die messages
 - gettextize: git-submodule die + eval_gettext messages
 - gettextize: git-submodule say + eval_gettext messages
 - gettextize: git-submodule echo + eval_gettext messages
 - gettextize: git-submodule add git-sh-i18n
 - gettextize: git-pull "rebase against" / "merge with" messages
 - gettextize: git-pull "[...] not currently on a branch" message
 - gettextize: git-pull "You asked to pull" message
 - gettextize: git-pull split up "no candidate" message
 - gettextize: git-pull eval_gettext + warning message
 - gettextize: git-pull eval_gettext + die message
 - gettextize: git-pull die messages
 - gettextize: git-pull add git-sh-i18n
 - gettext docs: add "Testing marked strings" section to po/README
 - gettext docs: the Git::I18N Perl interface
 - gettext docs: the git-sh-i18n.sh Shell interface
 - gettext docs: the gettext.h C interface
 - gettext docs: add "Marking strings for translation" section in po/README
 - gettext docs: add a "Testing your changes" section to po/README
 - po/pl.po: add Polish translation
 - po/hi.po: add Hindi Translation
 - po/en_GB.po: add British English translation
 - po/de.po: add German translation
 - Makefile: only add gettext tests on XGETTEXT_INCLUDE_TESTS=YesPlease
 - gettext docs: add po/README file documenting Git's gettext
 - gettextize: git-am printf(1) message to eval_gettext
 - gettextize: git-am core say messages
 - gettextize: git-am "Apply?" message
 - gettextize: git-am clean_abort messages
 - gettextize: git-am cannot_fallback messages
 - gettextize: git-am die messages
 - gettextize: git-am eval_gettext messages
 - gettextize: git-am multi-line getttext $msg; echo
 - gettextize: git-am one-line gettext $msg; echo
 - gettextize: git-am add git-sh-i18n
 - gettext tests: add GETTEXT_POISON tests for shell scripts
 - gettext tests: add GETTEXT_POISON support for shell scripts
 - Makefile: MSGFMT="msgfmt --check" under GNU_GETTEXT
 - Makefile: add GNU_GETTEXT, set when we expect GNU gettext
 - gettextize: git-shortlog basic messages
 - gettextize: git-revert split up "could not revert/apply" message
 - gettextize: git-revert literal "me" messages
 - gettextize: git-revert "Your local changes" message
 - gettextize: git-revert basic messages
 - gettextize: git-notes "Refusing to %s notes in %s" message
 - gettextize: git-notes GIT_NOTES_REWRITE_MODE error message
 - gettextize: git-notes basic commands
 - gettextize: git-gc "Auto packing the repository" message
 - gettextize: git-gc basic messages
 - gettextize: git-describe basic messages
 - gettextize: git-clean clean.requireForce messages
 - gettextize: git-clean basic messages
 - gettextize: git-bundle basic messages
 - gettextize: git-archive basic messages
 - gettextize: git-status "renamed: " message
 - gettextize: git-status "Initial commit" message
 - gettextize: git-status "Changes to be committed" message
 - gettextize: git-status shortstatus messages
 - gettextize: git-status "nothing to commit" messages
 - gettextize: git-status basic messages
 - gettextize: git-push "prevent you from losing" message
 - gettextize: git-push basic messages
 - gettextize: git-tag tag_template message
 - gettextize: git-tag basic messages
 - gettextize: git-reset "Unstaged changes after reset" message
 - gettextize: git-reset reset_type_names messages
 - gettextize: git-reset basic messages
 - gettextize: git-rm basic messages
 - gettextize: git-mv "bad" messages
 - gettextize: git-mv basic messages
 - gettextize: git-merge "Wonderful" message
 - gettextize: git-merge "You have not concluded your merge" messages
 - gettextize: git-merge "Updating %s..%s" message
 - gettextize: git-merge basic messages
 - gettextize: git-log "--OPT does not make sense" messages
 - gettextize: git-log basic messages
 - gettextize: git-grep "--open-files-in-pager" message
 - gettextize: git-grep basic messages
 - gettextize: git-fetch split up "(non-fast-forward)" message
 - gettextize: git-fetch update_local_ref messages
 - gettextize: git-fetch formatting messages
 - gettextize: git-fetch basic messages
 - gettextize: git-diff basic messages
 - gettextize: git-commit advice messages
 - gettextize: git-commit "enter the commit message" message
 - gettextize: git-commit print_summary messages
 - gettextize: git-commit formatting messages
 - gettextize: git-commit "middle of a merge" message
 - gettextize: git-commit basic messages
 - gettextize: git-checkout "Switched to a .. branch" message
 - gettextize: git-checkout "HEAD is now at" message
 - gettextize: git-checkout describe_detached_head messages
 - gettextize: git-checkout: our/their version message
 - gettextize: git-checkout basic messages
 - gettextize: git-branch "(no branch)" message
 - gettextize: git-branch "git branch -v" messages
 - gettextize: git-branch "Deleted branch [...]" message
 - gettextize: git-branch "remote branch '%s' not found" message
 - gettextize: git-branch basic messages
 - gettextize: git-add refresh_index message
 - gettextize: git-add "remove '%s'" message
 - gettextize: git-add "pathspec [...] did not match" message
 - gettextize: git-add "Use -f if you really want" message
 - gettextize: git-add "no files added" message
 - gettextize: git-add basic messages
 - gettextize: git-clone "Cloning into" message
 - gettextize: git-clone basic messages
 - gettext tests: test message re-encoding under C
 - po/is.po: add Icelandic translation
 - gettext tests: mark a test message as not needing translation
 - gettext tests: test re-encoding with a UTF-8 msgid under Shell
 - gettext tests: test message re-encoding under Shell
 - gettext tests: add detection for is_IS.ISO-8859-1 locale
 - gettext tests: test if $VERSION exists before using it
 - gettextize: git-init "Initialized [...] repository" message
 - gettextize: git-init basic messages
 - gettext tests: skip lib-gettext.sh tests under GETTEXT_POISON
 - gettext tests: add GETTEXT_POISON=YesPlease Makefile parameter
 - gettext.c: use libcharset.h instead of langinfo.h when available
 - gettext.c: work around us not using setlocale(LC_CTYPE, "")
 - builtin.h: Include gettext.h
 - Makefile: use variables and shorter lines for xgettext
 - Makefile: tell xgettext(1) that our source is in UTF-8
 - Makefile: provide a --msgid-bugs-address to xgettext(1)
 - Makefile: A variable for options used by xgettext(1) calls
 - gettext tests: locate i18n lib&data correctly under --valgrind
 - gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions
 - gettext tests: rename test to work around GNU gettext bug
 - gettext: add infrastructure for translating Git with gettext
 - builtin: use builtin.h for all builtin commands
 - tests: use test_cmp instead of piping to diff(1)
 - t7004-tag.sh: re-arrange git tag comment for clarity

It is getting ridiculously painful to keep re-resolving the conflicts with
other topics in flight, even with the help with rerere.

Needs a bit more minor work to get the basic code structure right.

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Nov 2010, #01; Tue, 9)
@ 2010-11-09 19:53  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2010-11-09 19:53 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with '-' are
only in 'pu' while commits prefixed with '+' are in 'next'.  The ones
marked with '.' do not appear in any of the integration branches, but I am
still holding onto them.

--------------------------------------------------
[New Topics]

* dk/maint-blame-el (2010-05-25) 1 commit
  (merged to 'next' on 2010-11-05 at 8456c66)
 + git-blame.el: Add (require 'format-spec)

* ef/mingw-daemon (2010-11-04) 16 commits
 - daemon: opt-out on features that require posix
 - daemon: make --inetd and --detach incompatible
 - daemon: use socklen_t
 - mingw: use poll-emulation from gnulib
 - mingw: import poll-emulation from gnulib
 - daemon: get remote host address from root-process
 - Improve the mingw getaddrinfo stub to handle more use cases
 - daemon: use full buffered mode for stderr
 - daemon: use run-command api for async serving
 - mingw: add kill emulation
 - mingw: support waitpid with pid > 0 and WNOHANG
 - mingw: use real pid
 - inet_ntop: fix a couple of old-style decls
 - compat: add inet_pton and inet_ntop prototypes
 - mingw: implement syslog
 - mingw: add network-wrappers for daemon

Will merge to 'next'.

* jc/abbrev-guard (2010-10-28) 1 commit
 - core.abbrevguard: Ensure short object names stay unique a bit longer

* jc/emfile (2010-10-28) 2 commits
 - A loose object is not corrupt if it cannot be read due to EMFILE
 - read_sha1_file(): report correct name of packfile with a corrupt object
 (this branch is used by sp/emfile.)

Will merge to 'next'.

* sp/emfile (2010-11-01) 2 commits
 - Work around EMFILE when there are too many pack files
 - Use git_open_noatime when accessing pack data
 (this branch uses jc/emfile.)

Will merge to 'next', but might want to restructure the API a bit.

* jh/gitweb-caching (2010-11-01) 4 commits
 - gitweb: Minimal testing of gitweb caching
 - gitweb: File based caching layer (from git.kernel.org)
 - gitweb: add output buffering and associated functions
 - gitweb: Prepare for splitting gitweb
 (this branch uses jn/gitweb-test.)

* jk/maint-apply-no-binary (2010-10-18) 1 commit
  (merged to 'next' on 2010-11-05 at 8b7543a)
 + apply: don't segfault on binary files with missing data

* jl/add-p-reverse-message (2010-10-27) 1 commit
 - Correct help blurb in checkout -p and friends

Looked Ok; will merge to 'next' soonish.

* jl/clone-recurse-sm-synonym (2010-11-04) 1 commit
 - clone: Add the --recurse-submodules option as alias for --recursive

Looked Ok; will merge to 'next' soonish.

* jl/maint-pull-tags-doc (2010-11-03) 1 commit
  (merged to 'next' on 2010-11-05 at 861d16a)
 + pull: Remove --tags option from manpage

* jn/cherry-pick-refresh-index (2010-10-31) 1 commit
 - cherry-pick/revert: transparently refresh index

Looked Ok; will merge to 'next' soonish.

* jn/parse-options-extra (2010-10-24) 4 commits
 - update-index: migrate to parse-options API
 - setup: save prefix (original cwd relative to toplevel) in startup_info
 - parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTION
 - parse-options: allow git commands to invent new option types

Looked Ok; will merge to 'next' soonish.

* kb/maint-submodule-savearg (2010-11-02) 2 commits
  (merged to 'next' on 2010-11-05 at 10e1aeb)
 + submodule: only preserve flags across recursive status/update invocations
 + submodule: preserve all arguments exactly when recursing

* md/interix (2010-10-27) 2 commits
 - Interix: add configure checks
 - add support for the SUA layer (interix; windows)

Looked Ok, in the sense that I do not think it will negatively affect
other platforms.  Will merge to 'next' soonish.

* mm/phrase-remote-tracking (2010-11-02) 10 commits
 - git-branch.txt: mention --set-upstream as a way to change upstream configuration
 - user-manual: remote-tracking can be checked out, with detached HEAD
 - user-manual.txt: explain better the remote(-tracking) branch terms
 - Change incorrect "remote branch" to "remote tracking branch" in C code
 - Change incorrect uses of "remote branch" meaning "remote-tracking"
 - Change "tracking branch" to "remote-tracking branch"
 - everyday.txt: change "tracking branch" to "remote-tracking branch"
 - Change remote tracking to remote-tracking in non-trivial places
 - Replace "remote tracking" with "remote-tracking"
 - Better "Changed but not updated" message in git-status

Is everybody happy with this round?  I'd prefer to merge it to 'next' or
even 'master' and have further polishing be done, if necessary, in-tree.

* nd/setup (2010-11-08) 44 commits
 - t1020-subdirectory: test alias expansion in a subdirectory
 - Remove all logic from get_git_work_tree()
 - setup: rework setup_explicit_git_dir()
 - setup: clean up setup_discovered_git_dir()
 - setup: clean up setup_bare_git_dir()
 - setup: limit get_git_work_tree()'s to explicit setup case only
 - Use git_config_early() instead of git_config() during repo setup
 - Add git_config_early()
 - rev-parse: prints --git-dir relative to user's cwd
 - git-rev-parse.txt: clarify --git-dir
 - t1510: setup case #31
 - t1510: setup case #30
 - t1510: setup case #29
 - t1510: setup case #28
 - t1510: setup case #27
 - t1510: setup case #26
 - t1510: setup case #25
 - t1510: setup case #24
 - t1510: setup case #23
 - t1510: setup case #22
 - t1510: setup case #21
 - t1510: setup case #20
 - t1510: setup case #19
 - t1510: setup case #18
 - t1510: setup case #17
 - t1510: setup case #16
 - t1510: setup case #15
 - t1510: setup case #14
 - t1510: setup case #13
 - t1510: setup case #12
 - t1510: setup case #11
 - t1510: setup case #10
 - t1510: setup case #9
 - t1510: setup case #8
 - t1510: setup case #7
 - t1510: setup case #6
 - t1510: setup case #5
 - t1510: setup case #4
 - t1510: setup case #3
 - t1510: setup case #2
 - t1510: setup case #1
 - t1510: setup case #0
 - Add t1510 and basic rules that run repo setup
 - builtins: print setup info if repo is found

* rr/needs-clean-work-tree (2010-10-19) 1 commit
 - Porcelain scripts: Rewrite cryptic "needs update" error message

Looked Ok, will merge to 'next' soonish.

* sn/diff-doc (2010-11-04) 3 commits
 - docs: clarify git diff modes of operation
 - diff,difftool: Don't use the {0,2} notation in usage strings
 - CodingGuidelines: Add a section on writing documentation

* tr/config-doc (2010-10-24) 2 commits
 . Documentation: complete config list from other manpages
 . Documentation: Move variables from config.txt to separate file

This unfortunately heavily conflicts with patches in flight...

* kb/maint-rebase-autosquash (2010-11-04) 2 commits
 - rebase: teach --autosquash to match on sha1 in addition to message
 - rebase: better rearranging of fixup!/squash! lines with --autosquash

* kb/maint-status-cquote (2010-11-08) 1 commit
 - status: Quote paths with spaces in short format

* mg/maint-tag-rfc1991 (2010-11-06) 5 commits
 - tag: recognize rfc1991 signatures
 - tag: factor out sig detection for tag display
 - tag: factor out sig detection for body edits
 - verify-tag: factor out signature detection
 - t/t7004-tag: test handling of rfc1991 signatures

--------------------------------------------------
[Graduated to "master"]

* aw/git-p4-deletion (2010-10-22) 1 commit
  (merged to 'next' on 2010-10-26 at 5847c40)
 + Fix handling of git-p4 on deleted files

--------------------------------------------------
[Stalled]

* nd/index-doc (2010-09-06) 1 commit
 - doc: technical details about the index file format

Half-written but it is a good start.  I may need to give some help in
describing more recent index extensions.

* cb/ignored-paths-are-precious (2010-08-21) 1 commit
 - checkout/merge: optionally fail operation when ignored files need to be overwritten

This needs tests; also we know of longstanding bugs in related area that
needs to be addressed---they do not have to be part of this series but
their reproduction recipe would belong to the test script for this topic.

It would hurt users to make the new feature on by default, especially the
ones with subdirectories that come and go.

* jk/tag-contains (2010-07-05) 4 commits
 - Why is "git tag --contains" so slow?
 - default core.clockskew variable to one day
 - limit "contains" traversals based on commit timestamp
 - tag: speed up --contains calculation

The idea of the bottom one is probably Ok, except that the use of object
flags needs to be rethought, or at least the helper needs to be moved to
builtin/tag.c to make it clear that it should not be used outside the
current usage context.

--------------------------------------------------
[Cooking]

* ao/send-email-irt (2010-10-19) 1 commit
  (merged to 'next' on 2010-11-08 at d103166)
 + t9001: send-email interation with --in-reply-to and --chain-reply-to

* bg/maint-gitweb-test-lib (2010-10-20) 1 commit
  (merged to 'next' on 2010-11-05 at 0ead869)
 + t/gitweb-lib: Don't pass constant to decode_utf8

* cm/diff-check-at-eol (2010-10-10) 1 commit
 - diff --check: correct line numbers of new blank lines at EOF

Looked Ok; will merge to 'next' soonish.

* fc/apply-p2-get-header-name (2010-10-21) 2 commits
 - test: git-apply -p2 rename/chmod only
 - Fix git-apply with -p greater than 1

Looked Ok; will merge to 'next' soonish.

* jk/add-e-doc (2010-10-21) 1 commit
  (merged to 'next' on 2010-11-05 at 389fee7)
 + docs: give more hints about how "add -e" works

* jk/diff-CBM (2010-10-21) 1 commit
  (merged to 'next' on 2010-11-05 at 9d1ec14)
 + diff: report bogus input to -C/-M/-B

* jk/missing-config (2010-10-21) 1 commit
  (merged to 'next' on 2010-11-05 at 31fda69)
 + config: treat non-existent config files as empty

* jn/fast-import-fix (2010-10-20) 4 commits
 - fast-import: do not clear notes in do_change_note_fanout()
 - t9300 (fast-import): another test for the "replace root" feature
 - fast-import: tighten M 040000 syntax
 - fast-import: filemodify after M 040000 <tree> "" crashes

Looked Ok; will merge to 'next' soonish.

* jn/git-cmd-h-bypass-setup (2010-10-22) 7 commits
 - update-index -h: show usage even with corrupt index
 - merge -h: show usage even with corrupt index
 - ls-files -h: show usage even with corrupt index
 - gc -h: show usage even with broken configuration
 - commit/status -h: show usage even with broken configuration
 - checkout-index -h: show usage even in an invalid repository
 - branch -h: show usage even in an invalid repository
 (this branch uses en/and-cascade-tests.)

* kb/blame-author-email (2010-10-15) 1 commit
 - blame: Add option to show author email instead of name

Looked Ok; will merge to 'next' soonish.

* kb/maint-diff-ws-check (2010-10-20) 2 commits
  (merged to 'next' on 2010-11-05 at 861b5ac)
 + diff: handle lines containing only whitespace and tabs better
 + test-lib: extend test_decode_color to handle more color codes

* mg/make-prove (2010-10-14) 1 commit
  (merged to 'next' on 2010-11-05 at ec4f806)
 + test: allow running the tests under "prove"

* np/diff-in-corrupt-repository (2010-10-22) 1 commit
 - diff: don't presume empty file when corresponding object is missing

Looked Ok; will merge to 'next' soonish.

* np/pack-broken-boundary (2010-10-22) 1 commit
 - make pack-objects a bit more resilient to repo corruption

Looked Ok; will merge to 'next' soonish.

* tr/maint-git-repack-tmpfile (2010-10-19) 1 commit
  (merged to 'next' on 2010-11-05 at 80ad03a)
 + repack: place temporary packs under .git/objects/pack/

* tr/maint-merge-file-subdir (2010-10-17) 2 commits
  (merged to 'next' on 2010-11-05 at a2873a4)
 + merge-file: correctly find files when called in subdir
 + prefix_filename(): safely handle the case where pfx_len=0

* yd/dir-rename (2010-10-29) 5 commits
 - Allow hiding renames of individual files involved in a directory rename.
 - Unified diff output format for bulk moves.
 - Add testcases for the --detect-bulk-moves diffcore flag.
 - Raw diff output format for bulk moves.
 - Introduce bulk-move detection in diffcore.

* cb/diff-fname-optim (2010-09-26) 3 commits
  (merged to 'next' on 2010-11-05 at b3b09f3)
 + diff: avoid repeated scanning while looking for funcname
 + do not search functions for patch ID
 + add rebase patch id tests

* en/merge-recursive (2010-10-21) 39 commits
  (merged to 'next' on 2010-11-05 at 16902eb)
 + merge-recursive:make_room_for_directories - work around dumb compilers
 + merge-recursive: Remove redundant path clearing for D/F conflicts
 + merge-recursive: Make room for directories in D/F conflicts
 + handle_delete_modify(): Check whether D/F conflicts are still present
 + merge_content(): Check whether D/F conflicts are still present
 + conflict_rename_rename_1to2(): Fix checks for presence of D/F conflicts
 + conflict_rename_delete(): Check whether D/F conflicts are still present
 + merge-recursive: Delay modify/delete conflicts if D/F conflict present
 + merge-recursive: Delay content merging for renames
 + merge-recursive: Delay handling of rename/delete conflicts
 + merge-recursive: Move handling of double rename of one file to other file
 + merge-recursive: Move handling of double rename of one file to two
 + merge-recursive: Avoid doubly merging rename/add conflict contents
 + merge-recursive: Update merge_content() call signature
 + merge-recursive: Update conflict_rename_rename_1to2() call signature
 + merge-recursive: Structure process_df_entry() to handle more cases
 + merge-recursive: Have process_entry() skip D/F or rename entries
 + merge-recursive: New function to assist resolving renames in-core only
 + merge-recursive: New data structures for deferring of D/F conflicts
 + merge-recursive: Move process_entry's content merging into a function
 + merge-recursive: Move delete/modify handling into dedicated function
 + merge-recursive: Move rename/delete handling into dedicated function
 + merge-recursive: Nuke rename/directory conflict detection
 + merge-recursive: Rename conflict_rename_rename*() for clarity
 + merge-recursive: Small code clarification -- variable name and comments
 + t6036: Add testcase for undetected conflict
 + t6036: Add a second testcase similar to the first but with content changes
 + t6036: Test index and worktree state, not just that merge fails
 + t6020: Add a testcase for modify/delete + directory/file conflict
 + t6020: Modernize style a bit
 + t6022: Add tests for rename/rename combined with D/F conflicts
 + t6022: Add paired rename+D/F conflict: (two/file, one/file) -> (one, two)
 + t6022: Add tests with both rename source & dest involved in D/F conflicts
 + t6022: Add tests for reversing order of merges when D/F conflicts present
 + t6022: Add test combinations of {content conflict?, D/F conflict remains?}
 + t6032: Add a test checking for excessive output from merge
 + merge-recursive: Restructure showing how to chain more process_* functions
 + t3030: Add a testcase for resolvable rename/add conflict with symlinks
 + Merge branch 'en/rename-d-f' into en/merge-recursive
 (this branch uses en/rename-d-f.)

* il/remote-fd-ext (2010-10-12) 3 commits
  (merged to 'next' on 2010-11-05 at 7413413)
 + git-remote-ext
 + git-remote-fd
 + Add bidirectional_transfer_loop()

* jn/gitweb-test (2010-09-26) 4 commits
  (merged to 'next' on 2010-11-05 at 90b3adf)
 + gitweb/Makefile: Include gitweb/config.mak
 + gitweb/Makefile: Add 'test' and 'test-installed' targets
 + t/gitweb-lib.sh: Add support for GITWEB_TEST_INSTALLED
 + gitweb: Move call to evaluate_git_version after evaluate_gitweb_config
 (this branch is used by jh/gitweb-caching.)

* ak/apply-non-git-epoch (2010-09-29) 1 commit
 - apply: Recognize epoch timestamps with : in the timezone

Looked Ok; will merge to 'next' soonish.

* ak/submodule-sync (2010-10-08) 1 commit
  (merged to 'next' on 2010-11-05 at 5a2f940)
 + submodule sync: Update "submodule.<name>.url" for empty directories

* cb/leading-path-removal (2010-10-09) 5 commits
  (merged to 'next' on 2010-11-05 at 55ea322)
 + do not overwrite files in leading path
 + lstat_cache: optionally return match_len
 + add function check_ok_to_remove()
 + t7607: add leading-path tests
 + t7607: use test-lib functions and check MERGE_HEAD

* jh/notes-merge (2010-10-29) 25 commits
 - portability fix for c8af1a3b2f
 - notes-merge series: fixup minor style issues
 - Provide 'git merge --abort' as a synonym to 'git reset --merge'
 - cmd_merge(): Parse options before checking MERGE_HEAD
 - Provide 'git notes get-ref' to easily retrieve current notes ref
 - git notes merge: Add testcases for merging notes trees at different fanouts
 - git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"
 - git notes merge: --commit should fail if underlying notes ref has moved
 - git notes merge: List conflicting notes in notes merge commit message
 - git notes merge: Manual conflict resolution, part 2/2
 - git notes merge: Manual conflict resolution, part 1/2
 - Documentation: Preliminary docs on 'git notes merge'
 - git notes merge: Add automatic conflict resolvers (ours, theirs, union)
 - git notes merge: Handle real, non-conflicting notes merges
 - builtin/notes.c: Refactor creation of notes commits.
 - git notes merge: Initial implementation handling trivial merges only
 - builtin/notes.c: Split notes ref DWIMmery into a separate function
 - notes.c: Use two newlines (instead of one) when concatenating notes
 - (trivial) t3303: Indent with tabs instead of spaces for consistency
 - notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond
 - notes.h/c: Allow combine_notes functions to remove notes
 - notes.c: Reorder functions in preparation for next commit
 - notes.h: Make default_notes_ref() available in notes API
 - (trivial) notes.h: Minor documentation fixes to copy_notes()
 - notes.c: Hexify SHA1 in die() message from init_notes()

Still in flux?

* jk/maint-rev-list-nul (2010-10-07) 1 commit
  (merged to 'next' on 2010-11-05 at 406cba1)
 + rev-list: handle %x00 NUL in user format

* jk/push-progress (2010-10-17) 8 commits
  (merged to 'next' on 2010-11-05 at 9207c6d)
 + push: pass --progress down to git-pack-objects
 + t5523-push-upstream: test progress messages
 + t5523-push-upstream: add function to ensure fresh upstream repo
 + test_terminal: ensure redirections work reliably
 + test_terminal: catch use without TTY prerequisite
 + test-lib: allow test code to check the list of declared prerequisites
 + tests: test terminal output to both stdout and stderr
 + tests: factor out terminal handling from t7006

* jm/mailmap (2010-10-19) 3 commits
  (merged to 'next' on 2010-11-05 at ef1e754)
 + t4203: do not let "git shortlog" DWIM based on tty
 + t4203 (mailmap): stop hardcoding commit ids and dates
 + mailmap: fix use of freed memory

* jn/send-pack-error (2010-10-16) 1 commit
  (merged to 'next' on 2010-11-05 at ef559d4)
 + send-pack: avoid redundant "pack-objects died with strange error"

* kb/completion-checkout (2010-10-12) 1 commit
  (merged to 'next' on 2010-11-05 at 6836d70)
 + completion: Support the DWIM mode for git checkout

* pn/commit-autosquash (2010-11-02) 6 commits
 - add tests of commit --squash
 - commit: --squash option for use with rebase --autosquash
 - add tests of commit --fixup
 - commit: --fixup option for use with rebase --autosquash
 - pretty.c: teach format_commit_message() to reencode the output
 - commit: helper methods to reduce redundant blocks of code

* sg/bisect (2010-10-10) 3 commits
  (merged to 'next' on 2010-11-05 at 4a8b88d)
 + bisect: check for mandatory argument of 'bisect replay'
 + bisect: improve error msg of 'bisect reset' when original HEAD is deleted
 + bisect: improve error message of 'bisect log' while not bisecting

* sg/completion (2010-10-11) 4 commits
  (merged to 'next' on 2010-11-05 at 4967932)
 + bash: support pretty format aliases
 + bash: support more 'git notes' subcommands and their options
 + bash: not all 'git bisect' subcommands make sense when not bisecting
 + bash: offer refs for 'git bisect start'

* jj/icase-directory (2010-10-03) 8 commits
 - Support case folding in git fast-import when core.ignorecase=true
 - Support case folding for git add when core.ignorecase=true
 - Add case insensitivity support when using git ls-files
 - Add case insensitivity support for directories when using git status
 - Case insensitivity support for .gitignore via core.ignorecase
 - Add string comparison functions that respect the ignore_case variable.
 - Makefile & configure: add a NO_FNMATCH_CASEFOLD flag
 - Makefile & configure: add a NO_FNMATCH flag

* en/and-cascade-tests (2010-10-03) 13 commits
 - Introduce sane_unset and use it to ensure proper && chaining
 - t7800 (difftool): add missing &&
 - t7601 (merge-pull-config): add missing &&
 - t7001 (mv): add missing &&
 - t6016 (rev-list-graph-simplify-history): add missing &&
 - t5602 (clone-remote-exec): add missing &&
 - t4026 (color): remove unneeded and unchained command
 - t4019 (diff-wserror): add lots of missing &&
 - t4202 (log): Replace '<git-command> || :' with test_might_fail
 - t4002 (diff-basic): use test_might_fail for commands that might fail
 - t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
 - t4017 (diff-retval): replace manual exit code check with test_expect_code
 - test-lib: make test_expect_code a test command
 (this branch is used by jn/git-cmd-h-bypass-setup.)

* jk/no-textconv-symlink (2010-09-21) 1 commit
  (merged to 'next' on 2010-11-05 at 0a99e75)
 + diff: don't use pathname-based diff drivers for symlinks
 (this branch is used by ks/no-textconv-symlink.)

* ks/no-textconv-symlink (2010-09-29) 3 commits
  (merged to 'next' on 2010-11-05 at 32f0580)
 + blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
 + blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks
 + blame,cat-file: Prepare --textconv tests for correctly-failing conversion program
 (this branch uses jk/no-textconv-symlink.)

* nd/struct-pathspec (2010-09-20) 5 commits
 - ce_path_match: drop prefix matching in favor of match_pathspec
 - Convert ce_path_match() to use struct pathspec
 - tree_entry_interesting: turn to match_pathspec if wildcard is present
 - pathspec: add tree_recursive_diff parameter
 - pathspec: mark wildcard pathspecs from the beginning
 (this branch uses en/object-list-with-pathspec.)

This is related to something I have long been wanting to see happen.  Will
give it another look and merge to 'next'.

* en/object-list-with-pathspec (2010-09-20) 8 commits
 - Add testcases showing how pathspecs are handled with rev-list --objects
 - Make rev-list --objects work together with pathspecs
 - Move tree_entry_interesting() to tree-walk.c and export it
 - tree_entry_interesting(): remove dependency on struct diff_options
 - Convert struct diff_options to use struct pathspec
 - pathspec: cache string length when initializing pathspec
 - diff-no-index: use diff_tree_setup_paths()
 - Add struct pathspec
 (this branch is used by nd/struct-pathspec.)

* tc/smart-http-post-redirect (2010-09-25) 1 commit
 - smart-http: Don't change POST to GET when following redirect

Will merge to 'next' to see what happens.

* en/rename-d-f (2010-09-08) 2 commits
 + merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir
 + t3509: Add rename + D/F conflict testcase that recursive strategy fails
 (this branch is used by en/merge-recursive.)

* jl/fetch-submodule-recursive (2010-09-19) 4 commits
 - fetch: Get submodule paths from index and not from .gitmodules
 - fetch: Fix a bug swallowing the output of recursive submodule fetching
 - Submodules: Add the new "fetch" config option for fetch and pull
 - fetch/pull: Recursively fetch populated submodules

* tr/merge-unborn-clobber (2010-08-22) 1 commit
 - Exhibit merge bug that clobbers index&WT

* ab/i18n (2010-10-07) 161 commits
 - po/de.po: complete German translation
 - po/sv.po: add Swedish translation
 - gettextize: git-bisect bisect_next_check "You need to" message
 - gettextize: git-bisect [Y/n] messages
 - gettextize: git-bisect bisect_replay + $1 messages
 - gettextize: git-bisect bisect_reset + $1 messages
 - gettextize: git-bisect bisect_run + $@ messages
 - gettextize: git-bisect die + eval_gettext messages
 - gettextize: git-bisect die + gettext messages
 - gettextize: git-bisect echo + eval_gettext message
 - gettextize: git-bisect echo + gettext messages
 - gettextize: git-bisect gettext + echo message
 - gettextize: git-bisect add git-sh-i18n
 - gettextize: git-stash drop_stash say/die messages
 - gettextize: git-stash "unknown option" message
 - gettextize: git-stash die + eval_gettext $1 messages
 - gettextize: git-stash die + eval_gettext $* messages
 - gettextize: git-stash die + eval_gettext messages
 - gettextize: git-stash die + gettext messages
 - gettextize: git-stash say + gettext messages
 - gettextize: git-stash echo + gettext message
 - gettextize: git-stash add git-sh-i18n
 - gettextize: git-submodule "blob" and "submodule" messages
 - gettextize: git-submodule "path not initialized" message
 - gettextize: git-submodule "[...] path is ignored" message
 - gettextize: git-submodule "Entering [...]" message
 - gettextize: git-submodule $errmsg messages
 - gettextize: git-submodule "Submodule change[...]" messages
 - gettextize: git-submodule "cached cannot be used" message
 - gettextize: git-submodule $update_module say + die messages
 - gettextize: git-submodule die + eval_gettext messages
 - gettextize: git-submodule say + eval_gettext messages
 - gettextize: git-submodule echo + eval_gettext messages
 - gettextize: git-submodule add git-sh-i18n
 - gettextize: git-pull "rebase against" / "merge with" messages
 - gettextize: git-pull "[...] not currently on a branch" message
 - gettextize: git-pull "You asked to pull" message
 - gettextize: git-pull split up "no candidate" message
 - gettextize: git-pull eval_gettext + warning message
 - gettextize: git-pull eval_gettext + die message
 - gettextize: git-pull die messages
 - gettextize: git-pull add git-sh-i18n
 - gettext docs: add "Testing marked strings" section to po/README
 - gettext docs: the Git::I18N Perl interface
 - gettext docs: the git-sh-i18n.sh Shell interface
 - gettext docs: the gettext.h C interface
 - gettext docs: add "Marking strings for translation" section in po/README
 - gettext docs: add a "Testing your changes" section to po/README
 - po/pl.po: add Polish translation
 - po/hi.po: add Hindi Translation
 - po/en_GB.po: add British English translation
 - po/de.po: add German translation
 - Makefile: only add gettext tests on XGETTEXT_INCLUDE_TESTS=YesPlease
 - gettext docs: add po/README file documenting Git's gettext
 - gettextize: git-am printf(1) message to eval_gettext
 - gettextize: git-am core say messages
 - gettextize: git-am "Apply?" message
 - gettextize: git-am clean_abort messages
 - gettextize: git-am cannot_fallback messages
 - gettextize: git-am die messages
 - gettextize: git-am eval_gettext messages
 - gettextize: git-am multi-line getttext $msg; echo
 - gettextize: git-am one-line gettext $msg; echo
 - gettextize: git-am add git-sh-i18n
 - gettext tests: add GETTEXT_POISON tests for shell scripts
 - gettext tests: add GETTEXT_POISON support for shell scripts
 - Makefile: MSGFMT="msgfmt --check" under GNU_GETTEXT
 - Makefile: add GNU_GETTEXT, set when we expect GNU gettext
 - gettextize: git-shortlog basic messages
 - gettextize: git-revert split up "could not revert/apply" message
 - gettextize: git-revert literal "me" messages
 - gettextize: git-revert "Your local changes" message
 - gettextize: git-revert basic messages
 - gettextize: git-notes "Refusing to %s notes in %s" message
 - gettextize: git-notes GIT_NOTES_REWRITE_MODE error message
 - gettextize: git-notes basic commands
 - gettextize: git-gc "Auto packing the repository" message
 - gettextize: git-gc basic messages
 - gettextize: git-describe basic messages
 - gettextize: git-clean clean.requireForce messages
 - gettextize: git-clean basic messages
 - gettextize: git-bundle basic messages
 - gettextize: git-archive basic messages
 - gettextize: git-status "renamed: " message
 - gettextize: git-status "Initial commit" message
 - gettextize: git-status "Changes to be committed" message
 - gettextize: git-status shortstatus messages
 - gettextize: git-status "nothing to commit" messages
 - gettextize: git-status basic messages
 - gettextize: git-push "prevent you from losing" message
 - gettextize: git-push basic messages
 - gettextize: git-tag tag_template message
 - gettextize: git-tag basic messages
 - gettextize: git-reset "Unstaged changes after reset" message
 - gettextize: git-reset reset_type_names messages
 - gettextize: git-reset basic messages
 - gettextize: git-rm basic messages
 - gettextize: git-mv "bad" messages
 - gettextize: git-mv basic messages
 - gettextize: git-merge "Wonderful" message
 - gettextize: git-merge "You have not concluded your merge" messages
 - gettextize: git-merge "Updating %s..%s" message
 - gettextize: git-merge basic messages
 - gettextize: git-log "--OPT does not make sense" messages
 - gettextize: git-log basic messages
 - gettextize: git-grep "--open-files-in-pager" message
 - gettextize: git-grep basic messages
 - gettextize: git-fetch split up "(non-fast-forward)" message
 - gettextize: git-fetch update_local_ref messages
 - gettextize: git-fetch formatting messages
 - gettextize: git-fetch basic messages
 - gettextize: git-diff basic messages
 - gettextize: git-commit advice messages
 - gettextize: git-commit "enter the commit message" message
 - gettextize: git-commit print_summary messages
 - gettextize: git-commit formatting messages
 - gettextize: git-commit "middle of a merge" message
 - gettextize: git-commit basic messages
 - gettextize: git-checkout "Switched to a .. branch" message
 - gettextize: git-checkout "HEAD is now at" message
 - gettextize: git-checkout describe_detached_head messages
 - gettextize: git-checkout: our/their version message
 - gettextize: git-checkout basic messages
 - gettextize: git-branch "(no branch)" message
 - gettextize: git-branch "git branch -v" messages
 - gettextize: git-branch "Deleted branch [...]" message
 - gettextize: git-branch "remote branch '%s' not found" message
 - gettextize: git-branch basic messages
 - gettextize: git-add refresh_index message
 - gettextize: git-add "remove '%s'" message
 - gettextize: git-add "pathspec [...] did not match" message
 - gettextize: git-add "Use -f if you really want" message
 - gettextize: git-add "no files added" message
 - gettextize: git-add basic messages
 - gettextize: git-clone "Cloning into" message
 - gettextize: git-clone basic messages
 - gettext tests: test message re-encoding under C
 - po/is.po: add Icelandic translation
 - gettext tests: mark a test message as not needing translation
 - gettext tests: test re-encoding with a UTF-8 msgid under Shell
 - gettext tests: test message re-encoding under Shell
 - gettext tests: add detection for is_IS.ISO-8859-1 locale
 - gettext tests: test if $VERSION exists before using it
 - gettextize: git-init "Initialized [...] repository" message
 - gettextize: git-init basic messages
 - gettext tests: skip lib-gettext.sh tests under GETTEXT_POISON
 - gettext tests: add GETTEXT_POISON=YesPlease Makefile parameter
 - gettext.c: use libcharset.h instead of langinfo.h when available
 - gettext.c: work around us not using setlocale(LC_CTYPE, "")
 - builtin.h: Include gettext.h
 - Makefile: use variables and shorter lines for xgettext
 - Makefile: tell xgettext(1) that our source is in UTF-8
 - Makefile: provide a --msgid-bugs-address to xgettext(1)
 - Makefile: A variable for options used by xgettext(1) calls
 - gettext tests: locate i18n lib&data correctly under --valgrind
 - gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions
 - gettext tests: rename test to work around GNU gettext bug
 - gettext: add infrastructure for translating Git with gettext
 - builtin: use builtin.h for all builtin commands
 - tests: use test_cmp instead of piping to diff(1)
 - t7004-tag.sh: re-arrange git tag comment for clarity

Will merge to 'next' to see what happens; it is getting ridiculously
painful to keep re-resolving the conflicts with other topics in flight,
even with the help with rerere.

^ permalink raw reply	[relevance 1%]

* [PATCH 01/10] tests: add missing &&, batch 2
  2010-10-31  7:26  5%       ` [PATCH/RFC 00/10] " Jonathan Nieder
@ 2010-10-31  7:30  6%         ` Jonathan Nieder
  0 siblings, 0 replies; 200+ results
From: Jonathan Nieder @ 2010-10-31  7:30 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Elijah Newren, git, avarab

Same rules as before: this patch only adds " &&" to the end of
some lines in the test suite.

Intended to be applied on top of or squashed with the last
batch if they look okay.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 t/t0020-crlf.sh               |    2 +-
 t/t1400-update-ref.sh         |   20 ++++++++++----------
 t/t3301-notes.sh              |    6 +++---
 t/t3404-rebase-interactive.sh |    6 +++---
 t/t4124-apply-ws-rule.sh      |    6 +++---
 t/t5503-tagfollow.sh          |    6 +++---
 t/t5701-clone-local.sh        |    6 +++---
 t/t7001-mv.sh                 |    2 +-
 t/t7004-tag.sh                |   30 +++++++++++++++---------------
 t/t7300-clean.sh              |    2 +-
 t/t7502-commit.sh             |    2 +-
 t/t7700-repack.sh             |    6 +++---
 t/t9146-git-svn-empty-dirs.sh |    2 +-
 13 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh
index 234a94f..1a8f44c 100755
--- a/t/t0020-crlf.sh
+++ b/t/t0020-crlf.sh
@@ -439,7 +439,7 @@ test_expect_success 'checkout when deleting .gitattributes' '
 	git rm .gitattributes &&
 	echo "contentsQ" | q_to_cr > .file2 &&
 	git add .file2 &&
-	git commit -m third
+	git commit -m third &&
 
 	git checkout master~1 &&
 	git checkout master &&
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index 54ba3df..d17551e 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -185,55 +185,55 @@ gd="Thu, 26 May 2005 18:33:00 -0500"
 ld="Thu, 26 May 2005 18:43:00 -0500"
 test_expect_success \
 	'Query "master@{May 25 2005}" (before history)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{May 25 2005}" >o 2>e &&
 	 test '"$C"' = $(cat o) &&
 	 test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
 test_expect_success \
 	"Query master@{2005-05-25} (before history)" \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify master@{2005-05-25} >o 2>e &&
 	 test '"$C"' = $(cat o) &&
 	 echo test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
 test_expect_success \
 	'Query "master@{May 26 2005 23:31:59}" (1 second before history)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e &&
 	 test '"$C"' = $(cat o) &&
 	 test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"'
 test_expect_success \
 	'Query "master@{May 26 2005 23:32:00}" (exactly history start)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e &&
 	 test '"$C"' = $(cat o) &&
 	 test "" = "$(cat e)"'
 test_expect_success \
 	'Query "master@{May 26 2005 23:32:30}" (first non-creation change)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{May 26 2005 23:32:30}" >o 2>e &&
 	 test '"$A"' = $(cat o) &&
 	 test "" = "$(cat e)"'
 test_expect_success \
 	'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&
 	 test '"$B"' = $(cat o) &&
 	 test "warning: Log .git/logs/'"$m has gap after $gd"'." = "$(cat e)"'
 test_expect_success \
 	'Query "master@{2005-05-26 23:38:00}" (middle of history)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e &&
 	 test '"$Z"' = $(cat o) &&
 	 test "" = "$(cat e)"'
 test_expect_success \
 	'Query "master@{2005-05-26 23:43:00}" (exact end of history)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e &&
 	 test '"$E"' = $(cat o) &&
 	 test "" = "$(cat e)"'
 test_expect_success \
 	'Query "master@{2005-05-28}" (past end of history)' \
-	'rm -f o e
+	'rm -f o e &&
 	 git rev-parse --verify "master@{2005-05-28}" >o 2>e &&
 	 test '"$D"' = $(cat o) &&
 	 test "warning: Log .git/logs/'"$m unexpectedly ended on $ld"'." = "$(cat e)"'
@@ -247,7 +247,7 @@ test_expect_success \
      git add F &&
 	 GIT_AUTHOR_DATE="2005-05-26 23:30" \
 	 GIT_COMMITTER_DATE="2005-05-26 23:30" git commit -m add -a &&
-	 h_TEST=$(git rev-parse --verify HEAD)
+	 h_TEST=$(git rev-parse --verify HEAD) &&
 	 echo The other day this did not work. >M &&
 	 echo And then Bob told me how to fix it. >>M &&
 	 echo OTHER >F &&
diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh
index a2b79a0..6931171 100755
--- a/t/t3301-notes.sh
+++ b/t/t3301-notes.sh
@@ -627,16 +627,16 @@ test_expect_success '--show-notes=ref accumulates' '
 
 test_expect_success 'Allow notes on non-commits (trees, blobs, tags)' '
 	git config core.notesRef refs/notes/other &&
-	echo "Note on a tree" > expect
+	echo "Note on a tree" > expect &&
 	git notes add -m "Note on a tree" HEAD: &&
 	git notes show HEAD: > actual &&
 	test_cmp expect actual &&
-	echo "Note on a blob" > expect
+	echo "Note on a blob" > expect &&
 	filename=$(git ls-tree --name-only HEAD | head -n1) &&
 	git notes add -m "Note on a blob" HEAD:$filename &&
 	git notes show HEAD:$filename > actual &&
 	test_cmp expect actual &&
-	echo "Note on a tag" > expect
+	echo "Note on a tag" > expect &&
 	git tag -a -m "This is an annotated tag" foobar HEAD^ &&
 	git notes add -m "Note on a tag" foobar &&
 	git notes show foobar > actual &&
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 7d20a74..c0e69f6 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -46,7 +46,7 @@ test_expect_success 'setup' '
 	test_commit G file1 &&
 	test_commit H file5 &&
 	git checkout -b branch2 F &&
-	test_commit I file6
+	test_commit I file6 &&
 	git checkout -b conflict-branch A &&
 	for n in one two three four
 	do
@@ -584,7 +584,7 @@ test_expect_success 'do "noop" when there is nothing to cherry-pick' '
 
 	git checkout -b branch4 HEAD &&
 	GIT_EDITOR=: git commit --amend \
-		--author="Somebody else <somebody@else.com>" 
+		--author="Somebody else <somebody@else.com>" &&
 	test $(git rev-parse branch3) != $(git rev-parse branch4) &&
 	git rebase -i branch3 &&
 	test $(git rev-parse branch3) = $(git rev-parse branch4)
@@ -599,7 +599,7 @@ test_expect_success 'submodule rebase setup' '
 		git add elif && git commit -m "submodule initial"
 	) &&
 	echo 1 >file1 &&
-	git add file1 sub
+	git add file1 sub &&
 	test_tick &&
 	git commit -m "One" &&
 	echo 2 >file1 &&
diff --git a/t/t4124-apply-ws-rule.sh b/t/t4124-apply-ws-rule.sh
index 8a676a5..414b09b 100755
--- a/t/t4124-apply-ws-rule.sh
+++ b/t/t4124-apply-ws-rule.sh
@@ -368,7 +368,7 @@ test_expect_success 'missing blanks at EOF must only match blank lines' '
 	git diff -- one >patch &&
 
 	echo a >one &&
-	test_must_fail git apply patch
+	test_must_fail git apply patch &&
 	test_must_fail git apply --whitespace=fix patch &&
 	test_must_fail git apply --ignore-space-change --whitespace=fix patch
 '
@@ -419,7 +419,7 @@ test_expect_success 'same, but with CR-LF line endings && cr-at-eol set' '
 	printf "b\r\n" >>one &&
 	printf "c\r\n" >>one &&
 	cp one save-one &&
-	printf "                 \r\n" >>one
+	printf "                 \r\n" >>one &&
 	git add one &&
 	printf "d\r\n" >>one &&
 	cp one expect &&
@@ -436,7 +436,7 @@ test_expect_success 'same, but with CR-LF line endings && cr-at-eol unset' '
 	printf "b\r\n" >>one &&
 	printf "c\r\n" >>one &&
 	cp one save-one &&
-	printf "                 \r\n" >>one
+	printf "                 \r\n" >>one &&
 	git add one &&
 	cp one expect &&
 	printf "d\r\n" >>one &&
diff --git a/t/t5503-tagfollow.sh b/t/t5503-tagfollow.sh
index 8a298a6..7f6d3d2 100755
--- a/t/t5503-tagfollow.sh
+++ b/t/t5503-tagfollow.sh
@@ -54,7 +54,7 @@ EOF
 '
 
 test_expect_success NOT_MINGW 'fetch A (new commit : 1 connection)' '
-	rm -f $U
+	rm -f $U &&
 	(
 		cd cloned &&
 		GIT_DEBUG_SEND_PACK=3 git fetch 3>../$U &&
@@ -87,7 +87,7 @@ EOF
 '
 
 test_expect_success NOT_MINGW 'fetch C, T (new branch, tag : 1 connection)' '
-	rm -f $U
+	rm -f $U &&
 	(
 		cd cloned &&
 		GIT_DEBUG_SEND_PACK=3 git fetch 3>../$U &&
@@ -126,7 +126,7 @@ EOF
 '
 
 test_expect_success NOT_MINGW 'fetch B, S (commit and tag : 1 connection)' '
-	rm -f $U
+	rm -f $U &&
 	(
 		cd cloned &&
 		GIT_DEBUG_SEND_PACK=3 git fetch 3>../$U &&
diff --git a/t/t5701-clone-local.sh b/t/t5701-clone-local.sh
index 8b4c356..0f4d487 100755
--- a/t/t5701-clone-local.sh
+++ b/t/t5701-clone-local.sh
@@ -10,11 +10,11 @@ test_expect_success 'preparing origin repository' '
 	git clone --bare . a.git &&
 	git clone --bare . x &&
 	test "$(GIT_CONFIG=a.git/config git config --bool core.bare)" = true &&
-	test "$(GIT_CONFIG=x/config git config --bool core.bare)" = true
+	test "$(GIT_CONFIG=x/config git config --bool core.bare)" = true &&
 	git bundle create b1.bundle --all &&
 	git bundle create b2.bundle master &&
 	mkdir dir &&
-	cp b1.bundle dir/b3
+	cp b1.bundle dir/b3 &&
 	cp b1.bundle b4
 '
 
@@ -112,7 +112,7 @@ test_expect_success 'bundle clone with nonexistent HEAD' '
 	cd "$D" &&
 	git clone b2.bundle b2 &&
 	cd b2 &&
-	git fetch
+	git fetch &&
 	test ! -e .git/refs/heads/master
 '
 
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 624e6d2..a845b15 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -207,7 +207,7 @@ test_expect_success 'git mv should not change sha1 of moved cache entry' '
 	git init &&
 	echo 1 >dirty &&
 	git add dirty &&
-	entry="$(git ls-files --stage dirty | cut -f 1)"
+	entry="$(git ls-files --stage dirty | cut -f 1)" &&
 	git mv dirty dirty2 &&
 	[ "$entry" = "$(git ls-files --stage dirty2 | cut -f 1)" ] &&
 	echo 2 >dirty2 &&
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index ac943f5..d05f421 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1097,7 +1097,7 @@ hash1=$(git rev-parse HEAD)
 test_expect_success 'creating second commit and tag' '
 	echo foo-2.0 >foo &&
 	git add foo &&
-	git commit -m second
+	git commit -m second &&
 	git tag v2.0
 '
 
@@ -1122,18 +1122,18 @@ v2.0
 EOF
 
 test_expect_success 'checking that first commit is in all tags (hash)' "
-	git tag -l --contains $hash1 v* >actual
+	git tag -l --contains $hash1 v* >actual &&
 	test_cmp expected actual
 "
 
 # other ways of specifying the commit
 test_expect_success 'checking that first commit is in all tags (tag)' "
-	git tag -l --contains v1.0 v* >actual
+	git tag -l --contains v1.0 v* >actual &&
 	test_cmp expected actual
 "
 
 test_expect_success 'checking that first commit is in all tags (relative)' "
-	git tag -l --contains HEAD~2 v* >actual
+	git tag -l --contains HEAD~2 v* >actual &&
 	test_cmp expected actual
 "
 
@@ -1142,7 +1142,7 @@ v2.0
 EOF
 
 test_expect_success 'checking that second commit only has one tag' "
-	git tag -l --contains $hash2 v* >actual
+	git tag -l --contains $hash2 v* >actual &&
 	test_cmp expected actual
 "
 
@@ -1151,7 +1151,7 @@ cat > expected <<EOF
 EOF
 
 test_expect_success 'checking that third commit has no tags' "
-	git tag -l --contains $hash3 v* >actual
+	git tag -l --contains $hash3 v* >actual &&
 	test_cmp expected actual
 "
 
@@ -1161,7 +1161,7 @@ test_expect_success 'creating simple branch' '
 	git branch stable v2.0 &&
         git checkout stable &&
 	echo foo-3.0 > foo &&
-	git commit foo -m fourth
+	git commit foo -m fourth &&
 	git tag v3.0
 '
 
@@ -1172,7 +1172,7 @@ v3.0
 EOF
 
 test_expect_success 'checking that branch head only has one tag' "
-	git tag -l --contains $hash4 v* >actual
+	git tag -l --contains $hash4 v* >actual &&
 	test_cmp expected actual
 "
 
@@ -1186,7 +1186,7 @@ v4.0
 EOF
 
 test_expect_success 'checking that original branch head has one tag now' "
-	git tag -l --contains $hash3 v* >actual
+	git tag -l --contains $hash3 v* >actual &&
 	test_cmp expected actual
 "
 
@@ -1201,18 +1201,18 @@ v4.0
 EOF
 
 test_expect_success 'checking that initial commit is in all tags' "
-	git tag -l --contains $hash1 v* >actual
+	git tag -l --contains $hash1 v* >actual &&
 	test_cmp expected actual
 "
 
 # mixing modes and options:
 
 test_expect_success 'mixing incompatibles modes and options is forbidden' '
-	test_must_fail git tag -a
-	test_must_fail git tag -l -v
-	test_must_fail git tag -n 100
-	test_must_fail git tag -l -m msg
-	test_must_fail git tag -l -F some file
+	test_must_fail git tag -a &&
+	test_must_fail git tag -l -v &&
+	test_must_fail git tag -n 100 &&
+	test_must_fail git tag -l -m msg &&
+	test_must_fail git tag -l -F some file &&
 	test_must_fail git tag -v -s
 '
 
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index 6c776e9..c802ef8 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -183,7 +183,7 @@ test_expect_success 'git clean symbolic link' '
 
 	mkdir -p build docs &&
 	touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
-	ln -s docs/manual.txt src/part4.c
+	ln -s docs/manual.txt src/part4.c &&
 	git clean &&
 	test -f Makefile &&
 	test -f README &&
diff --git a/t/t7502-commit.sh b/t/t7502-commit.sh
index c1c6645..50da034 100755
--- a/t/t7502-commit.sh
+++ b/t/t7502-commit.sh
@@ -390,7 +390,7 @@ try_commit_status_combo () {
 
 	test_expect_success 'commit --no-status' '
 		clear_config commit.status &&
-		try_commit --no-status
+		try_commit --no-status &&
 		! grep "^# Changes to be committed:" .git/COMMIT_EDITMSG
 	'
 
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index c2f66ff..d954b84 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -56,7 +56,7 @@ test_expect_success 'loose objects in alternate ODB are not repacked' '
 '
 
 test_expect_success 'packed obs in alt ODB are repacked even when local repo is packless' '
-	mkdir alt_objects/pack
+	mkdir alt_objects/pack &&
 	mv .git/objects/pack/* alt_objects/pack &&
 	git repack -a &&
 	myidx=$(ls -1 .git/objects/pack/*.idx) &&
@@ -95,14 +95,14 @@ test_expect_success 'packed obs in alternate ODB kept pack are repacked' '
 	# swap the .keep so the commit object is in the pack with .keep
 	for p in alt_objects/pack/*.pack
 	do
-		base_name=$(basename $p .pack)
+		base_name=$(basename $p .pack) &&
 		if test -f alt_objects/pack/$base_name.keep
 		then
 			rm alt_objects/pack/$base_name.keep
 		else
 			touch alt_objects/pack/$base_name.keep
 		fi
-	done
+	done &&
 	git repack -a -d &&
 	myidx=$(ls -1 .git/objects/pack/*.idx) &&
 	test -f "$myidx" &&
diff --git a/t/t9146-git-svn-empty-dirs.sh b/t/t9146-git-svn-empty-dirs.sh
index 565365c..158c8e3 100755
--- a/t/t9146-git-svn-empty-dirs.sh
+++ b/t/t9146-git-svn-empty-dirs.sh
@@ -33,7 +33,7 @@ test_expect_success 'more emptiness' '
 '
 
 test_expect_success 'git svn rebase creates empty directory' '
-	( cd cloned && git svn rebase )
+	( cd cloned && git svn rebase ) &&
 	test -d cloned/"! !"
 '
 
-- 
1.7.2.3.557.gab647.dirty

^ permalink raw reply related	[relevance 6%]

* [PATCH/RFC 00/10] Re: [PATCH en/cascade-tests] tests: add missing &&
  @ 2010-10-31  7:26  5%       ` Jonathan Nieder
  2010-10-31  7:30  6%         ` [PATCH 01/10] tests: add missing &&, batch 2 Jonathan Nieder
  0 siblings, 1 reply; 200+ results
From: Jonathan Nieder @ 2010-10-31  7:26 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Elijah Newren, git, avarab

Junio C Hamano wrote:
> Jonathan Nieder <jrnieder@gmail.com> writes:

>> @@ -36,7 +36,7 @@ test_expect_success 'see what we expect' '
>>  	{
>>  		ln -s x y 2> /dev/null &&
>>  		test -h y 2> /dev/null ||
>> -		no_symlinks=1
>> +		no_symlinks=1 &&
>>  		rm -f y
>
> ... if you allowed such a simple assignment failure, no_symlinks=1 may
> fail, and we end up not running "rm -f y" to clean up, which might be
> somewhat undesirable ;-)

Thanks.  Will undo that bit in my local version.

Actually I don't see why the "rm -f y" is needed in the first place,
but that is a question for another day.

Here's another batch of patches in the same &&-adding vein.  I'm only
sending 10 to the list for now; I can mete the rest out at whatever
rate is useful to people.

Jonathan Nieder (27):
  tests: more missing &&
  test-lib: introduce test_line_count to measure files
  t6022 (renaming merge): chain test commands with &&
  t1502 (rev-parse --parseopt): test exit code from "-h"
  t1400 (update-ref): use test_must_fail
  t3301 (notes): use test_expect_code for clarity
  t3404 (rebase -i): unroll test_commit loops
  t3404 (rebase -i): move comment to description
  t3404 (rebase -i): introduce helper to check position of HEAD
  t4124 (apply --whitespace): use test_might_fail
  t5701 (clone -l): use test_must_fail
  ttt03, t6032: use test_might_fail
  t6032 (merge): give body of rename tests its own function
  t7001 (mv): introduce test_grep function and use it
  t7004 (tag): use test_must_fail
  t9146 (git svn): check exit status from svn in loop
  t9146 (git svn): use test_path_is_dir/missing helpers
  t8007 (textconv): use test_must_fail
  t7502 (commit): use test_must_fail
  t0005 (signals): hide test-sigchain invocation from &&-chaining
    checker
  t0020 (convert): improve error checking in loops
  t0020 (convert): use diff-index --exit-code
  t0020 (convert): remove "Huh?" noise
  t0040 (parse-options): use test_expect_code
  t7300 (clean): use test_cmp instead of test "$foo" = bar
  t1501 (rev-parse): use sane_unset
  t4022 (diff -B): simplify using test_grep

 t/README                      |    9 ++
 t/t0005-signals.sh            |   16 ++-
 t/t0020-crlf.sh               |  247 +++++++++---------------------------
 t/t0040-parse-options.sh      |   12 +-
 t/t1400-update-ref.sh         |   25 ++--
 t/t1501-worktree.sh           |    4 +-
 t/t1502-rev-parse-parseopt.sh |    2 +-
 t/t3301-notes.sh              |    8 +-
 t/t3404-rebase-interactive.sh |   88 ++++++-------
 t/t4022-diff-rewrite.sh       |    9 +-
 t/t4124-apply-ws-rule.sh      |   11 +-
 t/t5503-tagfollow.sh          |   10 +-
 t/t5701-clone-local.sh        |   22 +---
 t/t6022-merge-rename.sh       |  282 +++++++++++++---------------------------
 t/t6032-merge-large-rename.sh |   36 ++++--
 t/t7001-mv.sh                 |    8 +-
 t/t7004-tag.sh                |   36 +++---
 t/t7300-clean.sh              |   25 ++--
 t/t7502-commit.sh             |    4 +-
 t/t7700-repack.sh             |    6 +-
 t/t8007-cat-file-textconv.sh  |    2 +-
 t/t9146-git-svn-empty-dirs.sh |   64 ++++------
 t/test-lib.sh                 |   57 ++++++++
 23 files changed, 395 insertions(+), 588 deletions(-)

-- 
1.7.2.3.557.gab647.dirty

^ permalink raw reply	[relevance 5%]

* What's cooking in git.git (Oct 2010, #02; Tue, 26)
@ 2010-10-27  6:13  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2010-10-27  6:13 UTC (permalink / raw)
  To: git

What's cooking in git.git (Oct 2010, #02; Tue, 26)
--------------------------------------------------

Here are the topics that have been cooking.  Commits prefixed with '-' are
only in 'pu' while commits prefixed with '+' are in 'next'.  The ones
marked with '.' do not appear in any of the integration branches, but I am
still holding onto them.

Many topics have been cooking for a while in 'next', some of them for too
long.  Tonight's pushout is fairly large, and the result makes the set of
remaining topics on 'next' very thin.  A few people sent series based on
'next'; that was not a pleasant experience for me to try separating them
out, but I am in no position to complain---all of the topics that have
been cooking for a very long time are long overdue.

--------------------------------------------------
[New Topics]

* ao/send-email-irt (2010-10-19) 7 commits
 - t9001: send-email interation with --in-reply-to and --chain-reply-to
 - t/t9001-send-email.sh: fix stderr redirection in 'Invalid In-Reply-To'
 - Clarify and extend the "git diff" format documentation
 - git-show-ref.txt: clarify the pattern matching
 - documentation: git-config minor cleanups
 - Update test script annotate-tests.sh to handle missing/extra authors
 - {cvs,svn}import: use the new 'git read-tree --empty'

* aw/git-p4-deletion (2010-10-22) 1 commit
  (merged to 'next' on 2010-10-26 at 5847c40)
 + Fix handling of git-p4 on deleted files

* bg/maint-gitweb-test-lib (2010-10-20) 1 commit
 - t/gitweb-lib: Don't pass constant to decode_utf8

* cm/diff-check-at-eol (2010-10-10) 1 commit
 - diff --check: correct line numbers of new blank lines at EOF

* fc/apply-p2-get-header-name (2010-10-21) 3 commits
 - test: git-apply -p2 rename/chmod only
 - fixup! Fix git-apply with
 - Fix git-apply with -p greater than 1

* jk/add-e-doc (2010-10-21) 1 commit
 - docs: give more hints about how "add -e" works

* jk/diff-CBM (2010-10-21) 1 commit
 - diff: report bogus input to -C/-M/-B

* jk/missing-config (2010-10-21) 1 commit
 - config: treat non-existent config files as empty

* jn/fast-import-fix (2010-10-20) 4 commits
 - fast-import: do not clear notes in do_change_note_fanout()
 - t9300 (fast-import): another test for the "replace root" feature
 - fast-import: tighten M 040000 syntax
 - fast-import: filemodify after M 040000 <tree> "" crashes

* jn/git-cmd-h-bypass-setup (2010-10-22) 7 commits
 - update-index -h: show usage even with corrupt index
 - merge -h: show usage even with corrupt index
 - ls-files -h: show usage even with corrupt index
 - gc -h: show usage even with broken configuration
 - commit/status -h: show usage even with broken configuration
 - checkout-index -h: show usage even in an invalid repository
 - branch -h: show usage even in an invalid repository
 (this branch uses en/and-cascade-tests.)

* kb/blame-author-email (2010-10-15) 1 commit
 - blame: Add option to show author email instead of name

* kb/maint-diff-ws-check (2010-10-20) 2 commits
 - diff: handle lines containing only whitespace and tabs better
 - test-lib: extend test_decode_color to handle more color codes

* mg/make-prove (2010-10-14) 1 commit
 - test: allow running the tests under "prove"

* np/diff-in-corrupt-repository (2010-10-22) 1 commit
 - diff: don't presume empty file when corresponding object is missing

* np/pack-broken-boundary (2010-10-22) 1 commit
 - make pack-objects a bit more resilient to repo corruption

* tr/maint-git-repack-tmpfile (2010-10-19) 1 commit
 - repack: place temporary packs under .git/objects/pack/

* tr/maint-merge-file-subdir (2010-10-17) 2 commits
 - merge-file: correctly find files when called in subdir
 - prefix_filename(): safely handle the case where pfx_len=0

--------------------------------------------------
[Graduated to "master"]

* ab/require-perl-5.8 (2010-09-24) 2 commits
  (merged to 'next' on 2010-09-27 at 1fcdd3c)
 + perl: use "use warnings" instead of -w
 + perl: bump the required Perl version to 5.8 from 5.6.[21]

* ab/send-email-perl (2010-09-30) 16 commits
  (merged to 'next' on 2010-09-30 at cf8e58e)
 + send-email: extract_valid_address use qr// regexes
 + send-email: is_rfc2047_quoted use qr// regexes
 + send-email: use Perl idioms in while loop
 + send-email: make_message_id use "require" instead of "use"
 + send-email: send_message die on $!, not $?
 + send-email: use (?:) instead of () if no match variables are needed
 + send-email: sanitize_address use qq["foo"], not "\"foo\""
 + send-email: sanitize_address use $foo, not "$foo"
 + send-email: use \E***\Q instead of \*\*\*
 + send-email: cleanup_compose_files doesn't need a prototype
 + send-email: unique_email_list doesn't need a prototype
 + send-email: file_declares_8bit_cte doesn't need a prototype
 + send-email: get_patch_subject doesn't need a prototype
 + send-email: use lexical filehandles during sending
 + send-email: use lexical filehandles for $compose
 + send-email: use lexical filehandle for opendir

* as/daemon-multi-listen (2010-08-30) 2 commits
  (merged to 'next' on 2010-09-30 at 8083bf4)
 + daemon: allow more than one host address given via --listen
 + daemon: add helper function named_sock_setup

* dm/mergetool-vimdiff (2010-09-27) 3 commits
  (merged to 'next' on 2010-09-29 at c8e22ea)
 + mergetool-lib: make the three-way diff the default for vim/gvim
  (merged to 'next' on 2010-09-22 at 12f7559)
 + mergetool-lib: add a three-way diff view for vim/gvim
 + mergetool-lib: combine vimdiff and gvimdiff run blocks

* en/tree-walk-optim (2010-08-26) 4 commits
  (merged to 'next' on 2010-09-22 at 0601f1b)
 + diff_tree(): Skip skip_uninteresting() when all remaining paths interesting
 + tree_entry_interesting(): Make return value more specific
 + tree-walk: Correct bitrotted comment about tree_entry()
 + Document pre-condition for tree_entry_interesting

* jf/merge-ignore-ws (2010-08-26) 4 commits
  (merged to 'next' on 2010-09-22 at 5161fb8)
 + merge-recursive: options to ignore whitespace changes
 + merge-recursive --patience
 + ll-merge: replace flag argument with options struct
 + merge-recursive: expose merge options for builtin merge
 (this branch is used by kb/merge-recursive-rename-threshold.)

Possibly one of the star features of the coming release.

* jp/send-email-to-cmd (2010-09-24) 1 commit
  (merged to 'next' on 2010-09-30 at 4284ddb)
 + git-send-email.perl: Add --to-cmd

* kb/merge-recursive-rename-threshold (2010-09-27) 2 commits
  (merged to 'next' on 2010-09-30 at 4f33817)
 + diff: add synonyms for -M, -C, -B
 + merge-recursive: option to specify rename threshold
 (this branch uses jf/merge-ignore-ws.)

* kf/post-receive-sample-hook (2010-09-10) 1 commit
  (merged to 'next' on 2010-09-22 at db674a3)
 + post-receive-email: ensure sent messages are not empty

I notice that it uses "PAGER= generate_email" where generate_email is a
shell function, which may break in some implementations of POSIX /bin/sh.
This is not a regression (the original also had the same issue), but
somebody who cares enough might want to look into it.

* mg/fix-build-remote-helpers (2010-09-17) 1 commit
  (merged to 'next' on 2010-09-30 at 0583d5f)
 + remote-helpers: build in platform independent directory

* ml/completion-zsh (2010-09-06) 1 commit
  (merged to 'next' on 2010-09-22 at d62d10e)
 + completion: make compatible with zsh

Reported as breaking people with "set -u".

* po/sendemail (2010-09-06) 3 commits
  (merged to 'next' on 2010-09-22 at 1105f62)
 + New send-email option smtpserveroption.
 + Remove @smtp_host_parts variable as not used.
 + Minor indentation fix.

* sb/send-email-use-to-from-input (2010-10-04) 2 commits
  (merged to 'next' on 2010-10-06 at 5e9cb61)
 + send-email: Don't leak To: headers between patches
  (merged to 'next' on 2010-09-30 at 513b6f1)
 + send-email: Use To: headers in patch files

* sn/doc-opt-notation (2010-10-08) 6 commits
  (merged to 'next' on 2010-10-13 at 53ea256)
 + Fix {update,checkout}-index usage strings
 + Put a space between `<' and argument in pack-objects usage string
 + Remove stray quotes in --pretty and --format documentation
 + Use parentheses and `...' where appropriate
 + Fix odd markup in --diff-filter documentation
 + Use angles for placeholders consistently

--------------------------------------------------
[Stalled]

* yd/dir-rename (2010-10-15) 5 commits
 . Allow hiding renames of individual files involved in a directory rename.
 . Consider all parents of a file as candidates for bulk rename.
 . Handle the simpler case of a subdir invalidating bulk move.
 . Add testcases for the --detect-bulk-moves diffcore flag.
 . Introduce bulk-move detection in diffcore.

Need to replace this with a rerolled one posted recently.

* nd/index-doc (2010-09-06) 1 commit
 - doc: technical details about the index file format

Half-written but it is a good start.  I may need to give some help in
describing more recent index extensions.

* cb/ignored-paths-are-precious (2010-08-21) 1 commit
 - checkout/merge: optionally fail operation when ignored files need to be overwritten

This needs tests; also we know of longstanding bugs in related area that
needs to be addressed---they do not have to be part of this series but
their reproduction recipe would belong to the test script for this topic.

It would hurt users to make the new feature on by default, especially the
ones with subdirectories that come and go.

* jk/tag-contains (2010-07-05) 4 commits
 - Why is "git tag --contains" so slow?
 - default core.clockskew variable to one day
 - limit "contains" traversals based on commit timestamp
 - tag: speed up --contains calculation

The idea of the bottom one is probably Ok, except that the use of object
flags needs to be rethought, or at least the helper needs to be moved to
builtin/tag.c to make it clear that it should not be used outside the
current usage context.

--------------------------------------------------
[Cooking]

* cb/diff-fname-optim (2010-09-26) 3 commits
 - diff: avoid repeated scanning while looking for funcname
 - do not search functions for patch ID
 - add rebase patch id tests

* en/merge-recursive (2010-10-21) 39 commits
 - merge-recursive:make_room_for_directories - work around dumb compilers
 - merge-recursive: Remove redundant path clearing for D/F conflicts
 - merge-recursive: Make room for directories in D/F conflicts
 - handle_delete_modify(): Check whether D/F conflicts are still present
 - merge_content(): Check whether D/F conflicts are still present
 - conflict_rename_rename_1to2(): Fix checks for presence of D/F conflicts
 - conflict_rename_delete(): Check whether D/F conflicts are still present
 - merge-recursive: Delay modify/delete conflicts if D/F conflict present
 - merge-recursive: Delay content merging for renames
 - merge-recursive: Delay handling of rename/delete conflicts
 - merge-recursive: Move handling of double rename of one file to other file
 - merge-recursive: Move handling of double rename of one file to two
 - merge-recursive: Avoid doubly merging rename/add conflict contents
 - merge-recursive: Update merge_content() call signature
 - merge-recursive: Update conflict_rename_rename_1to2() call signature
 - merge-recursive: Structure process_df_entry() to handle more cases
 - merge-recursive: Have process_entry() skip D/F or rename entries
 - merge-recursive: New function to assist resolving renames in-core only
 - merge-recursive: New data structures for deferring of D/F conflicts
 - merge-recursive: Move process_entry's content merging into a function
 - merge-recursive: Move delete/modify handling into dedicated function
 - merge-recursive: Move rename/delete handling into dedicated function
 - merge-recursive: Nuke rename/directory conflict detection
 - merge-recursive: Rename conflict_rename_rename*() for clarity
 - merge-recursive: Small code clarification -- variable name and comments
 - t6036: Add testcase for undetected conflict
 - t6036: Add a second testcase similar to the first but with content changes
 - t6036: Test index and worktree state, not just that merge fails
 - t6020: Add a testcase for modify/delete + directory/file conflict
 - t6020: Modernize style a bit
 - t6022: Add tests for rename/rename combined with D/F conflicts
 - t6022: Add paired rename+D/F conflict: (two/file, one/file) -> (one, two)
 - t6022: Add tests with both rename source & dest involved in D/F conflicts
 - t6022: Add tests for reversing order of merges when D/F conflicts present
 - t6022: Add test combinations of {content conflict?, D/F conflict remains?}
 - t6032: Add a test checking for excessive output from merge
 - merge-recursive: Restructure showing how to chain more process_* functions
 - t3030: Add a testcase for resolvable rename/add conflict with symlinks
 - Merge branch 'en/rename-d-f' into en/merge-recursive
 (this branch uses en/rename-d-f.)

* il/remote-fd-ext (2010-10-12) 3 commits
 - git-remote-ext
 - git-remote-fd
 - Add bidirectional_transfer_loop()

* jn/gitweb-test (2010-09-26) 4 commits
 - gitweb/Makefile: Include gitweb/config.mak
 - gitweb/Makefile: Add 'test' and 'test-installed' targets
 - t/gitweb-lib.sh: Add support for GITWEB_TEST_INSTALLED
 - gitweb: Move call to evaluate_git_version after evaluate_gitweb_config

* ak/apply-non-git-epoch (2010-09-29) 1 commit
 - apply: Recognize epoch timestamps with : in the timezone

* ak/submodule-sync (2010-10-08) 1 commit
 - submodule sync: Update "submodule.<name>.url" for empty directories

* cb/leading-path-removal (2010-10-09) 5 commits
 - do not overwrite files in leading path
 - lstat_cache: optionally return match_len
 - add function check_ok_to_remove()
 - t7607: add leading-path tests
 - t7607: use test-lib functions and check MERGE_HEAD

* jh/notes-merge (2010-10-21) 21 commits
 - Provide 'git notes get-ref' to easily retrieve current notes ref
 - git notes merge: Add testcases for merging notes trees at different fanouts
 - git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"
 - git notes merge: --commit should fail if underlying notes ref has moved
 - git notes merge: List conflicting notes in notes merge commit message
 - git notes merge: Manual conflict resolution, part 2/2
 - git notes merge: Manual conflict resolution, part 1/2
 - Documentation: Preliminary docs on 'git notes merge'
 - git notes merge: Add automatic conflict resolvers (ours, theirs, union)
 - git notes merge: Handle real, non-conflicting notes merges
 - builtin/notes.c: Refactor creation of notes commits.
 - git notes merge: Initial implementation handling trivial merges only
 - builtin/notes.c: Split notes ref DWIMmery into a separate function
 - notes.c: Use two newlines (instead of one) when concatenating notes
 - (trivial) t3303: Indent with tabs instead of spaces for consistency
 - notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond
 - notes.h/c: Clarify the handling of notes objects that are == null_sha1
 - notes.c: Reorder functions in preparation for next commit
 - notes.h: Make default_notes_ref() available in notes API
 - (trivial) notes.h: Minor documentation fixes to copy_notes()
 - notes.c: Hexify SHA1 in die() message from init_notes()

* jk/maint-rev-list-nul (2010-10-07) 1 commit
 - rev-list: handle %x00 NUL in user format

* jk/push-progress (2010-10-17) 8 commits
 - push: pass --progress down to git-pack-objects
 - t5523-push-upstream: test progress messages
 - t5523-push-upstream: add function to ensure fresh upstream repo
 - test_terminal: ensure redirections work reliably
 - test_terminal: catch use without TTY prerequisite
 - test-lib: allow test code to check the list of declared prerequisites
 - tests: test terminal output to both stdout and stderr
 - tests: factor out terminal handling from t7006

* jm/mailmap (2010-10-19) 3 commits
 - t4203: do not let "git shortlog" DWIM based on tty
 - t4203 (mailmap): stop hardcoding commit ids and dates
 - mailmap: fix use of freed memory

The new test seems to make t4203 break intermittently.

* jn/send-pack-error (2010-10-16) 1 commit
 - send-pack: avoid redundant "pack-objects died with strange error"

* kb/completion-checkout (2010-10-12) 1 commit
 - completion: Support the DWIM mode for git checkout

* pn/commit-autosquash (2010-10-07) 8 commits
 - add tests of commit --squash
 - commit: --squash option for use with rebase --autosquash
 - add tests of commit --fixup
 - commit: --fixup option for use with rebase --autosquash
 - pretty.c: teach format_commit_message() to reencode the output
 - pretty.c: helper methods for getting output encodings
 - commit.c: new function for looking up a comit by name
 - commit.c: prefer get_header() to manual searching

* sg/bisect (2010-10-10) 3 commits
 - bisect: check for mandatory argument of 'bisect replay'
 - bisect: improve error msg of 'bisect reset' when original HEAD is deleted
 - bisect: improve error message of 'bisect log' while not bisecting

* sg/completion (2010-10-11) 4 commits
 - bash: support pretty format aliases
 - bash: support more 'git notes' subcommands and their options
 - bash: not all 'git bisect' subcommands make sense when not bisecting
 - bash: offer refs for 'git bisect start'

* jj/icase-directory (2010-10-03) 8 commits
 - Support case folding in git fast-import when core.ignorecase=true
 - Support case folding for git add when core.ignorecase=true
 - Add case insensitivity support when using git ls-files
 - Add case insensitivity support for directories when using git status
 - Case insensitivity support for .gitignore via core.ignorecase
 - Add string comparison functions that respect the ignore_case variable.
 - Makefile & configure: add a NO_FNMATCH_CASEFOLD flag
 - Makefile & configure: add a NO_FNMATCH flag

* en/and-cascade-tests (2010-10-03) 13 commits
 - Introduce sane_unset and use it to ensure proper && chaining
 - t7800 (difftool): add missing &&
 - t7601 (merge-pull-config): add missing &&
 - t7001 (mv): add missing &&
 - t6016 (rev-list-graph-simplify-history): add missing &&
 - t5602 (clone-remote-exec): add missing &&
 - t4026 (color): remove unneeded and unchained command
 - t4019 (diff-wserror): add lots of missing &&
 - t4202 (log): Replace '<git-command> || :' with test_might_fail
 - t4002 (diff-basic): use test_might_fail for commands that might fail
 - t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
 - t4017 (diff-retval): replace manual exit code check with test_expect_code
 - test-lib: make test_expect_code a test command
 (this branch is used by jn/git-cmd-h-bypass-setup.)

* jk/no-textconv-symlink (2010-09-21) 1 commit
 - diff: don't use pathname-based diff drivers for symlinks
 (this branch is used by ks/no-textconv-symlink.)

* ks/no-textconv-symlink (2010-09-29) 3 commits
 - blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
 - blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks
 - blame,cat-file: Prepare --textconv tests for correctly-failing conversion program
 (this branch uses jk/no-textconv-symlink.)

* nd/struct-pathspec (2010-09-20) 5 commits
 - ce_path_match: drop prefix matching in favor of match_pathspec
 - Convert ce_path_match() to use struct pathspec
 - tree_entry_interesting: turn to match_pathspec if wildcard is present
 - pathspec: add tree_recursive_diff parameter
 - pathspec: mark wildcard pathspecs from the beginning
 (this branch uses en/object-list-with-pathspec.)

* en/object-list-with-pathspec (2010-09-20) 8 commits
 - Add testcases showing how pathspecs are handled with rev-list --objects
 - Make rev-list --objects work together with pathspecs
 - Move tree_entry_interesting() to tree-walk.c and export it
 - tree_entry_interesting(): remove dependency on struct diff_options
 - Convert struct diff_options to use struct pathspec
 - pathspec: cache string length when initializing pathspec
 - diff-no-index: use diff_tree_setup_paths()
 - Add struct pathspec
 (this branch is used by nd/struct-pathspec.)

* tc/smart-http-post-redirect (2010-09-25) 1 commit
 - smart-http: Don't change POST to GET when following redirect

* en/rename-d-f (2010-09-08) 2 commits
 - merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir
 - t3509: Add rename + D/F conflict testcase that recursive strategy fails
 (this branch is used by en/merge-recursive.)

* jl/fetch-submodule-recursive (2010-09-19) 4 commits
 - fetch: Get submodule paths from index and not from .gitmodules
 - fetch: Fix a bug swallowing the output of recursive submodule fetching
 - Submodules: Add the new "fetch" config option for fetch and pull
 - fetch/pull: Recursively fetch populated submodules

I haven't picked up the rerolled one yet.

* tr/merge-unborn-clobber (2010-08-22) 1 commit
 - Exhibit merge bug that clobbers index&WT

* ab/i18n (2010-09-12) 160 commits
 - po/sv.po: add Swedish translation
 - gettextize: git-bisect bisect_next_check "You need to" message
 - gettextize: git-bisect [Y/n] messages
 - gettextize: git-bisect bisect_replay + $1 messages
 - gettextize: git-bisect bisect_reset + $1 messages
 - gettextize: git-bisect bisect_run + $@ messages
 - gettextize: git-bisect die + eval_gettext messages
 - gettextize: git-bisect die + gettext messages
 - gettextize: git-bisect echo + eval_gettext message
 - gettextize: git-bisect echo + gettext messages
 - gettextize: git-bisect gettext + echo message
 - gettextize: git-bisect add git-sh-i18n
 - gettextize: git-stash drop_stash say/die messages
 - gettextize: git-stash "unknown option" message
 - gettextize: git-stash die + eval_gettext $1 messages
 - gettextize: git-stash die + eval_gettext $* messages
 - gettextize: git-stash die + eval_gettext messages
 - gettextize: git-stash die + gettext messages
 - gettextize: git-stash say + gettext messages
 - gettextize: git-stash echo + gettext message
 - gettextize: git-stash add git-sh-i18n
 - gettextize: git-submodule "blob" and "submodule" messages
 - gettextize: git-submodule "path not initialized" message
 - gettextize: git-submodule "[...] path is ignored" message
 - gettextize: git-submodule "Entering [...]" message
 - gettextize: git-submodule $errmsg messages
 - gettextize: git-submodule "Submodule change[...]" messages
 - gettextize: git-submodule "cached cannot be used" message
 - gettextize: git-submodule $update_module say + die messages
 - gettextize: git-submodule die + eval_gettext messages
 - gettextize: git-submodule say + eval_gettext messages
 - gettextize: git-submodule echo + eval_gettext messages
 - gettextize: git-submodule add git-sh-i18n
 - gettextize: git-pull "rebase against" / "merge with" messages
 - gettextize: git-pull "[...] not currently on a branch" message
 - gettextize: git-pull "You asked to pull" message
 - gettextize: git-pull split up "no candidate" message
 - gettextize: git-pull eval_gettext + warning message
 - gettextize: git-pull eval_gettext + die message
 - gettextize: git-pull die messages
 - gettextize: git-pull add git-sh-i18n
 - gettext docs: add "Testing marked strings" section to po/README
 - gettext docs: the Git::I18N Perl interface
 - gettext docs: the git-sh-i18n.sh Shell interface
 - gettext docs: the gettext.h C interface
 - gettext docs: add "Marking strings for translation" section in po/README
 - gettext docs: add a "Testing your changes" section to po/README
 - po/pl.po: add Polish translation
 - po/hi.po: add Hindi Translation
 - po/en_GB.po: add British English translation
 - po/de.po: add German translation
 - Makefile: only add gettext tests on XGETTEXT_INCLUDE_TESTS=YesPlease
 - gettext docs: add po/README file documenting Git's gettext
 - gettextize: git-am printf(1) message to eval_gettext
 - gettextize: git-am core say messages
 - gettextize: git-am "Apply?" message
 - gettextize: git-am clean_abort messages
 - gettextize: git-am cannot_fallback messages
 - gettextize: git-am die messages
 - gettextize: git-am eval_gettext messages
 - gettextize: git-am multi-line getttext $msg; echo
 - gettextize: git-am one-line gettext $msg; echo
 - gettextize: git-am add git-sh-i18n
 - gettext tests: add GETTEXT_POISON tests for shell scripts
 - gettext tests: add GETTEXT_POISON support for shell scripts
 - Makefile: MSGFMT="msgfmt --check" under GNU_GETTEXT
 - Makefile: add GNU_GETTEXT, set when we expect GNU gettext
 - gettextize: git-shortlog basic messages
 - gettextize: git-revert split up "could not revert/apply" message
 - gettextize: git-revert literal "me" messages
 - gettextize: git-revert "Your local changes" message
 - gettextize: git-revert basic messages
 - gettextize: git-notes "Refusing to %s notes in %s" message
 - gettextize: git-notes GIT_NOTES_REWRITE_MODE error message
 - gettextize: git-notes basic commands
 - gettextize: git-gc "Auto packing the repository" message
 - gettextize: git-gc basic messages
 - gettextize: git-describe basic messages
 - gettextize: git-clean clean.requireForce messages
 - gettextize: git-clean basic messages
 - gettextize: git-bundle basic messages
 - gettextize: git-archive basic messages
 - gettextize: git-status "renamed: " message
 - gettextize: git-status "Initial commit" message
 - gettextize: git-status "Changes to be committed" message
 - gettextize: git-status shortstatus messages
 - gettextize: git-status "nothing to commit" messages
 - gettextize: git-status basic messages
 - gettextize: git-push "prevent you from losing" message
 - gettextize: git-push basic messages
 - gettextize: git-tag tag_template message
 - gettextize: git-tag basic messages
 - gettextize: git-reset "Unstaged changes after reset" message
 - gettextize: git-reset reset_type_names messages
 - gettextize: git-reset basic messages
 - gettextize: git-rm basic messages
 - gettextize: git-mv "bad" messages
 - gettextize: git-mv basic messages
 - gettextize: git-merge "Wonderful" message
 - gettextize: git-merge "You have not concluded your merge" messages
 - gettextize: git-merge "Updating %s..%s" message
 - gettextize: git-merge basic messages
 - gettextize: git-log "--OPT does not make sense" messages
 - gettextize: git-log basic messages
 - gettextize: git-grep "--open-files-in-pager" message
 - gettextize: git-grep basic messages
 - gettextize: git-fetch split up "(non-fast-forward)" message
 - gettextize: git-fetch update_local_ref messages
 - gettextize: git-fetch formatting messages
 - gettextize: git-fetch basic messages
 - gettextize: git-diff basic messages
 - gettextize: git-commit advice messages
 - gettextize: git-commit "enter the commit message" message
 - gettextize: git-commit print_summary messages
 - gettextize: git-commit formatting messages
 - gettextize: git-commit "middle of a merge" message
 - gettextize: git-commit basic messages
 - gettextize: git-checkout "Switched to a .. branch" message
 - gettextize: git-checkout "HEAD is now at" message
 - gettextize: git-checkout describe_detached_head messages
 - gettextize: git-checkout: our/their version message
 - gettextize: git-checkout basic messages
 - gettextize: git-branch "(no branch)" message
 - gettextize: git-branch "git branch -v" messages
 - gettextize: git-branch "Deleted branch [...]" message
 - gettextize: git-branch "remote branch '%s' not found" message
 - gettextize: git-branch basic messages
 - gettextize: git-add refresh_index message
 - gettextize: git-add "remove '%s'" message
 - gettextize: git-add "pathspec [...] did not match" message
 - gettextize: git-add "Use -f if you really want" message
 - gettextize: git-add "no files added" message
 - gettextize: git-add basic messages
 - gettextize: git-clone "Cloning into" message
 - gettextize: git-clone basic messages
 - gettext tests: test message re-encoding under C
 - po/is.po: add Icelandic translation
 - gettext tests: mark a test message as not needing translation
 - gettext tests: test re-encoding with a UTF-8 msgid under Shell
 - gettext tests: test message re-encoding under Shell
 - gettext tests: add detection for is_IS.ISO-8859-1 locale
 - gettext tests: test if $VERSION exists before using it
 - gettextize: git-init "Initialized [...] repository" message
 - gettextize: git-init basic messages
 - gettext tests: skip lib-gettext.sh tests under GETTEXT_POISON
 - gettext tests: add GETTEXT_POISON=YesPlease Makefile parameter
 - gettext.c: use libcharset.h instead of langinfo.h when available
 - gettext.c: work around us not using setlocale(LC_CTYPE, "")
 - builtin.h: Include gettext.h
 - Makefile: use variables and shorter lines for xgettext
 - Makefile: tell xgettext(1) that our source is in UTF-8
 - Makefile: provide a --msgid-bugs-address to xgettext(1)
 - Makefile: A variable for options used by xgettext(1) calls
 - gettext tests: locate i18n lib&data correctly under --valgrind
 - gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions
 - gettext tests: rename test to work around GNU gettext bug
 - gettext: add infrastructure for translating Git with gettext
 - builtin: use builtin.h for all builtin commands
 - tests: use test_cmp instead of piping to diff(1)
 - t7004-tag.sh: re-arrange git tag comment for clarity

^ permalink raw reply	[relevance 1%]

* What's cooking in git.git (Oct 2010, #01; Wed, 13)
@ 2010-10-14  4:46  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2010-10-14  4:46 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with '-' are
only in 'pu' while commits prefixed with '+' are in 'next'.  The ones
marked with '.' do not appear in any of the integration branches, but I am
still holding onto them.

--------------------------------------------------
[Graduated to "master"]

* ab/makefile-track-cc (2010-09-12) 1 commit
  (merged to 'next' on 2010-09-27 at 51daee0)
 + Makefile: add CC to TRACK_CFLAGS

* bc/fix-cherry-pick-root (2010-09-27) 1 commit
  (merged to 'next' on 2010-09-27 at e27f4c9)
 + builtin/revert.c: don't dereference a NULL pointer

* cw/gitweb-hilite-config (2010-09-21) 1 commit
  (merged to 'next' on 2010-09-27 at dd234ba)
 + Enable highlight executable path as a configuration option

* jk/repack-reuse-object (2010-09-27) 2 commits
  (merged to 'next' on 2010-09-27 at 5719f72)
 + Documentation: pack.compression: explain how to recompress
 + repack: add -F flag to let user choose between --no-reuse-delta/object

* mg/reset-doc (2010-09-15) 6 commits
  (merged to 'next' on 2010-09-22 at 2a10b71)
 + git-reset.txt: make modes description more consistent
 + git-reset.txt: point to git-checkout
 + git-reset.txt: use "working tree" consistently
 + git-reset.txt: reset --soft is not a no-op
 + git-reset.txt: reset does not change files in target
 + git-reset.txt: clarify branch vs. branch head

* uk/fix-author-ident-sed-script (2010-09-23) 1 commit
  (merged to 'next' on 2010-09-27 at 5ad7d90)
 + get_author_ident_from_commit(): remove useless quoting

--------------------------------------------------
[New Topics]

* ab/send-email-perl (2010-09-30) 16 commits
  (merged to 'next' on 2010-09-30 at cf8e58e)
 + send-email: extract_valid_address use qr// regexes
 + send-email: is_rfc2047_quoted use qr// regexes
 + send-email: use Perl idioms in while loop
 + send-email: make_message_id use "require" instead of "use"
 + send-email: send_message die on $!, not $?
 + send-email: use (?:) instead of () if no match variables are needed
 + send-email: sanitize_address use qq["foo"], not "\"foo\""
 + send-email: sanitize_address use $foo, not "$foo"
 + send-email: use \E***\Q instead of \*\*\*
 + send-email: cleanup_compose_files doesn't need a prototype
 + send-email: unique_email_list doesn't need a prototype
 + send-email: file_declares_8bit_cte doesn't need a prototype
 + send-email: get_patch_subject doesn't need a prototype
 + send-email: use lexical filehandles during sending
 + send-email: use lexical filehandles for $compose
 + send-email: use lexical filehandle for opendir

* cb/diff-fname-optim (2010-09-26) 3 commits
 - diff: avoid repeated scanning while looking for funcname
 - do not search functions for patch ID
 - add rebase patch id tests

* en/merge-recursive (2010-09-20) 38 commits
 - merge-recursive: Remove redundant path clearing for D/F conflicts
 - merge-recursive: Make room for directories in D/F conflicts
 - handle_delete_modify(): Check whether D/F conflicts are still present
 - merge_content(): Check whether D/F conflicts are still present
 - conflict_rename_rename_1to2(): Fix checks for presence of D/F conflicts
 - conflict_rename_delete(): Check whether D/F conflicts are still present
 - merge-recursive: Delay modify/delete conflicts if D/F conflict present
 - merge-recursive: Delay content merging for renames
 - merge-recursive: Delay handling of rename/delete conflicts
 - merge-recursive: Move handling of double rename of one file to other file
 - merge-recursive: Move handling of double rename of one file to two
 - merge-recursive: Avoid doubly merging rename/add conflict contents
 - merge-recursive: Update merge_content() call signature
 - merge-recursive: Update conflict_rename_rename_1to2() call signature
 - merge-recursive: Structure process_df_entry() to handle more cases
 - merge-recursive: Have process_entry() skip D/F or rename entries
 - merge-recursive: New function to assist resolving renames in-core only
 - merge-recursive: New data structures for deferring of D/F conflicts
 - merge-recursive: Move process_entry's content merging into a function
 - merge-recursive: Move delete/modify handling into dedicated function
 - merge-recursive: Move rename/delete handling into dedicated function
 - merge-recursive: Nuke rename/directory conflict detection
 - merge-recursive: Rename conflict_rename_rename*() for clarity
 - merge-recursive: Small code clarification -- variable name and comments
 - t6036: Add testcase for undetected conflict
 - t6036: Add a second testcase similar to the first but with content changes
 - t6036: Test index and worktree state, not just that merge fails
 - t6020: Add a testcase for modify/delete + directory/file conflict
 - t6020: Modernize style a bit
 - t6022: Add tests for rename/rename combined with D/F conflicts
 - t6022: Add paired rename+D/F conflict: (two/file, one/file) -> (one, two)
 - t6022: Add tests with both rename source & dest involved in D/F conflicts
 - t6022: Add tests for reversing order of merges when D/F conflicts present
 - t6022: Add test combinations of {content conflict?, D/F conflict remains?}
 - t6032: Add a test checking for excessive output from merge
 - merge-recursive: Restructure showing how to chain more process_* functions
 - t3030: Add a testcase for resolvable rename/add conflict with symlinks
 - Merge branch 'en/rename-d-f' into en/merge-recursive
 (this branch uses en/rename-d-f.)

* il/remote-fd-ext (2010-10-12) 3 commits
 - git-remote-ext
 - git-remote-fd
 - Add bidirectional_transfer_loop()

* jn/gitweb-test (2010-09-26) 4 commits
 - gitweb/Makefile: Include gitweb/config.mak
 - gitweb/Makefile: Add 'test' and 'test-installed' targets
 - t/gitweb-lib.sh: Add support for GITWEB_TEST_INSTALLED
 - gitweb: Move call to evaluate_git_version after evaluate_gitweb_config

* ak/apply-non-git-epoch (2010-09-29) 1 commit
 - apply: Recognize epoch timestamps with : in the timezone

* ak/submodule-sync (2010-10-08) 1 commit
 - submodule sync: Update "submodule.<name>.url" for empty directories

* cb/leading-path-removal (2010-10-09) 5 commits
 - do not overwrite files in leading path
 - lstat_cache: optionally return match_len
 - add function check_ok_to_remove()
 - t7607: add leading-path tests
 - t7607: use test-lib functions and check MERGE_HEAD

* jh/notes-merge (2010-10-09) 21 commits
 - Provide 'git notes get-ref' to easily retrieve current notes ref
 - git notes merge: Add testcases for merging notes trees at different fanouts
 - git notes merge: Add another auto-resolving strategy: "cat_sort_uniq"
 - git notes merge: --commit should fail if underlying notes ref has moved
 - git notes merge: List conflicting notes in notes merge commit message
 - git notes merge: Manual conflict resolution, part 2/2
 - git notes merge: Manual conflict resolution, part 1/2
 - Documentation: Preliminary docs on 'git notes merge'
 - git notes merge: Add automatic conflict resolvers (ours, theirs, union)
 - git notes merge: Handle real, non-conflicting notes merges
 - builtin/notes.c: Refactor creation of notes commits.
 - git notes merge: Initial implementation handling trivial merges only
 - builtin/notes.c: Split notes ref DWIMmery into a separate function
 - notes.c: Use two newlines (instead of one) when concatenating notes
 - (trivial) t3303: Indent with tabs instead of spaces for consistency
 - notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond
 - notes.h/c: Clarify the handling of notes objects that are == null_sha1
 - notes.c: Reorder functions in preparation for next commit
 - notes.h: Make default_notes_ref() available in notes API
 - (trivial) notes.h: Minor documentation fixes to copy_notes()
 - notes.c: Hexify SHA1 in die() message from init_notes()

Breaks build with arithmetic on (void *).

* jk/maint-rev-list-nul (2010-10-07) 1 commit
 - rev-list: handle %x00 NUL in user format

* jk/push-progress (2010-10-14) 2 commits
 - push: pass --progress down to git-pack-objects
 - t5523-push-upstream: test progress messages

* jm/mailmap (2010-10-11) 1 commit
 - mailmap: fix use of freed memory

The new test seems to make t4203 break intermittently.

* jn/send-pack-error (2010-10-12) 1 commit
 - send-pack: avoid redundant "pack-objects died with strange error"

* kb/completion-checkout (2010-10-12) 1 commit
 - completion: Support the DWIM mode for git checkout

* pn/commit-autosquash (2010-10-07) 8 commits
 - add tests of commit --squash
 - commit: --squash option for use with rebase --autosquash
 - add tests of commit --fixup
 - commit: --fixup option for use with rebase --autosquash
 - pretty.c: teach format_commit_message() to reencode the output
 - pretty.c: helper methods for getting output encodings
 - commit.c: new function for looking up a comit by name
 - commit.c: prefer get_header() to manual searching

* sg/bisect (2010-10-10) 3 commits
 - bisect: check for mandatory argument of 'bisect replay'
 - bisect: improve error msg of 'bisect reset' when original HEAD is deleted
 - bisect: improve error message of 'bisect log' while not bisecting

* sg/completion (2010-10-11) 4 commits
 - bash: support pretty format aliases
 - bash: support more 'git notes' subcommands and their options
 - bash: not all 'git bisect' subcommands make sense when not bisecting
 - bash: offer refs for 'git bisect start'

* sn/doc-opt-notation (2010-10-08) 6 commits
  (merged to 'next' on 2010-10-13 at 53ea256)
 + Fix {update,checkout}-index usage strings
 + Put a space between `<' and argument in pack-objects usage string
 + Remove stray quotes in --pretty and --format documentation
 + Use parentheses and `...' where appropriate
 + Fix odd markup in --diff-filter documentation
 + Use angles for placeholders consistently

* yd/dir-rename (2010-10-10) 5 commits
 - diff --check: correct line numbers of new blank lines at EOF
 - Transfer special display of toplevel dir to display-time.
 - Only show bulkmoves in output.
 - Add testcases for the --detect-bulk-moves diffcore flag.
 - Introduce bulk-move detection in diffcore.

This seems to break the build with decl-after-stmt.

--------------------------------------------------
[Stalled]

* nd/index-doc (2010-09-06) 1 commit
 - doc: technical details about the index file format

Half-written but it is a good start.  I may need to give some help in
describing more recent index extensions.

* by/line-log (2010-09-11) 18 commits
 . log -L: do not free parents lists we might need again
 . Document line history browser
 . Add tests for line history browser
 . Add --full-line-diff option
 . Add --graph prefix before line history output
 . Add parent rewriting to line history browser
 . Make graph_next_line external to other part of git
 . Make rewrite_parents public to other part of git
 . Hook line history into cmd_log, ensuring a topo-ordered walk
 . Print the line log
 . map/take range to the parent of commits
 . Add range clone functions
 . Export three functions from diff.c
 . Parse the -L options
 . Refactor parse_loc
 . Add the basic data structure for line level history
 . parse-options: add two helper functions
 . parse-options: enhance STOP_AT_NON_OPTION

Temporarily ejected to give room to nd/struct-pathspec topic as this
conflicts with it.

* cb/ignored-paths-are-precious (2010-08-21) 1 commit
 - checkout/merge: optionally fail operation when ignored files need to be overwritten

This needs tests; also we know of longstanding bugs in related area that
needs to be addressed---they do not have to be part of this series but
their reproduction recipe would belong to the test script for this topic.

It would hurt users to make the new feature on by default, especially the
ones with subdirectories that come and go.

* jk/tag-contains (2010-07-05) 4 commits
 - Why is "git tag --contains" so slow?
 - default core.clockskew variable to one day
 - limit "contains" traversals based on commit timestamp
 - tag: speed up --contains calculation

The idea of the bottom one is probably Ok, except that the use of object
flags needs to be rethought, or at least the helper needs to be moved to
builtin/tag.c to make it clear that it should not be used outside the
current usage context.

--------------------------------------------------
[Cooking]

* jj/icase-directory (2010-10-03) 8 commits
 - Support case folding in git fast-import when core.ignorecase=true
 - Support case folding for git add when core.ignorecase=true
 - Add case insensitivity support when using git ls-files
 - Add case insensitivity support for directories when using git status
 - Case insensitivity support for .gitignore via core.ignorecase
 - Add string comparison functions that respect the ignore_case variable.
 - Makefile & configure: add a NO_FNMATCH_CASEFOLD flag
 - Makefile & configure: add a NO_FNMATCH flag

* ab/require-perl-5.8 (2010-09-24) 2 commits
  (merged to 'next' on 2010-09-27 at 1fcdd3c)
 + perl: use "use warnings" instead of -w
 + perl: bump the required Perl version to 5.8 from 5.6.[21]

* en/and-cascade-tests (2010-10-03) 13 commits
 - Introduce sane_unset and use it to ensure proper && chaining
 - t7800 (difftool): add missing &&
 - t7601 (merge-pull-config): add missing &&
 - t7001 (mv): add missing &&
 - t6016 (rev-list-graph-simplify-history): add missing &&
 - t5602 (clone-remote-exec): add missing &&
 - t4026 (color): remove unneeded and unchained command
 - t4019 (diff-wserror): add lots of missing &&
 - t4202 (log): Replace '<git-command> || :' with test_might_fail
 - t4002 (diff-basic): use test_might_fail for commands that might fail
 - t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
 - t4017 (diff-retval): replace manual exit code check with test_expect_code
 - test-lib: make test_expect_code a test command

Somewhat rerolled, but the largest one among the series was Nacked by a
few people and needs to be rerolled again.

* jk/no-textconv-symlink (2010-09-21) 1 commit
 - diff: don't use pathname-based diff drivers for symlinks
 (this branch is used by ks/no-textconv-symlink.)

* ks/no-textconv-symlink (2010-09-29) 3 commits
 - blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
 - blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks
 - blame,cat-file: Prepare --textconv tests for correctly-failing conversion program
 (this branch uses jk/no-textconv-symlink.)

* jp/send-email-to-cmd (2010-09-24) 1 commit
  (merged to 'next' on 2010-09-30 at 4284ddb)
 + git-send-email.perl: Add --to-cmd

* kb/merge-recursive-rename-threshold (2010-09-27) 2 commits
  (merged to 'next' on 2010-09-30 at 4f33817)
 + diff: add synonyms for -M, -C, -B
 + merge-recursive: option to specify rename threshold
 (this branch uses jf/merge-ignore-ws.)

* mg/fix-build-remote-helpers (2010-09-17) 1 commit
  (merged to 'next' on 2010-09-30 at 0583d5f)
 + remote-helpers: build in platform independent directory

* nd/struct-pathspec (2010-09-20) 5 commits
 - ce_path_match: drop prefix matching in favor of match_pathspec
 - Convert ce_path_match() to use struct pathspec
 - tree_entry_interesting: turn to match_pathspec if wildcard is present
 - pathspec: add tree_recursive_diff parameter
 - pathspec: mark wildcard pathspecs from the beginning
 (this branch uses en/object-list-with-pathspec.)

* en/object-list-with-pathspec (2010-09-20) 8 commits
 - Add testcases showing how pathspecs are handled with rev-list --objects
 - Make rev-list --objects work together with pathspecs
 - Move tree_entry_interesting() to tree-walk.c and export it
 - tree_entry_interesting(): remove dependency on struct diff_options
 - Convert struct diff_options to use struct pathspec
 - pathspec: cache string length when initializing pathspec
 - diff-no-index: use diff_tree_setup_paths()
 - Add struct pathspec
 (this branch is used by nd/struct-pathspec.)

* sb/send-email-use-to-from-input (2010-10-04) 2 commits
  (merged to 'next' on 2010-10-06 at 5e9cb61)
 + send-email: Don't leak To: headers between patches
  (merged to 'next' on 2010-09-30 at 513b6f1)
 + send-email: Use To: headers in patch files

* tc/smart-http-post-redirect (2010-09-25) 1 commit
 - smart-http: Don't change POST to GET when following redirect

* as/daemon-multi-listen (2010-08-30) 2 commits
  (merged to 'next' on 2010-09-30 at 8083bf4)
 + daemon: allow more than one host address given via --listen
 + daemon: add helper function named_sock_setup

* dm/mergetool-vimdiff (2010-09-27) 3 commits
  (merged to 'next' on 2010-09-29 at c8e22ea)
 + mergetool-lib: make the three-way diff the default for vim/gvim
  (merged to 'next' on 2010-09-22 at 12f7559)
 + mergetool-lib: add a three-way diff view for vim/gvim
 + mergetool-lib: combine vimdiff and gvimdiff run blocks

* en/rename-d-f (2010-09-08) 2 commits
 - merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir
 - t3509: Add rename + D/F conflict testcase that recursive strategy fails
 (this branch is used by en/merge-recursive.)

* kf/post-receive-sample-hook (2010-09-10) 1 commit
  (merged to 'next' on 2010-09-22 at db674a3)
 + post-receive-email: ensure sent messages are not empty

I notice that it uses "PAGER= generate_email" where generate_email is a
shell function, which may break in some implementations of POSIX /bin/sh.
This is not a regression (the original also had the same issue), but
somebody who cares enough might want to look into it.

* ml/completion-zsh (2010-09-06) 1 commit
  (merged to 'next' on 2010-09-22 at d62d10e)
 + completion: make compatible with zsh

Reported as breaking people with "set -u".

* po/sendemail (2010-09-06) 3 commits
  (merged to 'next' on 2010-09-22 at 1105f62)
 + New send-email option smtpserveroption.
 + Remove @smtp_host_parts variable as not used.
 + Minor indentation fix.

Will merge to 'master' shortly.

* jl/fetch-submodule-recursive (2010-09-19) 4 commits
 - fetch: Get submodule paths from index and not from .gitmodules
 - fetch: Fix a bug swallowing the output of recursive submodule fetching
 - Submodules: Add the new "fetch" config option for fetch and pull
 - fetch/pull: Recursively fetch populated submodules

I haven't picked up the rerolled one yet.

* jf/merge-ignore-ws (2010-08-26) 4 commits
  (merged to 'next' on 2010-09-22 at 5161fb8)
 + merge-recursive: options to ignore whitespace changes
 + merge-recursive --patience
 + ll-merge: replace flag argument with options struct
 + merge-recursive: expose merge options for builtin merge
 (this branch is used by kb/merge-recursive-rename-threshold.)

Possibly one of the star features of the coming release.

* tr/merge-unborn-clobber (2010-08-22) 1 commit
 - Exhibit merge bug that clobbers index&WT

* en/tree-walk-optim (2010-08-26) 4 commits
  (merged to 'next' on 2010-09-22 at 0601f1b)
 + diff_tree(): Skip skip_uninteresting() when all remaining paths interesting
 + tree_entry_interesting(): Make return value more specific
 + tree-walk: Correct bitrotted comment about tree_entry()
 + Document pre-condition for tree_entry_interesting

Will merge to 'master' shortly.

* ab/i18n (2010-09-12) 159 commits
 - po/sv.po: add Swedish translation
 - gettextize: git-bisect bisect_next_check "You need to" message
 - gettextize: git-bisect [Y/n] messages
 - gettextize: git-bisect bisect_replay + $1 messages
 - gettextize: git-bisect bisect_reset + $1 messages
 - gettextize: git-bisect bisect_run + $@ messages
 - gettextize: git-bisect die + eval_gettext messages
 - gettextize: git-bisect die + gettext messages
 - gettextize: git-bisect echo + eval_gettext message
 - gettextize: git-bisect echo + gettext messages
 - gettextize: git-bisect gettext + echo message
 - gettextize: git-bisect add git-sh-i18n
 - gettextize: git-stash drop_stash say/die messages
 - gettextize: git-stash "unknown option" message
 - gettextize: git-stash die + eval_gettext $1 messages
 - gettextize: git-stash die + eval_gettext $* messages
 - gettextize: git-stash die + eval_gettext messages
 - gettextize: git-stash die + gettext messages
 - gettextize: git-stash say + gettext messages
 - gettextize: git-stash echo + gettext message
 - gettextize: git-stash add git-sh-i18n
 - gettextize: git-submodule "blob" and "submodule" messages
 - gettextize: git-submodule "path not initialized" message
 - gettextize: git-submodule "[...] path is ignored" message
 - gettextize: git-submodule "Entering [...]" message
 - gettextize: git-submodule $errmsg messages
 - gettextize: git-submodule "Submodule change[...]" messages
 - gettextize: git-submodule "cached cannot be used" message
 - gettextize: git-submodule $update_module say + die messages
 - gettextize: git-submodule die + eval_gettext messages
 - gettextize: git-submodule say + eval_gettext messages
 - gettextize: git-submodule echo + eval_gettext messages
 - gettextize: git-submodule add git-sh-i18n
 - gettextize: git-pull "rebase against" / "merge with" messages
 - gettextize: git-pull "[...] not currently on a branch" message
 - gettextize: git-pull "You asked to pull" message
 - gettextize: git-pull split up "no candidate" message
 - gettextize: git-pull eval_gettext + warning message
 - gettextize: git-pull eval_gettext + die message
 - gettextize: git-pull die messages
 - gettextize: git-pull add git-sh-i18n
 - gettext docs: add "Testing marked strings" section to po/README
 - gettext docs: the Git::I18N Perl interface
 - gettext docs: the git-sh-i18n.sh Shell interface
 - gettext docs: the gettext.h C interface
 - gettext docs: add "Marking strings for translation" section in po/README
 - gettext docs: add a "Testing your changes" section to po/README
 - po/pl.po: add Polish translation
 - po/hi.po: add Hindi Translation
 - po/en_GB.po: add British English translation
 - po/de.po: add German translation
 - Makefile: only add gettext tests on XGETTEXT_INCLUDE_TESTS=YesPlease
 - gettext docs: add po/README file documenting Git's gettext
 - gettextize: git-am printf(1) message to eval_gettext
 - gettextize: git-am core say messages
 - gettextize: git-am "Apply?" message
 - gettextize: git-am clean_abort messages
 - gettextize: git-am cannot_fallback messages
 - gettextize: git-am die messages
 - gettextize: git-am eval_gettext messages
 - gettextize: git-am multi-line getttext $msg; echo
 - gettextize: git-am one-line gettext $msg; echo
 - gettextize: git-am add git-sh-i18n
 - gettext tests: add GETTEXT_POISON tests for shell scripts
 - gettext tests: add GETTEXT_POISON support for shell scripts
 - Makefile: MSGFMT="msgfmt --check" under GNU_GETTEXT
 - Makefile: add GNU_GETTEXT, set when we expect GNU gettext
 - gettextize: git-shortlog basic messages
 - gettextize: git-revert split up "could not revert/apply" message
 - gettextize: git-revert literal "me" messages
 - gettextize: git-revert "Your local changes" message
 - gettextize: git-revert basic messages
 - gettextize: git-notes "Refusing to %s notes in %s" message
 - gettextize: git-notes GIT_NOTES_REWRITE_MODE error message
 - gettextize: git-notes basic commands
 - gettextize: git-gc "Auto packing the repository" message
 - gettextize: git-gc basic messages
 - gettextize: git-describe basic messages
 - gettextize: git-clean clean.requireForce messages
 - gettextize: git-clean basic messages
 - gettextize: git-bundle basic messages
 - gettextize: git-archive basic messages
 - gettextize: git-status "renamed: " message
 - gettextize: git-status "Initial commit" message
 - gettextize: git-status "Changes to be committed" message
 - gettextize: git-status shortstatus messages
 - gettextize: git-status "nothing to commit" messages
 - gettextize: git-status basic messages
 - gettextize: git-push "prevent you from losing" message
 - gettextize: git-push basic messages
 - gettextize: git-tag tag_template message
 - gettextize: git-tag basic messages
 - gettextize: git-reset "Unstaged changes after reset" message
 - gettextize: git-reset reset_type_names messages
 - gettextize: git-reset basic messages
 - gettextize: git-rm basic messages
 - gettextize: git-mv "bad" messages
 - gettextize: git-mv basic messages
 - gettextize: git-merge "Wonderful" message
 - gettextize: git-merge "You have not concluded your merge" messages
 - gettextize: git-merge "Updating %s..%s" message
 - gettextize: git-merge basic messages
 - gettextize: git-log "--OPT does not make sense" messages
 - gettextize: git-log basic messages
 - gettextize: git-grep "--open-files-in-pager" message
 - gettextize: git-grep basic messages
 - gettextize: git-fetch split up "(non-fast-forward)" message
 - gettextize: git-fetch update_local_ref messages
 - gettextize: git-fetch formatting messages
 - gettextize: git-fetch basic messages
 - gettextize: git-diff basic messages
 - gettextize: git-commit advice messages
 - gettextize: git-commit "enter the commit message" message
 - gettextize: git-commit print_summary messages
 - gettextize: git-commit formatting messages
 - gettextize: git-commit "middle of a merge" message
 - gettextize: git-commit basic messages
 - gettextize: git-checkout "Switched to a .. branch" message
 - gettextize: git-checkout "HEAD is now at" message
 - gettextize: git-checkout describe_detached_head messages
 - gettextize: git-checkout: our/their version message
 - gettextize: git-checkout basic messages
 - gettextize: git-branch "(no branch)" message
 - gettextize: git-branch "git branch -v" messages
 - gettextize: git-branch "Deleted branch [...]" message
 - gettextize: git-branch "remote branch '%s' not found" message
 - gettextize: git-branch basic messages
 - gettextize: git-add refresh_index message
 - gettextize: git-add "remove '%s'" message
 - gettextize: git-add "pathspec [...] did not match" message
 - gettextize: git-add "Use -f if you really want" message
 - gettextize: git-add "no files added" message
 - gettextize: git-add basic messages
 - gettextize: git-clone "Cloning into" message
 - gettextize: git-clone basic messages
 - gettext tests: test message re-encoding under C
 - po/is.po: add Icelandic translation
 - gettext tests: mark a test message as not needing translation
 - gettext tests: test re-encoding with a UTF-8 msgid under Shell
 - gettext tests: test message re-encoding under Shell
 - gettext tests: add detection for is_IS.ISO-8859-1 locale
 - gettext tests: test if $VERSION exists before using it
 - gettextize: git-init "Initialized [...] repository" message
 - gettextize: git-init basic messages
 - gettext tests: skip lib-gettext.sh tests under GETTEXT_POISON
 - gettext tests: add GETTEXT_POISON=YesPlease Makefile parameter
 - gettext.c: work around us not using setlocale(LC_CTYPE, "")
 - builtin.h: Include gettext.h
 - Makefile: use variables and shorter lines for xgettext
 - Makefile: tell xgettext(1) that our source is in UTF-8
 - Makefile: provide a --msgid-bugs-address to xgettext(1)
 - Makefile: A variable for options used by xgettext(1) calls
 - gettext tests: locate i18n lib&data correctly under --valgrind
 - gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions
 - gettext tests: rename test to work around GNU gettext bug
 - gettext: add infrastructure for translating Git with gettext
 - builtin: use builtin.h for all builtin commands
 - tests: use test_cmp instead of piping to diff(1)
 - t7004-tag.sh: re-arrange git tag comment for clarity

^ permalink raw reply	[relevance 1%]

* [PATCHv6 12/16] t7001 (mv): add missing &&
  2010-10-03 19:59  4% [PATCHv6 00/16] Add missing &&'s in the testsuite Elijah Newren
@ 2010-10-03 20:00 21% ` Elijah Newren
    1 sibling, 0 replies; 200+ results
From: Elijah Newren @ 2010-10-03 20:00 UTC (permalink / raw)
  To: git; +Cc: gitster, avarab, jrnieder, Elijah Newren

Also, prefix an expected-to-fail git mv command with 'test_must_fail'.

Acked-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t7001-mv.sh |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 65a35d9..624e6d2 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -61,7 +61,7 @@ test_expect_success \
 test_expect_success \
     'checking -f on untracked file with existing target' \
     'touch path0/untracked1 &&
-     git mv -f untracked1 path0
+     test_must_fail git mv -f untracked1 path0 &&
      test ! -f .git/index.lock &&
      test -f untracked1 &&
      test -f path0/untracked1'
-- 
1.7.3.1.66.gab790

^ permalink raw reply related	[relevance 21%]

* [PATCHv6 00/16] Add missing &&'s in the testsuite
@ 2010-10-03 19:59  4% Elijah Newren
  2010-10-03 20:00 21% ` [PATCHv6 12/16] t7001 (mv): add missing && Elijah Newren
    0 siblings, 2 replies; 200+ results
From: Elijah Newren @ 2010-10-03 19:59 UTC (permalink / raw)
  To: git; +Cc: gitster, avarab, jrnieder, Elijah Newren

This patch series fixes many of the missing &&s in the testsuite.
Thanks to Junio, Jonathan, and Ævar for lots of time reviewing and
making suggestions so far.

Changes since v5:
  * Made changes suggested by Jonathan on v4.  Notable items remaining:
    * In patch 1, I made two of the changes suggested by Jonathan, but
      this was Ævar's patch so he may want to comment on those.  Also,
      Jonathan had a few extra questions in the last round that
      perhaps Ævar may want to comment on.
    * In patch 7 (t3600), there's still an outstanding question about
      what and how to change it.
    * In patch 15, (the t1509 test), Jonathan pointed out a potential
      problem, and I'm unsure whether the change I made is what is
      wanted.

Elijah Newren (15):
  t3020 (ls-files-error-unmatch): remove stray '1' from end of file
  t4017 (diff-retval): replace manual exit code check with
    test_expect_code
  t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
  t4002 (diff-basic): use test_might_fail for commands that might fail
  t4202 (log): Replace '<git-command> || :' with test_might_fail
  t3600 (rm): add lots of missing &&
  t4019 (diff-wserror): add lots of missing &&
  t4026 (color): remove unneeded and unchained command
  t5602 (clone-remote-exec): add missing &&
  t6016 (rev-list-graph-simplify-history): add missing &&
  t7001 (mv): add missing &&
  t7601 (merge-pull-config): add missing &&
  t7800 (difftool): add missing &&
  Add missing &&'s throughout the testsuite
  Introduce portable_unset and use it to ensure proper && chaining

Ævar Arnfjörð Bjarmason (1):
  test-lib: make test_expect_code a test command

 t/README                                    |   29 +++++------
 t/t0000-basic.sh                            |   55 +++++++++++++++++----
 t/t0001-init.sh                             |   30 ++++++------
 t/t0003-attributes.sh                       |   45 ++++++++---------
 t/t0020-crlf.sh                             |    2 +-
 t/t0024-crlf-archive.sh                     |    4 +-
 t/t0026-eol-config.sh                       |    2 +-
 t/t0050-filesystem.sh                       |    6 +-
 t/t1000-read-tree-m-3way.sh                 |    2 +-
 t/t1001-read-tree-m-2way.sh                 |   18 ++++----
 t/t1002-read-tree-m-u-2way.sh               |   10 ++--
 t/t1302-repo-version.sh                     |    2 +-
 t/t1401-symbolic-ref.sh                     |    2 +-
 t/t1402-check-ref-format.sh                 |    4 +-
 t/t1410-reflog.sh                           |    8 ++--
 t/t1501-worktree.sh                         |    2 +-
 t/t1504-ceiling-dirs.sh                     |    5 +-
 t/t1509-root-worktree.sh                    |    5 +-
 t/t2007-checkout-symlink.sh                 |    2 +-
 t/t2016-checkout-patch.sh                   |    2 +-
 t/t2050-git-dir-relative.sh                 |    4 +-
 t/t2103-update-index-ignore-missing.sh      |    2 +-
 t/t2200-add-update.sh                       |    2 +-
 t/t3001-ls-files-others-exclude.sh          |    2 +-
 t/t3020-ls-files-error-unmatch.sh           |    1 -
 t/t3050-subprojects-fetch.sh                |    4 +-
 t/t3203-branch-output.sh                    |    6 +-
 t/t3307-notes-man.sh                        |    2 +-
 t/t3406-rebase-message.sh                   |    6 +-
 t/t3408-rebase-multi-line.sh                |    2 +-
 t/t3504-cherry-pick-rerere.sh               |    4 +-
 t/t3600-rm.sh                               |   38 +++++++--------
 t/t3903-stash.sh                            |    4 +-
 t/t3904-stash-patch.sh                      |    2 +-
 t/t4002-diff-basic.sh                       |   12 ++--
 t/t4017-diff-retval.sh                      |   69 ++++++++-------------------
 t/t4019-diff-wserror.sh                     |   53 ++++++++++----------
 t/t4021-format-patch-numbered.sh            |    2 +-
 t/t4026-color.sh                            |    1 -
 t/t4027-diff-submodule.sh                   |    2 +-
 t/t4103-apply-binary.sh                     |    8 ++--
 t/t4104-apply-boundary.sh                   |    4 +-
 t/t4111-apply-subdir.sh                     |    4 +-
 t/t4119-apply-config.sh                     |    2 +-
 t/t4124-apply-ws-rule.sh                    |    4 +-
 t/t4127-apply-same-fn.sh                    |   18 ++++----
 t/t4130-apply-criss-cross-rename.sh         |    2 +-
 t/t4133-apply-filenames.sh                  |    6 +-
 t/t4150-am.sh                               |    2 +-
 t/t4202-log.sh                              |    2 +-
 t/t5300-pack-object.sh                      |    4 +-
 t/t5301-sliding-window.sh                   |    2 +-
 t/t5302-pack-index.sh                       |    2 +-
 t/t5500-fetch-pack.sh                       |    2 +-
 t/t5502-quickfetch.sh                       |    2 +-
 t/t5503-tagfollow.sh                        |    4 +-
 t/t5510-fetch.sh                            |    2 +-
 t/t5516-fetch-push.sh                       |   20 ++++----
 t/t5517-push-mirror.sh                      |   10 ++--
 t/t5519-push-alternates.sh                  |    2 +-
 t/t5531-deep-submodule-push.sh              |    2 +-
 t/t5541-http-push.sh                        |    2 +-
 t/t5550-http-fetch.sh                       |    6 +--
 t/t5601-clone.sh                            |    6 +-
 t/t5602-clone-remote-exec.sh                |   22 ++++++---
 t/t5701-clone-local.sh                      |    8 ++--
 t/t5705-clone-2gb.sh                        |    2 +-
 t/t6009-rev-list-parent.sh                  |    2 +-
 t/t6010-merge-base.sh                       |    2 +-
 t/t6016-rev-list-graph-simplify-history.sh  |   29 ++++-------
 t/t6020-merge-df.sh                         |    4 +-
 t/t6022-merge-rename.sh                     |    2 +-
 t/t6024-recursive-merge.sh                  |    2 +-
 t/t6030-bisect-porcelain.sh                 |    8 ++--
 t/t6040-tracking-info.sh                    |    2 +-
 t/t7001-mv.sh                               |    2 +-
 t/t7004-tag.sh                              |   14 +++---
 t/t7006-pager.sh                            |   10 ++--
 t/t7105-reset-patch.sh                      |    6 +-
 t/t7300-clean.sh                            |    8 ++--
 t/t7501-commit.sh                           |    2 +-
 t/t7502-commit.sh                           |    6 +-
 t/t7506-status-submodule.sh                 |    2 +-
 t/t7600-merge.sh                            |    2 +-
 t/t7601-merge-pull-config.sh                |   12 ++--
 t/t7610-mergetool.sh                        |    2 +-
 t/t7700-repack.sh                           |    2 +-
 t/t7800-difftool.sh                         |   12 ++--
 t/t8003-blame.sh                            |    6 +-
 t/t9122-git-svn-author.sh                   |    4 +-
 t/t9123-git-svn-rebuild-with-rewriteroot.sh |    2 +-
 t/t9134-git-svn-ignore-paths.sh             |    6 +-
 t/t9137-git-svn-dcommit-clobber-series.sh   |    2 +-
 t/t9138-git-svn-authors-prog.sh             |    6 +-
 t/t9146-git-svn-empty-dirs.sh               |    6 +-
 t/t9151-svn-mergeinfo.sh                    |   22 ++++----
 t/t9200-git-cvsexportcommit.sh              |    4 +-
 t/t9401-git-cvsserver-crlf.sh               |    2 +-
 t/t9600-cvsimport.sh                        |    2 +-
 t/test-lib.sh                               |   51 +++++++++++++-------
 100 files changed, 429 insertions(+), 418 deletions(-)

-- 
1.7.3.1.66.gab790

^ permalink raw reply	[relevance 4%]

* [PATCHv5 12/16] t7001 (mv): add missing &&
  2010-10-03  5:10  4% [PATCHv5 00/16] Add missing &&'s in the testsuite Elijah Newren
@ 2010-10-03  5:10 21% ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2010-10-03  5:10 UTC (permalink / raw)
  To: git; +Cc: gitster, avarab, jrnieder, Elijah Newren

Also, prefix an expected-to-fail git mv command with 'test_must_fail'.

Acked-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t7001-mv.sh |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 65a35d9..624e6d2 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -61,7 +61,7 @@ test_expect_success \
 test_expect_success \
     'checking -f on untracked file with existing target' \
     'touch path0/untracked1 &&
-     git mv -f untracked1 path0
+     test_must_fail git mv -f untracked1 path0 &&
      test ! -f .git/index.lock &&
      test -f untracked1 &&
      test -f path0/untracked1'
-- 
1.7.3.1.66.gab790

^ permalink raw reply related	[relevance 21%]

* [PATCHv5 00/16] Add missing &&'s in the testsuite
@ 2010-10-03  5:10  4% Elijah Newren
  2010-10-03  5:10 21% ` [PATCHv5 12/16] t7001 (mv): add missing && Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Elijah Newren @ 2010-10-03  5:10 UTC (permalink / raw)
  To: git; +Cc: gitster, avarab, jrnieder, Elijah Newren

This patch series fixes many of the missing &&s in the testsuite.
Thanks to Junio, Jonathan, and Ævar for lots of time reviewing and
making suggestions so far.  And for being patient with my lack of
knowledge on some of this stuff.

Changes since v4:
  * Included Ævar's patch to make test_expect_code a test command
    (which appears to not be in pu yet); this allowed cleaning up my
    t4017 patch nicely.  Cleaned up t4017.
  * Lots of fixes suggested by Junio, Jonathan, and Ævar
  * Changed the last patch to introduce a new portable_unset() helper
    function and use it to enable proper && chaining in combination
    with unsetting variables.
  * Reverted t3600 to originally submitted patch, due to issues
    Jonathan pointed out in the version in v3/v4.
  * Added some acks from Jonathan that I assume were implied by his
    reviews.  Hope I didn't add ones I shouldn't or miss ones I should
    have added.


Elijah Newren (15):
  t3020 (ls-files-error-unmatch): remove stray '1' from end of file
  t4017 (diff-retval): replace manual exit code check with
    test_expect_code
  t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
  t4002 (diff-basic): use test_might_fail for commands that might fail
  t4202 (log): Replace '<git-command> || :' with test_might_fail
  t3600 (rm): add lots of missing &&
  t4019 (diff-wserror): add lots of missing &&
  t4026 (color): remove unneeded and unchained command
  t5602 (clone-remote-exec): add missing &&
  t6016 (rev-list-graph-simplify-history): add missing &&
  t7001 (mv): add missing &&
  t7601 (merge-pull-config): add missing &&
  t7800 (difftool): add missing &&
  Add missing &&'s throughout the testsuite
  Introduce portable_unset and use it to ensure proper && chaining

Ævar Arnfjörð Bjarmason (1):
  test-lib: make test_expect_code a test command

 t/README                                    |   16 +++---
 t/t0000-basic.sh                            |   55 +++++++++++++++++----
 t/t0001-init.sh                             |   30 ++++++------
 t/t0003-attributes.sh                       |   45 ++++++++---------
 t/t0020-crlf.sh                             |    2 +-
 t/t0024-crlf-archive.sh                     |    4 +-
 t/t0026-eol-config.sh                       |    2 +-
 t/t0050-filesystem.sh                       |    6 +-
 t/t1000-read-tree-m-3way.sh                 |    2 +-
 t/t1001-read-tree-m-2way.sh                 |   18 +++---
 t/t1002-read-tree-m-u-2way.sh               |   10 ++--
 t/t1302-repo-version.sh                     |    2 +-
 t/t1401-symbolic-ref.sh                     |    2 +-
 t/t1402-check-ref-format.sh                 |    4 +-
 t/t1410-reflog.sh                           |    8 ++--
 t/t1501-worktree.sh                         |    2 +-
 t/t1504-ceiling-dirs.sh                     |    5 +-
 t/t1509-root-worktree.sh                    |    6 +-
 t/t2007-checkout-symlink.sh                 |    2 +-
 t/t2016-checkout-patch.sh                   |    2 +-
 t/t2050-git-dir-relative.sh                 |    4 +-
 t/t2103-update-index-ignore-missing.sh      |    2 +-
 t/t2200-add-update.sh                       |    2 +-
 t/t3001-ls-files-others-exclude.sh          |    2 +-
 t/t3020-ls-files-error-unmatch.sh           |    1 -
 t/t3050-subprojects-fetch.sh                |    4 +-
 t/t3203-branch-output.sh                    |    6 +-
 t/t3307-notes-man.sh                        |    2 +-
 t/t3406-rebase-message.sh                   |    6 +-
 t/t3408-rebase-multi-line.sh                |    2 +-
 t/t3504-cherry-pick-rerere.sh               |    4 +-
 t/t3600-rm.sh                               |   38 ++++++--------
 t/t3903-stash.sh                            |    4 +-
 t/t3904-stash-patch.sh                      |    2 +-
 t/t4002-diff-basic.sh                       |   12 ++--
 t/t4017-diff-retval.sh                      |   71 ++++++++-------------------
 t/t4019-diff-wserror.sh                     |   52 ++++++++++----------
 t/t4021-format-patch-numbered.sh            |    2 +-
 t/t4026-color.sh                            |    1 -
 t/t4027-diff-submodule.sh                   |    2 +-
 t/t4103-apply-binary.sh                     |    8 ++--
 t/t4104-apply-boundary.sh                   |    4 +-
 t/t4111-apply-subdir.sh                     |    4 +-
 t/t4119-apply-config.sh                     |    2 +-
 t/t4124-apply-ws-rule.sh                    |    4 +-
 t/t4127-apply-same-fn.sh                    |   18 +++---
 t/t4130-apply-criss-cross-rename.sh         |    2 +-
 t/t4133-apply-filenames.sh                  |    6 +-
 t/t4150-am.sh                               |    2 +-
 t/t4202-log.sh                              |    2 +-
 t/t5300-pack-object.sh                      |    4 +-
 t/t5301-sliding-window.sh                   |    2 +-
 t/t5302-pack-index.sh                       |    2 +-
 t/t5500-fetch-pack.sh                       |    2 +-
 t/t5502-quickfetch.sh                       |    2 +-
 t/t5503-tagfollow.sh                        |    4 +-
 t/t5510-fetch.sh                            |    2 +-
 t/t5516-fetch-push.sh                       |   20 ++++----
 t/t5517-push-mirror.sh                      |   10 ++--
 t/t5519-push-alternates.sh                  |    2 +-
 t/t5531-deep-submodule-push.sh              |    2 +-
 t/t5541-http-push.sh                        |    2 +-
 t/t5550-http-fetch.sh                       |    6 +-
 t/t5601-clone.sh                            |    6 +-
 t/t5602-clone-remote-exec.sh                |   22 ++++++---
 t/t5701-clone-local.sh                      |    8 ++--
 t/t5705-clone-2gb.sh                        |    2 +-
 t/t6009-rev-list-parent.sh                  |    2 +-
 t/t6010-merge-base.sh                       |    2 +-
 t/t6016-rev-list-graph-simplify-history.sh  |   29 ++++-------
 t/t6020-merge-df.sh                         |    4 +-
 t/t6022-merge-rename.sh                     |    2 +-
 t/t6024-recursive-merge.sh                  |    2 +-
 t/t6030-bisect-porcelain.sh                 |    8 ++--
 t/t6040-tracking-info.sh                    |    2 +-
 t/t7001-mv.sh                               |    2 +-
 t/t7004-tag.sh                              |   14 +++---
 t/t7006-pager.sh                            |   10 ++--
 t/t7105-reset-patch.sh                      |    6 +-
 t/t7300-clean.sh                            |    6 +-
 t/t7501-commit.sh                           |    2 +-
 t/t7502-commit.sh                           |    6 +-
 t/t7506-status-submodule.sh                 |    2 +-
 t/t7600-merge.sh                            |    2 +-
 t/t7601-merge-pull-config.sh                |   12 ++--
 t/t7610-mergetool.sh                        |    2 +-
 t/t7700-repack.sh                           |    2 +-
 t/t7800-difftool.sh                         |   12 ++--
 t/t8003-blame.sh                            |    6 +-
 t/t9122-git-svn-author.sh                   |    4 +-
 t/t9123-git-svn-rebuild-with-rewriteroot.sh |    2 +-
 t/t9134-git-svn-ignore-paths.sh             |    6 +-
 t/t9137-git-svn-dcommit-clobber-series.sh   |    2 +-
 t/t9138-git-svn-authors-prog.sh             |    6 +-
 t/t9146-git-svn-empty-dirs.sh               |    6 +-
 t/t9151-svn-mergeinfo.sh                    |   22 ++++----
 t/t9200-git-cvsexportcommit.sh              |    4 +-
 t/t9401-git-cvsserver-crlf.sh               |    2 +-
 t/t9600-cvsimport.sh                        |    2 +-
 t/test-lib.sh                               |   44 ++++++++++-------
 100 files changed, 418 insertions(+), 409 deletions(-)

-- 
1.7.3.1.66.gab790

^ permalink raw reply	[relevance 4%]

* What's cooking in git.git (Sep 2010, #07; Wed, 29)
@ 2010-09-30  0:16  1% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2010-09-30  0:16 UTC (permalink / raw)
  To: git

What's cooking in git.git (Sep 2010, #07; Wed, 29)
--------------------------------------------------

Here are the topics that have been cooking.  Commits prefixed with '-' are
only in 'pu' while commits prefixed with '+' are in 'next'.  The ones
marked with '.' do not appear in any of the integration branches, but I am
still holding onto them.

With fixes to a few brown paper bag regressions to "git stash", 1.7.3.1 is
out.  The first batch of topics that have been cooking have graduated on
the 'master' front.

--------------------------------------------------
[Graduated to "master"]

* ab/send-email-catfile (2010-09-14) 1 commit
  (merged to 'next' on 2010-09-22 at 5c53513)
 + send-email: use catfile() to concatenate files

* bc/fortran-userdiff (2010-09-10) 1 commit
  (merged to 'next' on 2010-09-22 at f0c8ddb)
 + userdiff.c: add builtin fortran regex patterns

* gb/shell-ext (2010-08-27) 6 commits
  (merged to 'next' on 2010-09-22 at e529b2a)
 + shell: Display errors from improperly-formatted command lines
 + Merge branch 'gb/split-cmdline-errmsg' into gb/shell-ext
 + shell: Rewrite documentation and improve error message
 + Add sample commands for git-shell
 + Add interactive mode to git-shell for user-friendliness
 + Allow creation of arbitrary git-shell commands

* jc/grep-header-all-match-fix (2010-09-12) 2 commits
  (merged to 'next' on 2010-09-22 at c78a8aa)
 + log --author: take union of multiple "author" requests
 + grep: move logic to compile header pattern into a separate helper
 (this branch is used by jc/grep-header-all-match-fix-debug.)

We might want to give a more comprehensive revamp to the "filter by
grepping the commit log message" feature some day, somehow allowing the
full "git grep" boolean expression.  But until then, this should suffice.

* jc/no-branch-name-with-dash-at-front (2010-09-14) 1 commit
  (merged to 'next' on 2010-09-22 at 5918d77)
 + disallow branch names that start with a hyphen

This came up at $WORK.

* jc/pickaxe-grep (2010-08-31) 4 commits
  (merged to 'next' on 2010-09-22 at 2a33735)
 + diff/log -G<pattern>: tests
 + git log/diff: add -G<regexp> that greps in the patch text
 + diff: pass the entire diff-options to diffcore_pickaxe()
 + gitdiffcore doc: update pickaxe description

This is a re-roll of "grepping inside the log -p output" which is a
feature that is often asked for when people hear about -S option.

* jk/read-tree-empty (2010-09-10) 1 commit
  (merged to 'next' on 2010-09-22 at a6a00bd)
 + read-tree: deprecate syntax without tree-ish args

* jn/gitweb-test-lib (2010-09-12) 2 commits
  (merged to 'next' on 2010-09-22 at 8a471ba)
 + t/gitweb-lib.sh: Use tabs for indent consistently
 + t/gitweb-lib.sh: Use GIT_BUILD_DIR

* po/etc-gitattributes (2010-09-01) 1 commit
  (merged to 'next' on 2010-09-22 at dc64419)
 + Add global and system-wide gitattributes

* rr/fmt-merge-msg (2010-09-08) 5 commits
  (merged to 'next' on 2010-09-22 at 958ca95)
 + t6200-fmt-merge-msg: Exercise '--log' to configure shortlog length
 + t6200-fmt-merge-msg: Exercise 'merge.log' to configure shortlog length
 + merge: Make 'merge.log' an integer or boolean option
 + merge: Make '--log' an integer option for number of shortlog entries
 + fmt_merge_msg: Change fmt_merge_msg API to accept shortlog_len

* rr/format-patch-count-without-merges (2010-08-28) 2 commits
  (merged to 'next' on 2010-09-22 at 4ae3edc)
 + format-patch: Don't go over merge commits
 + t4014-format-patch: Call test_tick before committing

* tr/send-email-refuse-sending-unedited-cover-letter (2009-06-08) 1 commit
  (merged to 'next' on 2010-09-22 at e306400)
 + send-email: Refuse to send cover-letter template subject

--------------------------------------------------
[New Topics]

* mg/reset-doc (2010-09-15) 6 commits
  (merged to 'next' on 2010-09-22 at 2a10b71)
 + git-reset.txt: make modes description more consistent
 + git-reset.txt: point to git-checkout
 + git-reset.txt: use "working tree" consistently
 + git-reset.txt: reset --soft is not a no-op
 + git-reset.txt: reset does not change files in target
 + git-reset.txt: clarify branch vs. branch head

Will merge to 'master' shortly.

* ab/makefile-track-cc (2010-09-12) 1 commit
  (merged to 'next' on 2010-09-27 at 51daee0)
 + Makefile: add CC to TRACK_CFLAGS

Will merge to 'master' shortly.

* ab/require-perl-5.8 (2010-09-24) 2 commits
  (merged to 'next' on 2010-09-27 at 1fcdd3c)
 + perl: use "use warnings" instead of -w
 + perl: bump the required Perl version to 5.8 from 5.6.[21]

* bc/fix-cherry-pick-root (2010-09-27) 1 commit
  (merged to 'next' on 2010-09-27 at e27f4c9)
 + builtin/revert.c: don't dereference a NULL pointer

Will merge to 'master' shortly.

* cw/gitweb-hilite-config (2010-09-21) 1 commit
  (merged to 'next' on 2010-09-27 at dd234ba)
 + Enable highlight executable path as a configuration option

Will merge to 'master' shortly.

* en/and-cascade-tests (2010-09-26) 12 commits
 - Add missing &&'s throughout the testsuite
 - t7601 (merge-pull-config): add missing &&
 - t7001 (mv): add missing &&
 - t6016 (rev-list-graph-simplify-history): add missing &&
 - t4026 (color): remove unneeded and unchained command
 - t4019 (diff-wserror): add lots of missing &&
 - t3600 (rm): add lots of missing &&
 - t4202 (log): Replace '<git-command> || :' with test_might_fail
 - t4002 (diff-basic): use test_might_fail for commands that might fail
 - t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
 - t4017 (diff-retval): replace manual exit code check with test_expect_code
 - t3020 (ls-files-error-unmatch): remove stray '1' from end of file

I've rejected a few patches in the series; will merge this to 'next'
perhaps after a reroll or two.

* jk/no-textconv-symlink (2010-09-21) 1 commit
 - diff: don't use pathname-based diff drivers for symlinks
 (this branch is used by ks/no-textconv-symlink.)

* ks/no-textconv-symlink (2010-09-29) 3 commits
 - blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
 - blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks
 - blame,cat-file: Prepare --textconv tests for correctly-failing conversion program
 (this branch uses jk/no-textconv-symlink.)

* jk/repack-reuse-object (2010-09-27) 2 commits
  (merged to 'next' on 2010-09-27 at 5719f72)
 + Documentation: pack.compression: explain how to recompress
 + repack: add -F flag to let user choose between --no-reuse-delta/object

Will merge to 'master' shortly.

* jp/send-email-to-cmd (2010-09-24) 1 commit
 - git-send-email.perl: Add --to-cmd

Should be Ok for 'next'.

* kb/merge-recursive-rename-threshold (2010-09-27) 2 commits
 - diff: add synonyms for -M, -C, -B
 - merge-recursive: option to specify rename threshold
 (this branch uses jf/merge-ignore-ws.)

Should be Ok for 'next'.

* mg/fix-build-remote-helpers (2010-09-17) 1 commit
 - remote-helpers: build in platform independent directory

Should be Ok for 'next'.

* nd/struct-pathspec (2010-09-20) 5 commits
 - ce_path_match: drop prefix matching in favor of match_pathspec
 - Convert ce_path_match() to use struct pathspec
 - tree_entry_interesting: turn to match_pathspec if wildcard is present
 - pathspec: add tree_recursive_diff parameter
 - pathspec: mark wildcard pathspecs from the beginning
 (this branch uses en/object-list-with-pathspec.)

* en/object-list-with-pathspec (2010-09-20) 8 commits
 - Add testcases showing how pathspecs are handled with rev-list --objects
 - Make rev-list --objects work together with pathspecs
 - Move tree_entry_interesting() to tree-walk.c and export it
 - tree_entry_interesting(): remove dependency on struct diff_options
 - Convert struct diff_options to use struct pathspec
 - pathspec: cache string length when initialize pathspec
 - diff-no-index: use diff_tree_setup_paths()
 - Add struct pathspec
 (this branch is used by nd/struct-pathspec.)

* sb/send-email-use-to-from-input (2010-09-29) 1 commit
 - send-email: Use To: headers in patch files

Should be Ok for 'next'.

* tc/smart-http-post-redirect (2010-09-25) 1 commit
 - smart-http: Don't change POST to GET when following redirect

* uk/fix-author-ident-sed-script (2010-09-23) 1 commit
  (merged to 'next' on 2010-09-27 at 5ad7d90)
 + get_author_ident_from_commit(): remove useless quoting

Will merge to 'master' shortly.

--------------------------------------------------
[Stalled]

* nd/index-doc (2010-09-06) 1 commit
 - doc: technical details about the index file format

Half-written but it is a good start.  I may need to give some help in
describing more recent index extensions.

* by/line-log (2010-09-11) 18 commits
 . log -L: do not free parents lists we might need again
 . Document line history browser
 . Add tests for line history browser
 . Add --full-line-diff option
 . Add --graph prefix before line history output
 . Add parent rewriting to line history browser
 . Make graph_next_line external to other part of git
 . Make rewrite_parents public to other part of git
 . Hook line history into cmd_log, ensuring a topo-ordered walk
 . Print the line log
 . map/take range to the parent of commits
 . Add range clone functions
 . Export three functions from diff.c
 . Parse the -L options
 . Refactor parse_loc
 . Add the basic data structure for line level history
 . parse-options: add two helper functions
 . parse-options: enhance STOP_AT_NON_OPTION

Temporarily ejected to give room to nd/struct-pathspec topic as this
conflicts with it.

* cb/ignored-paths-are-precious (2010-08-21) 1 commit
 - checkout/merge: optionally fail operation when ignored files need to be overwritten

This needs tests; also we know of longstanding bugs in related area that
needs to be addressed---they do not have to be part of this series but
their reproduction recipe would belong to the test script for this topic.

It would hurt users to make the new feature on by default, especially the
ones with subdirectories that come and go.

* jj/icase-directory (2010-08-16) 6 commits
 - Support case folding in git fast-import when core.ignorecase=true
 - Support case folding for git add when core.ignorecase=true
 - Add case insensitivity support when using git ls-files
 - Add case insensitivity support for directories when using git status
 - Case insensitivity support for .gitignore via core.ignorecase
 - Add string comparison functions that respect the ignore_case variable.

Depends on GNU FNM_CASEFOLD.  Presumably a bit of tweak in Makefile for
non-windows but non-GNU platforms is all it takes?

* jk/tag-contains (2010-07-05) 4 commits
 - Why is "git tag --contains" so slow?
 - default core.clockskew variable to one day
 - limit "contains" traversals based on commit timestamp
 - tag: speed up --contains calculation

The idea of the bottom one is probably Ok, except that the use of object
flags needs to be rethought, or at least the helper needs to be moved to
builtin/tag.c to make it clear that it should not be used outside the
current usage context.

--------------------------------------------------
[Cooking]

* as/daemon-multi-listen (2010-08-30) 2 commits
 - daemon: allow more than one host address given via --listen
 - daemon: add helper function named_sock_setup

Should be Ok for 'next'.

* jc/grep-header-all-match-fix-debug (2010-09-13) 1 commit
 - grep debugging, just in case

Not necessary; will drop shortly.

* dm/mergetool-vimdiff (2010-09-27) 3 commits
  (merged to 'next' on 2010-09-29 at c8e22ea)
 + mergetool-lib: make the three-way diff the default for vim/gvim
  (merged to 'next' on 2010-09-22 at 12f7559)
 + mergetool-lib: add a three-way diff view for vim/gvim
 + mergetool-lib: combine vimdiff and gvimdiff run blocks

* en/rename-d-f (2010-09-08) 2 commits
 - merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir
 - t3509: Add rename + D/F conflict testcase that recursive strategy fails

I am not entirely convinced this is a regression free band-aid; need to
look at this a few more times.

* kf/post-receive-sample-hook (2010-09-10) 1 commit
  (merged to 'next' on 2010-09-22 at db674a3)
 + post-receive-email: ensure sent messages are not empty

I notice that it uses "PAGER= generate_email" where generate_email is a
shell function, which may break in some implementations of POSIX /bin/sh.
This is not a regression (the original also had the same issue), but
somebody who cares enough might want to look into it.

* ml/completion-zsh (2010-09-06) 1 commit
  (merged to 'next' on 2010-09-22 at d62d10e)
 + completion: make compatible with zsh

Comments from bash users regarding regressions?

* po/sendemail (2010-09-06) 3 commits
  (merged to 'next' on 2010-09-22 at 1105f62)
 + New send-email option smtpserveroption.
 + Remove @smtp_host_parts variable as not used.
 + Minor indentation fix.

Comments from potential users?

* jl/fetch-submodule-recursive (2010-09-19) 4 commits
 - fetch: Get submodule paths from index and not from .gitmodules
 - fetch: Fix a bug swallowing the output of recursive submodule fetching
 - Submodules: Add the new "fetch" config option for fetch and pull
 - fetch/pull: Recursively fetch populated submodules

Further work expected after 1.7.3 between Jens and Kevin.

* jf/merge-ignore-ws (2010-08-26) 4 commits
  (merged to 'next' on 2010-09-22 at 5161fb8)
 + merge-recursive: options to ignore whitespace changes
 + merge-recursive --patience
 + ll-merge: replace flag argument with options struct
 + merge-recursive: expose merge options for builtin merge
 (this branch is used by kb/merge-recursive-rename-threshold.)

Possibly one of the star features of the release after 1.7.3, whether it
is called 1.7.4 or 1.8.0.

* tr/merge-unborn-clobber (2010-08-22) 1 commit
 - Exhibit merge bug that clobbers index&WT

* en/tree-walk-optim (2010-08-26) 4 commits
  (merged to 'next' on 2010-09-22 at 0601f1b)
 + diff_tree(): Skip skip_uninteresting() when all remaining paths interesting
 + tree_entry_interesting(): Make return value more specific
 + tree-walk: Correct bitrotted comment about tree_entry()
 + Document pre-condition for tree_entry_interesting

Need to look at this a few more times to convince myself that this is Ok.

* ab/i18n (2010-09-12) 159 commits
 - po/sv.po: add Swedish translation
 - gettextize: git-bisect bisect_next_check "You need to" message
 - gettextize: git-bisect [Y/n] messages
 - gettextize: git-bisect bisect_replay + $1 messages
 - gettextize: git-bisect bisect_reset + $1 messages
 - gettextize: git-bisect bisect_run + $@ messages
 - gettextize: git-bisect die + eval_gettext messages
 - gettextize: git-bisect die + gettext messages
 - gettextize: git-bisect echo + eval_gettext message
 - gettextize: git-bisect echo + gettext messages
 - gettextize: git-bisect gettext + echo message
 - gettextize: git-bisect add git-sh-i18n
 - gettextize: git-stash drop_stash say/die messages
 - gettextize: git-stash "unknown option" message
 - gettextize: git-stash die + eval_gettext $1 messages
 - gettextize: git-stash die + eval_gettext $* messages
 - gettextize: git-stash die + eval_gettext messages
 - gettextize: git-stash die + gettext messages
 - gettextize: git-stash say + gettext messages
 - gettextize: git-stash echo + gettext message
 - gettextize: git-stash add git-sh-i18n
 - gettextize: git-submodule "blob" and "submodule" messages
 - gettextize: git-submodule "path not initialized" message
 - gettextize: git-submodule "[...] path is ignored" message
 - gettextize: git-submodule "Entering [...]" message
 - gettextize: git-submodule $errmsg messages
 - gettextize: git-submodule "Submodule change[...]" messages
 - gettextize: git-submodule "cached cannot be used" message
 - gettextize: git-submodule $update_module say + die messages
 - gettextize: git-submodule die + eval_gettext messages
 - gettextize: git-submodule say + eval_gettext messages
 - gettextize: git-submodule echo + eval_gettext messages
 - gettextize: git-submodule add git-sh-i18n
 - gettextize: git-pull "rebase against" / "merge with" messages
 - gettextize: git-pull "[...] not currently on a branch" message
 - gettextize: git-pull "You asked to pull" message
 - gettextize: git-pull split up "no candidate" message
 - gettextize: git-pull eval_gettext + warning message
 - gettextize: git-pull eval_gettext + die message
 - gettextize: git-pull die messages
 - gettextize: git-pull add git-sh-i18n
 - gettext docs: add "Testing marked strings" section to po/README
 - gettext docs: the Git::I18N Perl interface
 - gettext docs: the git-sh-i18n.sh Shell interface
 - gettext docs: the gettext.h C interface
 - gettext docs: add "Marking strings for translation" section in po/README
 - gettext docs: add a "Testing your changes" section to po/README
 - po/pl.po: add Polish translation
 - po/hi.po: add Hindi Translation
 - po/en_GB.po: add British English translation
 - po/de.po: add German translation
 - Makefile: only add gettext tests on XGETTEXT_INCLUDE_TESTS=YesPlease
 - gettext docs: add po/README file documenting Git's gettext
 - gettextize: git-am printf(1) message to eval_gettext
 - gettextize: git-am core say messages
 - gettextize: git-am "Apply?" message
 - gettextize: git-am clean_abort messages
 - gettextize: git-am cannot_fallback messages
 - gettextize: git-am die messages
 - gettextize: git-am eval_gettext messages
 - gettextize: git-am multi-line getttext $msg; echo
 - gettextize: git-am one-line gettext $msg; echo
 - gettextize: git-am add git-sh-i18n
 - gettext tests: add GETTEXT_POISON tests for shell scripts
 - gettext tests: add GETTEXT_POISON support for shell scripts
 - Makefile: MSGFMT="msgfmt --check" under GNU_GETTEXT
 - Makefile: add GNU_GETTEXT, set when we expect GNU gettext
 - gettextize: git-shortlog basic messages
 - gettextize: git-revert split up "could not revert/apply" message
 - gettextize: git-revert literal "me" messages
 - gettextize: git-revert "Your local changes" message
 - gettextize: git-revert basic messages
 - gettextize: git-notes "Refusing to %s notes in %s" message
 - gettextize: git-notes GIT_NOTES_REWRITE_MODE error message
 - gettextize: git-notes basic commands
 - gettextize: git-gc "Auto packing the repository" message
 - gettextize: git-gc basic messages
 - gettextize: git-describe basic messages
 - gettextize: git-clean clean.requireForce messages
 - gettextize: git-clean basic messages
 - gettextize: git-bundle basic messages
 - gettextize: git-archive basic messages
 - gettextize: git-status "renamed: " message
 - gettextize: git-status "Initial commit" message
 - gettextize: git-status "Changes to be committed" message
 - gettextize: git-status shortstatus messages
 - gettextize: git-status "nothing to commit" messages
 - gettextize: git-status basic messages
 - gettextize: git-push "prevent you from losing" message
 - gettextize: git-push basic messages
 - gettextize: git-tag tag_template message
 - gettextize: git-tag basic messages
 - gettextize: git-reset "Unstaged changes after reset" message
 - gettextize: git-reset reset_type_names messages
 - gettextize: git-reset basic messages
 - gettextize: git-rm basic messages
 - gettextize: git-mv "bad" messages
 - gettextize: git-mv basic messages
 - gettextize: git-merge "Wonderful" message
 - gettextize: git-merge "You have not concluded your merge" messages
 - gettextize: git-merge "Updating %s..%s" message
 - gettextize: git-merge basic messages
 - gettextize: git-log "--OPT does not make sense" messages
 - gettextize: git-log basic messages
 - gettextize: git-grep "--open-files-in-pager" message
 - gettextize: git-grep basic messages
 - gettextize: git-fetch split up "(non-fast-forward)" message
 - gettextize: git-fetch update_local_ref messages
 - gettextize: git-fetch formatting messages
 - gettextize: git-fetch basic messages
 - gettextize: git-diff basic messages
 - gettextize: git-commit advice messages
 - gettextize: git-commit "enter the commit message" message
 - gettextize: git-commit print_summary messages
 - gettextize: git-commit formatting messages
 - gettextize: git-commit "middle of a merge" message
 - gettextize: git-commit basic messages
 - gettextize: git-checkout "Switched to a .. branch" message
 - gettextize: git-checkout "HEAD is now at" message
 - gettextize: git-checkout describe_detached_head messages
 - gettextize: git-checkout: our/their version message
 - gettextize: git-checkout basic messages
 - gettextize: git-branch "(no branch)" message
 - gettextize: git-branch "git branch -v" messages
 - gettextize: git-branch "Deleted branch [...]" message
 - gettextize: git-branch "remote branch '%s' not found" message
 - gettextize: git-branch basic messages
 - gettextize: git-add refresh_index message
 - gettextize: git-add "remove '%s'" message
 - gettextize: git-add "pathspec [...] did not match" message
 - gettextize: git-add "Use -f if you really want" message
 - gettextize: git-add "no files added" message
 - gettextize: git-add basic messages
 - gettextize: git-clone "Cloning into" message
 - gettextize: git-clone basic messages
 - gettext tests: test message re-encoding under C
 - po/is.po: add Icelandic translation
 - gettext tests: mark a test message as not needing translation
 - gettext tests: test re-encoding with a UTF-8 msgid under Shell
 - gettext tests: test message re-encoding under Shell
 - gettext tests: add detection for is_IS.ISO-8859-1 locale
 - gettext tests: test if $VERSION exists before using it
 - gettextize: git-init "Initialized [...] repository" message
 - gettextize: git-init basic messages
 - gettext tests: skip lib-gettext.sh tests under GETTEXT_POISON
 - gettext tests: add GETTEXT_POISON=YesPlease Makefile parameter
 - gettext.c: work around us not using setlocale(LC_CTYPE, "")
 - builtin.h: Include gettext.h
 - Makefile: use variables and shorter lines for xgettext
 - Makefile: tell xgettext(1) that our source is in UTF-8
 - Makefile: provide a --msgid-bugs-address to xgettext(1)
 - Makefile: A variable for options used by xgettext(1) calls
 - gettext tests: locate i18n lib&data correctly under --valgrind
 - gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions
 - gettext tests: rename test to work around GNU gettext bug
 - gettext: add infrastructure for translating Git with gettext
 - builtin: use builtin.h for all builtin commands
 - tests: use test_cmp instead of piping to diff(1)
 - t7004-tag.sh: re-arrange git tag comment for clarity

^ permalink raw reply	[relevance 1%]

* [PATCHv4 11/15] t7001 (mv): add missing &&
  2010-09-26 23:14  5% [PATCHv4 00/15] Add missing &&'s in the testsuite Elijah Newren
@ 2010-09-26 23:14 21% ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2010-09-26 23:14 UTC (permalink / raw)
  To: git; +Cc: gitster, Elijah Newren

Also, prefix an expected-to-fail git mv command with 'test_must_fail'.

Acked-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t7001-mv.sh |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 65a35d9..624e6d2 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -61,7 +61,7 @@ test_expect_success \
 test_expect_success \
     'checking -f on untracked file with existing target' \
     'touch path0/untracked1 &&
-     git mv -f untracked1 path0
+     test_must_fail git mv -f untracked1 path0 &&
      test ! -f .git/index.lock &&
      test -f untracked1 &&
      test -f path0/untracked1'
-- 
1.7.3.95.g14291

^ permalink raw reply related	[relevance 21%]

* [PATCHv4 00/15] Add missing &&'s in the testsuite
@ 2010-09-26 23:14  5% Elijah Newren
  2010-09-26 23:14 21% ` [PATCHv4 11/15] t7001 (mv): add missing && Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Elijah Newren @ 2010-09-26 23:14 UTC (permalink / raw)
  To: git; +Cc: gitster, Elijah Newren

This patch series fixes many of the missing &&s in the testsuite.  I'm
certain there are still others I have missed.

Changes since v3:
  * Dropped patch 11; Christian has submitted a more thorough fix that
    includes my patch and more.
  * Fixed issue in patch 15 of previous series (now patch 14) noted by Ævar.
  * Fixed subject line for patch 8, as noted by Jeff.
  * Added acks from Ævar Arnfjörð Bjarmason and Jeff King

Elijah Newren (15):
  t3020 (ls-files-error-unmatch): remove stray '1' from end of file
  t4017 (diff-retval): replace manual exit code check with
    test_expect_code
  t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
  t4002 (diff-basic): use test_might_fail for commands that might fail
  t4202 (log): Replace '<git-command> || :' with test_might_fail
  t3600 (rm): add lots of missing &&
  t4019 (diff-wserror): add lots of missing &&
  t4026 (color): remove unneeded and unchained command
  t5602 (clone-remote-exec): add missing &&
  t6016 (rev-list-graph-simplify-history): add missing &&
  t7001 (mv): add missing &&
  t7601 (merge-pull-config): add missing &&
  t7800 (difftool): add missing &&
  Add missing &&'s throughout the testsuite
  Replace "unset VAR" with "unset VAR;" in testsuite as per t/README

 t/t0001-init.sh                             |   30 ++++++++--------
 t/t0003-attributes.sh                       |   41 ++++++++++-----------
 t/t0020-crlf.sh                             |    2 +-
 t/t0024-crlf-archive.sh                     |    4 +-
 t/t0026-eol-config.sh                       |    2 +-
 t/t0050-filesystem.sh                       |    6 ++--
 t/t1000-read-tree-m-3way.sh                 |    2 +-
 t/t1001-read-tree-m-2way.sh                 |   18 +++++-----
 t/t1002-read-tree-m-u-2way.sh               |   10 +++---
 t/t1302-repo-version.sh                     |    2 +-
 t/t1401-symbolic-ref.sh                     |    2 +-
 t/t1402-check-ref-format.sh                 |    4 +-
 t/t1410-reflog.sh                           |    8 ++--
 t/t1501-worktree.sh                         |    2 +-
 t/t1509-root-worktree.sh                    |    6 ++--
 t/t2007-checkout-symlink.sh                 |    2 +-
 t/t2016-checkout-patch.sh                   |    2 +-
 t/t2050-git-dir-relative.sh                 |    4 +-
 t/t2103-update-index-ignore-missing.sh      |    2 +-
 t/t2200-add-update.sh                       |    2 +-
 t/t3001-ls-files-others-exclude.sh          |    2 +-
 t/t3020-ls-files-error-unmatch.sh           |    1 -
 t/t3050-subprojects-fetch.sh                |    4 +-
 t/t3203-branch-output.sh                    |    6 ++--
 t/t3307-notes-man.sh                        |    2 +-
 t/t3406-rebase-message.sh                   |    6 ++--
 t/t3408-rebase-multi-line.sh                |    2 +-
 t/t3504-cherry-pick-rerere.sh               |    4 +-
 t/t3600-rm.sh                               |   38 +++++++++-----------
 t/t3903-stash.sh                            |    4 +-
 t/t3904-stash-patch.sh                      |    2 +-
 t/t4002-diff-basic.sh                       |   12 +++---
 t/t4017-diff-retval.sh                      |   30 +++++----------
 t/t4019-diff-wserror.sh                     |   52 +++++++++++++-------------
 t/t4021-format-patch-numbered.sh            |    2 +-
 t/t4026-color.sh                            |    1 -
 t/t4027-diff-submodule.sh                   |    2 +-
 t/t4103-apply-binary.sh                     |    8 ++--
 t/t4104-apply-boundary.sh                   |    4 +-
 t/t4111-apply-subdir.sh                     |    4 +-
 t/t4119-apply-config.sh                     |    2 +-
 t/t4124-apply-ws-rule.sh                    |    4 +-
 t/t4127-apply-same-fn.sh                    |   18 +++++-----
 t/t4130-apply-criss-cross-rename.sh         |    2 +-
 t/t4133-apply-filenames.sh                  |    6 ++--
 t/t4150-am.sh                               |    2 +-
 t/t4202-log.sh                              |    2 +-
 t/t5300-pack-object.sh                      |    4 +-
 t/t5301-sliding-window.sh                   |    2 +-
 t/t5302-pack-index.sh                       |    2 +-
 t/t5500-fetch-pack.sh                       |    2 +-
 t/t5502-quickfetch.sh                       |    2 +-
 t/t5503-tagfollow.sh                        |    4 +-
 t/t5510-fetch.sh                            |    2 +-
 t/t5516-fetch-push.sh                       |   20 +++++-----
 t/t5517-push-mirror.sh                      |   10 +++---
 t/t5519-push-alternates.sh                  |    2 +-
 t/t5531-deep-submodule-push.sh              |    2 +-
 t/t5541-http-push.sh                        |    2 +-
 t/t5550-http-fetch.sh                       |    6 ++--
 t/t5601-clone.sh                            |    6 ++--
 t/t5602-clone-remote-exec.sh                |   14 ++++----
 t/t5701-clone-local.sh                      |    8 ++--
 t/t5705-clone-2gb.sh                        |    2 +-
 t/t6009-rev-list-parent.sh                  |    2 +-
 t/t6010-merge-base.sh                       |    2 +-
 t/t6016-rev-list-graph-simplify-history.sh  |   24 +++---------
 t/t6022-merge-rename.sh                     |    2 +-
 t/t6024-recursive-merge.sh                  |    2 +-
 t/t6030-bisect-porcelain.sh                 |    8 ++--
 t/t6040-tracking-info.sh                    |    2 +-
 t/t7001-mv.sh                               |    2 +-
 t/t7004-tag.sh                              |   14 ++++----
 t/t7105-reset-patch.sh                      |    6 ++--
 t/t7300-clean.sh                            |    6 ++--
 t/t7501-commit.sh                           |    2 +-
 t/t7502-commit.sh                           |    6 ++--
 t/t7506-status-submodule.sh                 |    2 +-
 t/t7600-merge.sh                            |    2 +-
 t/t7601-merge-pull-config.sh                |   12 +++---
 t/t7610-mergetool.sh                        |    2 +-
 t/t7700-repack.sh                           |    2 +-
 t/t7800-difftool.sh                         |   11 +++---
 t/t8003-blame.sh                            |    6 ++--
 t/t9122-git-svn-author.sh                   |    4 +-
 t/t9123-git-svn-rebuild-with-rewriteroot.sh |    2 +-
 t/t9134-git-svn-ignore-paths.sh             |    6 ++--
 t/t9137-git-svn-dcommit-clobber-series.sh   |    2 +-
 t/t9138-git-svn-authors-prog.sh             |    6 ++--
 t/t9146-git-svn-empty-dirs.sh               |    6 ++--
 t/t9151-svn-mergeinfo.sh                    |   22 ++++++------
 t/t9200-git-cvsexportcommit.sh              |    4 +-
 t/t9401-git-cvsserver-crlf.sh               |    2 +-
 t/t9600-cvsimport.sh                        |    2 +-
 94 files changed, 302 insertions(+), 332 deletions(-)

-- 
1.7.3.95.g14291

^ permalink raw reply	[relevance 5%]

* [PATCHv3 12/16] t7001 (mv): add missing &&
  2010-09-25 19:06  4% [PATCHv3 00/16] Add missing &&'s in the testsuite Elijah Newren
@ 2010-09-25 19:07 19% ` Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2010-09-25 19:07 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren

Also, prefix an expected-to-fail git mv command with 'test_must_fail'.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t7001-mv.sh |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 65a35d9..624e6d2 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -61,7 +61,7 @@ test_expect_success \
 test_expect_success \
     'checking -f on untracked file with existing target' \
     'touch path0/untracked1 &&
-     git mv -f untracked1 path0
+     test_must_fail git mv -f untracked1 path0 &&
      test ! -f .git/index.lock &&
      test -f untracked1 &&
      test -f path0/untracked1'
-- 
1.7.3.95.g14291

^ permalink raw reply related	[relevance 19%]

* [PATCHv3 00/16] Add missing &&'s in the testsuite
@ 2010-09-25 19:06  4% Elijah Newren
  2010-09-25 19:07 19% ` [PATCHv3 12/16] t7001 (mv): add missing && Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Elijah Newren @ 2010-09-25 19:06 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren

This patch series fixes many of the missing &&s in the testsuite.  I'm
certain there are still others I have missed.

Comments on whether t6050 really intended to have the grep fail (see
patch 11), and whether a portable_unset() helper function would make
sense (see patch 16), would be appreciated.

Changes since v2:
  * Squashed patches 3 & 4 of previous series together given their
    similarity.
  * Made several changes suggested by Ævar Arnfjörð Bjarmason and Jeff
    King
  * Dropped the FIXME questions (and the "RFC" in the submission, though
    perhaps I should leave it based on my questions in patches 11 and 16)
  * Created a new patch at the end of the series to deal with the
    unportability of unset's return value with already unset
    variables, following the guidelines in t/README

Elijah Newren (16):
  t3020 (ls-files-error-unmatch): remove stray '1' from end of file
  t4017 (diff-retval): replace manual exit code check with
    test_expect_code
  t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&
  t4002 (diff-basic): use test_might_fail for commands that might fail
  t4202 (log): Replace '<git-command> || :' with test_might_fail
  t3600 (rm): add lots of missing &&
  t4019 (diff-wserror): add lots of missing &&
  t4026 (color): add missing &&
  t5602 (clone-remote-exec): add missing &&
  t6016 (rev-list-graph-simplify-history): add missing &&
  t6050 (replace): add missing &&
  t7001 (mv): add missing &&
  t7601 (merge-pull-config): add missing &&
  t7800 (difftool): add missing &&
  Add missing &&'s throughout the testsuite
  Replace "unset VAR" with "unset VAR;" in testsuite as per t/README

 t/t0001-init.sh                             |   30 ++++++++--------
 t/t0003-attributes.sh                       |   41 ++++++++++-----------
 t/t0020-crlf.sh                             |    2 +-
 t/t0024-crlf-archive.sh                     |    4 +-
 t/t0026-eol-config.sh                       |    2 +-
 t/t0050-filesystem.sh                       |    6 ++--
 t/t1000-read-tree-m-3way.sh                 |    2 +-
 t/t1001-read-tree-m-2way.sh                 |   18 +++++-----
 t/t1002-read-tree-m-u-2way.sh               |   10 +++---
 t/t1302-repo-version.sh                     |    2 +-
 t/t1401-symbolic-ref.sh                     |    2 +-
 t/t1402-check-ref-format.sh                 |    4 +-
 t/t1410-reflog.sh                           |    8 ++--
 t/t1501-worktree.sh                         |    2 +-
 t/t1509-root-worktree.sh                    |    6 ++--
 t/t2007-checkout-symlink.sh                 |    2 +-
 t/t2016-checkout-patch.sh                   |    2 +-
 t/t2050-git-dir-relative.sh                 |    4 +-
 t/t2103-update-index-ignore-missing.sh      |    2 +-
 t/t2200-add-update.sh                       |    2 +-
 t/t3001-ls-files-others-exclude.sh          |    2 +-
 t/t3020-ls-files-error-unmatch.sh           |    1 -
 t/t3050-subprojects-fetch.sh                |    4 +-
 t/t3203-branch-output.sh                    |    6 ++--
 t/t3307-notes-man.sh                        |    2 +-
 t/t3406-rebase-message.sh                   |    6 ++--
 t/t3408-rebase-multi-line.sh                |    2 +-
 t/t3504-cherry-pick-rerere.sh               |    4 +-
 t/t3600-rm.sh                               |   38 +++++++++-----------
 t/t3903-stash.sh                            |    4 +-
 t/t3904-stash-patch.sh                      |    2 +-
 t/t4002-diff-basic.sh                       |   12 +++---
 t/t4017-diff-retval.sh                      |   30 +++++----------
 t/t4019-diff-wserror.sh                     |   52 +++++++++++++-------------
 t/t4021-format-patch-numbered.sh            |    2 +-
 t/t4026-color.sh                            |    1 -
 t/t4027-diff-submodule.sh                   |    2 +-
 t/t4103-apply-binary.sh                     |    8 ++--
 t/t4104-apply-boundary.sh                   |    4 +-
 t/t4111-apply-subdir.sh                     |    4 +-
 t/t4119-apply-config.sh                     |    2 +-
 t/t4124-apply-ws-rule.sh                    |    4 +-
 t/t4127-apply-same-fn.sh                    |   18 +++++-----
 t/t4130-apply-criss-cross-rename.sh         |    2 +-
 t/t4133-apply-filenames.sh                  |    6 ++--
 t/t4150-am.sh                               |    2 +-
 t/t4202-log.sh                              |    2 +-
 t/t5300-pack-object.sh                      |    4 +-
 t/t5301-sliding-window.sh                   |    2 +-
 t/t5302-pack-index.sh                       |    2 +-
 t/t5500-fetch-pack.sh                       |    2 +-
 t/t5502-quickfetch.sh                       |    2 +-
 t/t5503-tagfollow.sh                        |    4 +-
 t/t5510-fetch.sh                            |    2 +-
 t/t5516-fetch-push.sh                       |   20 +++++-----
 t/t5517-push-mirror.sh                      |   10 +++---
 t/t5519-push-alternates.sh                  |    2 +-
 t/t5531-deep-submodule-push.sh              |    2 +-
 t/t5541-http-push.sh                        |    2 +-
 t/t5550-http-fetch.sh                       |    6 ++--
 t/t5601-clone.sh                            |    6 ++--
 t/t5602-clone-remote-exec.sh                |   14 ++++----
 t/t5701-clone-local.sh                      |    8 ++--
 t/t5705-clone-2gb.sh                        |    2 +-
 t/t6009-rev-list-parent.sh                  |    2 +-
 t/t6010-merge-base.sh                       |    2 +-
 t/t6016-rev-list-graph-simplify-history.sh  |   24 +++---------
 t/t6022-merge-rename.sh                     |    2 +-
 t/t6024-recursive-merge.sh                  |    2 +-
 t/t6030-bisect-porcelain.sh                 |    8 ++--
 t/t6040-tracking-info.sh                    |    2 +-
 t/t6050-replace.sh                          |    5 ++-
 t/t7001-mv.sh                               |    2 +-
 t/t7004-tag.sh                              |   14 ++++----
 t/t7105-reset-patch.sh                      |    6 ++--
 t/t7300-clean.sh                            |    6 ++--
 t/t7501-commit.sh                           |    2 +-
 t/t7502-commit.sh                           |    6 ++--
 t/t7506-status-submodule.sh                 |    2 +-
 t/t7600-merge.sh                            |    2 +-
 t/t7601-merge-pull-config.sh                |   12 +++---
 t/t7610-mergetool.sh                        |    2 +-
 t/t7700-repack.sh                           |    2 +-
 t/t7800-difftool.sh                         |   11 +++---
 t/t8003-blame.sh                            |    6 ++--
 t/t9122-git-svn-author.sh                   |    4 +-
 t/t9123-git-svn-rebuild-with-rewriteroot.sh |    2 +-
 t/t9134-git-svn-ignore-paths.sh             |    6 ++--
 t/t9137-git-svn-dcommit-clobber-series.sh   |    2 +-
 t/t9138-git-svn-authors-prog.sh             |    6 ++--
 t/t9146-git-svn-empty-dirs.sh               |    6 ++--
 t/t9151-svn-mergeinfo.sh                    |   22 ++++++------
 t/t9200-git-cvsexportcommit.sh              |    4 +-
 t/t9401-git-cvsserver-crlf.sh               |    2 +-
 t/t9600-cvsimport.sh                        |    2 +-
 95 files changed, 305 insertions(+), 334 deletions(-)

-- 
1.7.3.95.g14291

^ permalink raw reply	[relevance 4%]

* Re: [RFC PATCHv2 13/16] t7001 (mv): add missing &&
  2010-09-24 22:22 19% ` [RFC PATCHv2 13/16] t7001 (mv): add missing && Elijah Newren
@ 2010-09-24 23:00  6%   ` Ævar Arnfjörð Bjarmason
  0 siblings, 0 replies; 200+ results
From: Ævar Arnfjörð Bjarmason @ 2010-09-24 23:00 UTC (permalink / raw)
  To: Elijah Newren; +Cc: git

On Fri, Sep 24, 2010 at 22:22, Elijah Newren <newren@gmail.com> wrote:
> FIXME: I believe the mv was meant to fail here so I added a test_must_fail;
> was that the right change?

Yeah, you can't mv an untracked file.

^ permalink raw reply	[relevance 6%]

* [RFC PATCHv2 13/16] t7001 (mv): add missing &&
  2010-09-24 22:22  4% [RFC PATCHv2 00/16] " Elijah Newren
@ 2010-09-24 22:22 19% ` Elijah Newren
  2010-09-24 23:00  6%   ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 200+ results
From: Elijah Newren @ 2010-09-24 22:22 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren

FIXME: I believe the mv was meant to fail here so I added a test_must_fail;
was that the right change?

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/t7001-mv.sh |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 65a35d9..624e6d2 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -61,7 +61,7 @@ test_expect_success \
 test_expect_success \
     'checking -f on untracked file with existing target' \
     'touch path0/untracked1 &&
-     git mv -f untracked1 path0
+     test_must_fail git mv -f untracked1 path0 &&
      test ! -f .git/index.lock &&
      test -f untracked1 &&
      test -f path0/untracked1'
-- 
1.7.3.95.g14291

^ permalink raw reply related	[relevance 19%]

* [RFC PATCHv2 00/16] Add missing &&'s in the testsuite
@ 2010-09-24 22:22  4% Elijah Newren
  2010-09-24 22:22 19% ` [RFC PATCHv2 13/16] t7001 (mv): add missing && Elijah Newren
  0 siblings, 1 reply; 200+ results
From: Elijah Newren @ 2010-09-24 22:22 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren

This patch series fixes many of the missing &&s in the testsuite.  I'm
certain there are still others I have missed.  While many of the
changes were simple and obvious (e.g. the 80 files changed in patch 16
of this series), some required other changes which I'd like some
feedback on.

Changes since v1:
  * Squashed all the trivial mechanical '&&' addition patches together
  * Re-ordered the other 15 patches by type of change

*** BLURB HERE ***

Elijah Newren (16):
  t3020 (ls-files-error-unmatch): remove stray '1' from end of file

I'm guessing this was a stray character typed in and unnoticed, but
perhaps it serves a real purpose that I just don't understand?


  t4017 (diff-retval): replace manual exit code check with test_expect_code

Several tests in t4017 just ran one command and tried to check it's
exit status, so they seemed like clear candidates for
test_expect_code.


  t1001 (read-tree-m-2way): add missing &&
  t1002 (read-tree-m-u-2way): add missing &&
  t4002 (diff-basic): use test_might_fail for commands that might fail
  t4202 (log): Replace '<git-command> || :' with test_might_fail

All four of these patches replace occurrences of things like
  command that should succeed || return 1
  command that will fail
with
  command that should succeed &&
  test_might_fail command that will fail &&


  t3600 (rm): add lots of missing &&
  t4019 (diff-wserror): add lots of missing &&
  t4026 (color): add missing &&
  t5602 (clone-remote-exec): add missing &&
  t6016 (rev-list-graph-simplify-history): add missing &&
  t6050 (replace): add missing &&
  t7001 (mv): add missing &&
  t7601 (merge-pull-config): add missing &&
  t7800 (difftool): add missing &&

These 9 tests needed modifications of various sorts to pass after
adding missing &&s.


  Add missing &&'s throughout the testsuite

One big patch for 80 files with simple addition of '&&' where it was
needed.


 t/t0001-init.sh                             |   20 +++++-----
 t/t0003-attributes.sh                       |   16 ++++----
 t/t0020-crlf.sh                             |    2 +-
 t/t0024-crlf-archive.sh                     |    4 +-
 t/t0026-eol-config.sh                       |    2 +-
 t/t0050-filesystem.sh                       |    6 ++--
 t/t1000-read-tree-m-3way.sh                 |    2 +-
 t/t1001-read-tree-m-2way.sh                 |   18 +++++-----
 t/t1002-read-tree-m-u-2way.sh               |   10 +++---
 t/t1302-repo-version.sh                     |    2 +-
 t/t1401-symbolic-ref.sh                     |    2 +-
 t/t1402-check-ref-format.sh                 |    4 +-
 t/t1410-reflog.sh                           |    8 ++--
 t/t1501-worktree.sh                         |    2 +-
 t/t1509-root-worktree.sh                    |    6 ++--
 t/t2007-checkout-symlink.sh                 |    2 +-
 t/t2016-checkout-patch.sh                   |    2 +-
 t/t2050-git-dir-relative.sh                 |    4 +-
 t/t2103-update-index-ignore-missing.sh      |    2 +-
 t/t2200-add-update.sh                       |    2 +-
 t/t3001-ls-files-others-exclude.sh          |    2 +-
 t/t3020-ls-files-error-unmatch.sh           |    1 -
 t/t3050-subprojects-fetch.sh                |    4 +-
 t/t3203-branch-output.sh                    |    6 ++--
 t/t3307-notes-man.sh                        |    2 +-
 t/t3406-rebase-message.sh                   |    6 ++--
 t/t3408-rebase-multi-line.sh                |    2 +-
 t/t3504-cherry-pick-rerere.sh               |    4 +-
 t/t3600-rm.sh                               |   38 +++++++++-----------
 t/t3903-stash.sh                            |    4 +-
 t/t3904-stash-patch.sh                      |    2 +-
 t/t4002-diff-basic.sh                       |   12 +++---
 t/t4017-diff-retval.sh                      |   30 +++++----------
 t/t4019-diff-wserror.sh                     |   52 +++++++++++++-------------
 t/t4021-format-patch-numbered.sh            |    2 +-
 t/t4026-color.sh                            |    2 +-
 t/t4027-diff-submodule.sh                   |    2 +-
 t/t4103-apply-binary.sh                     |    8 ++--
 t/t4104-apply-boundary.sh                   |    4 +-
 t/t4111-apply-subdir.sh                     |    4 +-
 t/t4119-apply-config.sh                     |    2 +-
 t/t4124-apply-ws-rule.sh                    |    4 +-
 t/t4127-apply-same-fn.sh                    |   18 +++++-----
 t/t4130-apply-criss-cross-rename.sh         |    2 +-
 t/t4133-apply-filenames.sh                  |    6 ++--
 t/t4150-am.sh                               |    2 +-
 t/t4202-log.sh                              |    2 +-
 t/t5300-pack-object.sh                      |    4 +-
 t/t5301-sliding-window.sh                   |    2 +-
 t/t5302-pack-index.sh                       |    2 +-
 t/t5500-fetch-pack.sh                       |    2 +-
 t/t5502-quickfetch.sh                       |    2 +-
 t/t5503-tagfollow.sh                        |    4 +-
 t/t5510-fetch.sh                            |    2 +-
 t/t5516-fetch-push.sh                       |   20 +++++-----
 t/t5517-push-mirror.sh                      |   10 +++---
 t/t5519-push-alternates.sh                  |    2 +-
 t/t5531-deep-submodule-push.sh              |    2 +-
 t/t5541-http-push.sh                        |    2 +-
 t/t5550-http-fetch.sh                       |    6 ++--
 t/t5601-clone.sh                            |    6 ++--
 t/t5602-clone-remote-exec.sh                |   14 ++++----
 t/t5701-clone-local.sh                      |    8 ++--
 t/t5705-clone-2gb.sh                        |    2 +-
 t/t6009-rev-list-parent.sh                  |    2 +-
 t/t6010-merge-base.sh                       |    2 +-
 t/t6016-rev-list-graph-simplify-history.sh  |   24 +++---------
 t/t6022-merge-rename.sh                     |    2 +-
 t/t6024-recursive-merge.sh                  |    2 +-
 t/t6030-bisect-porcelain.sh                 |    8 ++--
 t/t6040-tracking-info.sh                    |    2 +-
 t/t6050-replace.sh                          |    4 +-
 t/t7001-mv.sh                               |    2 +-
 t/t7004-tag.sh                              |   14 ++++----
 t/t7105-reset-patch.sh                      |    6 ++--
 t/t7300-clean.sh                            |    6 ++--
 t/t7501-commit.sh                           |    2 +-
 t/t7502-commit.sh                           |    2 +-
 t/t7506-status-submodule.sh                 |    2 +-
 t/t7600-merge.sh                            |    2 +-
 t/t7601-merge-pull-config.sh                |   12 +++---
 t/t7610-mergetool.sh                        |    2 +-
 t/t7700-repack.sh                           |    2 +-
 t/t7800-difftool.sh                         |   12 +++---
 t/t8003-blame.sh                            |    6 ++--
 t/t9122-git-svn-author.sh                   |    4 +-
 t/t9123-git-svn-rebuild-with-rewriteroot.sh |    2 +-
 t/t9134-git-svn-ignore-paths.sh             |    6 ++--
 t/t9137-git-svn-dcommit-clobber-series.sh   |    2 +-
 t/t9138-git-svn-authors-prog.sh             |    6 ++--
 t/t9146-git-svn-empty-dirs.sh               |    6 ++--
 t/t9151-svn-mergeinfo.sh                    |   22 ++++++------
 t/t9200-git-cvsexportcommit.sh              |    4 +-
 t/t9401-git-cvsserver-crlf.sh               |    2 +-
 t/t9600-cvsimport.sh                        |    2 +-
 95 files changed, 287 insertions(+), 314 deletions(-)

-- 
1.7.3.95.g14291

^ permalink raw reply	[relevance 4%]

* [RFC PATCH 00/95] Add missing &&'s in the testsuite
@ 2010-09-24 21:06  4% Elijah Newren
  0 siblings, 0 replies; 200+ results
From: Elijah Newren @ 2010-09-24 21:06 UTC (permalink / raw)
  To: git; +Cc: Elijah Newren

I ran across three testfiles which were missing &&s; one was missing
several, while another would no longer pass after adding one and had
no comment to that effect.  So I decided it was time to look through
the testsuite.  Now I have a 95 patch series, which I'm worried might
be a bit too much spam for the mailing list.  So the patches are
available from
   git://gitorious.org/~newren/git/en.git   add-missing-ands
Let me know if you're fine with mailing list spam, and I'd be happy
to flood all your inboxes.

80 of the 95 testfiles that needed changes were pretty mechanical --
just simple additions of '&&' in the appropriate place.  15 needed
other changes and I'm not entirely sure whether I made the right ones.
I've moved those 15 to the beginning of the series, so that you won't
have to hunt for them.  (If it makes sense to send just the first 15
to the list, let me know, and I'll do that.)


Elijah Newren (95):
  t6050 (replace): add missing &&
  t1001 (read-tree-m-2way): add missing &&
  t1002 (read-tree-m-u-2way): add missing &&
  t3020 (ls-files-error-unmatch): remove stray '1' from end of file
  t3600 (rm): add lots of missing &&
  t4002 (diff-basic): use test_might_fail for commands that might fail
  t4017 (diff-retval): replace manual exit code check with test_expect_code
  t4019 (diff-wserror): add lots of missing &&
  t4026 (color): add missing &&
  t4202 (log): Replace '<git-command> || :' with test_might_fail
  t5602 (clone-remote-exec): add missing &&
  t6016 (rev-list-graph-simplify-history): add missing &&
  t7001 (mv): add missing &&
  t7601 (merge-pull-config): add missing &&
  t7800 (difftool): add missing &&
  t0001 (init): add missing &&
  t0003 (attributes): add missing &&
  t0020 (crlf): add missing &&
  t0024 (crlf-archive): add missing &&
  t0026 (eol-config): add missing &&
  t0050 (filesystem): add missing &&
  t1000 (read-tree-m-3way): add missing &&
  t1302 (repo-version): add missing &&
  t1401 (symbolic-ref): add missing &&
  t1402 (check-ref-format): add missing &&
  t1410 (reflog): add missing &&
  t1501 (worktree): add missing &&
  t1509 (root-worktree): add missing &&
  t2007 (checkout-symlink): add missing &&
  t2016 (checkout-patch): add missing &&
  t2050 (git-dir-relative): add missing &&
  t2103 (update-index-ignore-missing): add missing &&
  t2200 (add-update): add missing &&
  t3001 (ls-files-others-exclude): add missing &&
  t3050 (subprojects-fetch): add missing &&
  t3203 (branch-output): add missing &&
  t3307 (notes-man): add missing &&
  t3406 (rebase-message): add missing &&
  t3408 (rebase-multi-line): add missing &&
  t3504 (cherry-pick-rerere): add missing &&
  t3903 (stash): add missing &&
  t3904 (stash-patch): add missing &&
  t4021 (format-patch-numbered): add missing &&
  t4027 (diff-submodule): add missing &&
  t4103 (apply-binary): add missing &&
  t4104 (apply-boundary): add missing &&
  t4111 (apply-subdir): add missing &&
  t4119 (apply-config): add missing &&
  t4124 (apply-ws-rule): add missing &&
  t4127 (apply-same-fn): add missing &&
  t4130 (apply-criss-cross-rename): add missing &&
  t4133 (apply-filenames): add missing &&
  t4150 (am): add missing &&
  t5300 (pack-object): add missing &&
  t5301 (sliding-window): add missing &&
  t5302 (pack-index): add missing &&
  t5500 (fetch-pack): add missing &&
  t5502 (quickfetch): add missing &&
  t5503 (tagfollow): add missing &&
  t5510 (fetch): add missing &&
  t5516 (fetch-push): add missing &&
  t5517 (push-mirror): add missing &&
  t5519 (push-alternates): add missing &&
  t5531 (deep-submodule-push): add missing &&
  t5541 (http-push): add missing &&
  t5550 (http-fetch): add missing &&
  t5601 (clone): add missing &&
  t5701 (clone-local): add missing &&
  t5705 (clone-2gb): add missing &&
  t6009 (rev-list-parent): add missing &&
  t6010 (merge-base): add missing &&
  t6022 (merge-rename): add a missing &&
  t6024 (recursive-merge): add missing &&
  t6030 (bisect-porcelain): add missing &&
  t6040 (tracking-info): add missing &&
  t7004 (tag): add missing &&
  t7105 (reset-patch): add missing &&
  t7300 (clean): add missing &&
  t7501 (commit): add missing &&
  t7502 (commit): add missing &&
  t7506 (status-submodule): add missing &&
  t7600 (merge): add missing &&
  t7610 (mergetool): add missing &&
  t7700 (repack): add missing &&
  t8003 (blame): add missing &&
  t9122 (git-svn-author): add missing &&
  t9123 (git-svn-rebuild-with-rewriteroot): add missing &&
  t9134 (git-svn-ignore-paths): add missing &&
  t9137 (git-svn-dcommit-clobber-series): add missing &&
  t9138 (git-svn-authors-prog): add missing &&
  t9146 (git-svn-empty-dirs): add missing &&
  t9151 (svn-mergeinfo): add missing &&
  t9200 (git-cvsexportcommit): add missing &&
  t9401 (git-cvsserver-crlf): add missing &&
  t9600 (cvsimport): add missing &&

 t/t0001-init.sh                             |   20 +++++-----
 t/t0003-attributes.sh                       |   16 ++++----
 t/t0020-crlf.sh                             |    2 +-
 t/t0024-crlf-archive.sh                     |    4 +-
 t/t0026-eol-config.sh                       |    2 +-
 t/t0050-filesystem.sh                       |    6 ++--
 t/t1000-read-tree-m-3way.sh                 |    2 +-
 t/t1001-read-tree-m-2way.sh                 |   18 +++++-----
 t/t1002-read-tree-m-u-2way.sh               |   10 +++---
 t/t1302-repo-version.sh                     |    2 +-
 t/t1401-symbolic-ref.sh                     |    2 +-
 t/t1402-check-ref-format.sh                 |    4 +-
 t/t1410-reflog.sh                           |    8 ++--
 t/t1501-worktree.sh                         |    2 +-
 t/t1509-root-worktree.sh                    |    6 ++--
 t/t2007-checkout-symlink.sh                 |    2 +-
 t/t2016-checkout-patch.sh                   |    2 +-
 t/t2050-git-dir-relative.sh                 |    4 +-
 t/t2103-update-index-ignore-missing.sh      |    2 +-
 t/t2200-add-update.sh                       |    2 +-
 t/t3001-ls-files-others-exclude.sh          |    2 +-
 t/t3020-ls-files-error-unmatch.sh           |    1 -
 t/t3050-subprojects-fetch.sh                |    4 +-
 t/t3203-branch-output.sh                    |    6 ++--
 t/t3307-notes-man.sh                        |    2 +-
 t/t3406-rebase-message.sh                   |    6 ++--
 t/t3408-rebase-multi-line.sh                |    2 +-
 t/t3504-cherry-pick-rerere.sh               |    4 +-
 t/t3600-rm.sh                               |   38 +++++++++-----------
 t/t3903-stash.sh                            |    4 +-
 t/t3904-stash-patch.sh                      |    2 +-
 t/t4002-diff-basic.sh                       |   12 +++---
 t/t4017-diff-retval.sh                      |   30 +++++----------
 t/t4019-diff-wserror.sh                     |   52 +++++++++++++-------------
 t/t4021-format-patch-numbered.sh            |    2 +-
 t/t4026-color.sh                            |    2 +-
 t/t4027-diff-submodule.sh                   |    2 +-
 t/t4103-apply-binary.sh                     |    8 ++--
 t/t4104-apply-boundary.sh                   |    4 +-
 t/t4111-apply-subdir.sh                     |    4 +-
 t/t4119-apply-config.sh                     |    2 +-
 t/t4124-apply-ws-rule.sh                    |    4 +-
 t/t4127-apply-same-fn.sh                    |   18 +++++-----
 t/t4130-apply-criss-cross-rename.sh         |    2 +-
 t/t4133-apply-filenames.sh                  |    6 ++--
 t/t4150-am.sh                               |    2 +-
 t/t4202-log.sh                              |    2 +-
 t/t5300-pack-object.sh                      |    4 +-
 t/t5301-sliding-window.sh                   |    2 +-
 t/t5302-pack-index.sh                       |    2 +-
 t/t5500-fetch-pack.sh                       |    2 +-
 t/t5502-quickfetch.sh                       |    2 +-
 t/t5503-tagfollow.sh                        |    4 +-
 t/t5510-fetch.sh                            |    2 +-
 t/t5516-fetch-push.sh                       |   20 +++++-----
 t/t5517-push-mirror.sh                      |   10 +++---
 t/t5519-push-alternates.sh                  |    2 +-
 t/t5531-deep-submodule-push.sh              |    2 +-
 t/t5541-http-push.sh                        |    2 +-
 t/t5550-http-fetch.sh                       |    6 ++--
 t/t5601-clone.sh                            |    6 ++--
 t/t5602-clone-remote-exec.sh                |   14 ++++----
 t/t5701-clone-local.sh                      |    8 ++--
 t/t5705-clone-2gb.sh                        |    2 +-
 t/t6009-rev-list-parent.sh                  |    2 +-
 t/t6010-merge-base.sh                       |    2 +-
 t/t6016-rev-list-graph-simplify-history.sh  |   24 +++---------
 t/t6022-merge-rename.sh                     |    2 +-
 t/t6024-recursive-merge.sh                  |    2 +-
 t/t6030-bisect-porcelain.sh                 |    8 ++--
 t/t6040-tracking-info.sh                    |    2 +-
 t/t6050-replace.sh                          |    4 +-
 t/t7001-mv.sh                               |    2 +-
 t/t7004-tag.sh                              |   14 ++++----
 t/t7105-reset-patch.sh                      |    6 ++--
 t/t7300-clean.sh                            |    6 ++--
 t/t7501-commit.sh                           |    2 +-
 t/t7502-commit.sh                           |    2 +-
 t/t7506-status-submodule.sh                 |    2 +-
 t/t7600-merge.sh                            |    2 +-
 t/t7601-merge-pull-config.sh                |   12 +++---
 t/t7610-mergetool.sh                        |    2 +-
 t/t7700-repack.sh                           |    2 +-
 t/t7800-difftool.sh                         |   12 +++---
 t/t8003-blame.sh                            |    6 ++--
 t/t9122-git-svn-author.sh                   |    4 +-
 t/t9123-git-svn-rebuild-with-rewriteroot.sh |    2 +-
 t/t9134-git-svn-ignore-paths.sh             |    6 ++--
 t/t9137-git-svn-dcommit-clobber-series.sh   |    2 +-
 t/t9138-git-svn-authors-prog.sh             |    6 ++--
 t/t9146-git-svn-empty-dirs.sh               |    6 ++--
 t/t9151-svn-mergeinfo.sh                    |   22 ++++++------
 t/t9200-git-cvsexportcommit.sh              |    4 +-
 t/t9401-git-cvsserver-crlf.sh               |    2 +-
 t/t9600-cvsimport.sh                        |    2 +-
 95 files changed, 287 insertions(+), 314 deletions(-)

-- 
1.7.3.95.g14291

^ permalink raw reply	[relevance 4%]

* Re: [PATCH] Several tests: cd inside subshell instead of around
  @ 2010-09-07  2:37  4%   ` Jonathan Nieder
  0 siblings, 0 replies; 200+ results
From: Jonathan Nieder @ 2010-09-07  2:37 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Jens Lehmann, Git Mailing List

Junio C Hamano wrote:

> If we were to insist that no matter how an individual test fail, the test
> that follows it must start in a known location (namely, $TRASH), then we
> might want to use something like the attached patch.

I like it.  Affected test scripts:

  t0003-attributes.sh		t0050-filesystem.sh
  t1007-hash-object.sh		t1020-subdirectory.sh
  t1301-shared-repo.sh		t1500-rev-parse.sh
  t1501-worktree.sh		t1504-ceiling-dirs.sh
  t2050-git-dir-relative.sh	t2300-cd-to-toplevel.sh
  t3407-rebase-abort.sh		t4119-apply-config.sh
  t5300-pack-object.sh		t5404-tracking-branches.sh
  t5406-remote-rejects.sh	t5510-fetch.sh
  t5515-fetch-merge-logic.sh	t5520-pull.sh
  t5530-upload-pack-error.sh	t5600-clone-fail-cleanup.sh
  t5700-clone-reference.sh	t5701-clone-local.sh
  t5710-info-alternate.sh	t6029-merge-subtree.sh
  t7001-mv.sh			t7103-reset-bare.sh
  t7400-submodule-basic.sh	t7401-submodule-summary.sh
  t7408-submodule-reference.sh	t7610-mergetool.sh
  t9101-git-svn-props.sh	t9103-git-svn-tracked-directory-removed.sh
  t9113-git-svn-dcommit-new-file.sh
  t9115-git-svn-dcommit-funky-renames.sh
  t9117-git-svn-init-clone.sh
  t9137-git-svn-dcommit-clobber-series.sh
  t9400-git-cvsserver-server.sh

and probably some others.

What is the ",$(pwd)" for?

diff --git a/t/test-lib.sh b/t/test-lib.sh
index 29fd720..90ed4d9 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -370,6 +370,11 @@ test_debug () {
 }
 
 test_run_ () {
+	if test ",$(pwd)" != ",$TRASH_DIRECTORY"
+	then
+		error "bug in test script: starting from a different directory"
+	fi
+
 	test_cleanup=:
 	eval >&3 2>&4 "$1"
 	eval_ret=$?
@@ -377,6 +382,11 @@ test_run_ () {
 	if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
 		echo ""
 	fi
+
+	if test ",$(pwd)" != ",$TRASH_DIRECTORY"
+	then
+		error "bug in test script: moved to a different directory"
+	fi
 	return 0
 }
 
-- 

^ permalink raw reply related	[relevance 4%]

* [PATCH] Fixed typo
@ 2009-12-02  1:35 13% Richard Hartmann
  0 siblings, 0 replies; 200+ results
From: Richard Hartmann @ 2009-12-02  1:35 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 40 bytes --]

Hi all,

please see attached.


Richard

[-- Attachment #2: 0001-Typos-commiting-committing.patch --]
[-- Type: text/x-diff, Size: 1751 bytes --]

From 138b95638693b47251d61ed5f316b6e68002b766 Mon Sep 17 00:00:00 2001
From: Richard Hartmann <richih.mailinglist@gmail.com>
Date: Wed, 2 Dec 2009 02:33:17 +0100
Subject: [PATCH] Typos: commiting -> committing

---
 builtin-revert.c |    2 +-
 t/t7001-mv.sh    |    8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/builtin-revert.c b/builtin-revert.c
index 151aa6a..5708908 100644
--- a/builtin-revert.c
+++ b/builtin-revert.c
@@ -216,7 +216,7 @@ static char *help_msg(const unsigned char *sha1)
 
 	if (action == CHERRY_PICK) {
 		sprintf(helpbuf + strlen(helpbuf),
-			"\nWhen commiting, use the option "
+			"\nWhen committing, use the option "
 			"'-c %s' to retain authorship and message.",
 			find_unique_abbrev(sha1, DEFAULT_ABBREV));
 	}
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 10b8f8c..ad93a97 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -16,7 +16,7 @@ test_expect_success \
 
 # in path0 currently
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'cd .. && git commit -m move-out -a'
 
 test_expect_success \
@@ -30,7 +30,7 @@ test_expect_success \
 
 # in path0 currently
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'cd .. && git commit -m move-in -a'
 
 test_expect_success \
@@ -82,7 +82,7 @@ test_expect_success \
     'git mv path0 path2'
 
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'git commit -m dir-move -a'
 
 test_expect_success \
@@ -101,7 +101,7 @@ test_expect_success \
     'git mv path2 path1'
 
 test_expect_success \
-    'commiting the change' \
+    'committing the change' \
     'git commit -m dir-move -a'
 
 test_expect_success \
-- 
1.6.5.2


^ permalink raw reply related	[relevance 13%]

* Re: [JGIT PATCH 2/2] Make Repository.isValidRefName compatible with Git 1.6.3
  @ 2009-05-08  0:47  7%         ` Shawn O. Pearce
  0 siblings, 0 replies; 200+ results
From: Shawn O. Pearce @ 2009-05-08  0:47 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Linus Torvalds, Robin Rosenberg, Git Mailing List

Junio C Hamano <gitster@pobox.com> wrote:
> Linus Torvalds <torvalds@linux-foundation.org> writes:
> >> 
> >> In 3e262b95c509 I taught C Git to disallow refs whose names end in
> >> ".lock".
> >
> > Btw, I think we should revert that, and instead change our naming for 
> > lock-files.
> 
> '..lck' may be a good name to use here.

I agree.  So much so that I wrote a patch for you.

--8<--
Change .lock suffix to ..lck

In 3e262b95c509 I taught Git to deny creation of refs whose name
ends in ".lock", as the loose ref scanner skips over these under
the assumption that they are refs being modified by a concurrent
process operating on the same repository.

Linus pointed out that the name "fix.vm.lock" is an otherwise
perfectly valid branch name, except the ".lock" suffix conflicts
with the internal implementation detail of how Git manages doing
an atomic update.

Instead, change the name to "..lck", as suggested by Junio.

This uses the same storage space in memory as ".lock", so we can do
a fairly dumb search-replace to make the change, but the ".." prefix
has been forbidden in a ref name for ages, to prevent "a..b" from
being ambiguous as a single ref name, or as the pair "^a b".

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 Documentation/git-check-ref-format.txt   |    2 --
 Documentation/technical/api-lockfile.txt |    4 ++--
 builtin-reflog.c                         |    2 +-
 config.c                                 |    2 +-
 lockfile.c                               |   10 +++++-----
 refs.c                                   |   11 ++++-------
 t/t3505-cherry-pick-empty.sh             |    2 +-
 t/t3600-rm.sh                            |    4 ++--
 t/t4123-apply-shrink.sh                  |    2 +-
 t/t7001-mv.sh                            |    4 ++--
 t/t7502-commit.sh                        |    2 +-
 t/test-lib.sh                            |    6 +++---
 12 files changed, 23 insertions(+), 28 deletions(-)

diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt
index c1ce268..7c0f0ea 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/Documentation/git-check-ref-format.txt
@@ -34,8 +34,6 @@ imposes the following rules on how references are named:
 
 . They cannot end with a slash `/` nor a dot `.`.
 
-. They cannot end with the sequence `.lock`.
-
 . They cannot contain a sequence `@{`.
 
 These rules make it easy for shell script based tools to parse
diff --git a/Documentation/technical/api-lockfile.txt b/Documentation/technical/api-lockfile.txt
index dd89404..982984f 100644
--- a/Documentation/technical/api-lockfile.txt
+++ b/Documentation/technical/api-lockfile.txt
@@ -4,9 +4,9 @@ lockfile API
 The lockfile API serves two purposes:
 
 * Mutual exclusion.  When we write out a new index file, first
-  we create a new file `$GIT_DIR/index.lock`, write the new
+  we create a new file `$GIT_DIR/index..lck`, write the new
   contents into it, and rename it to the final destination
-  `$GIT_DIR/index`.  We try to create the `$GIT_DIR/index.lock`
+  `$GIT_DIR/index`.  We try to create the `$GIT_DIR/index..lck`
   file with O_EXCL so that we can notice and fail when somebody
   else is already trying to update the index file.
 
diff --git a/builtin-reflog.c b/builtin-reflog.c
index ddfdf5a..19baf07 100644
--- a/builtin-reflog.c
+++ b/builtin-reflog.c
@@ -341,7 +341,7 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
 	if (!file_exists(log_file))
 		goto finish;
 	if (!cmd->dry_run) {
-		newlog_path = git_pathdup("logs/%s.lock", ref);
+		newlog_path = git_pathdup("logs/%s..lck", ref);
 		cb.newlog = fopen(newlog_path, "w");
 	}
 
diff --git a/config.c b/config.c
index 1682273..50ecc1e 100644
--- a/config.c
+++ b/config.c
@@ -925,7 +925,7 @@ int git_config_set(const char *key, const char *value)
  *
  * This function does this:
  *
- * - it locks the config file by creating ".git/config.lock"
+ * - it locks the config file by creating ".git/config..lck"
  *
  * - it then parses the config using store_aux() as validator to find
  *   the position on the key/value pair to replace. If it is to be unset,
diff --git a/lockfile.c b/lockfile.c
index 828d19f..61ff5cb 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -129,11 +129,11 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
 	strcpy(lk->filename, path);
 	/*
 	 * subtract 5 from size to make sure there's room for adding
-	 * ".lock" for the lock file name
+	 * "..lck" for the lock file name
 	 */
 	if (!(flags & LOCK_NODEREF))
 		resolve_symlink(lk->filename, sizeof(lk->filename)-5);
-	strcat(lk->filename, ".lock");
+	strcat(lk->filename, "..lck");
 	lk->fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
 	if (0 <= lk->fd) {
 		if (!lock_file_list) {
@@ -159,13 +159,13 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
 NORETURN void unable_to_lock_index_die(const char *path, int err)
 {
 	if (err == EEXIST) {
-		die("Unable to create '%s.lock': %s.\n\n"
+		die("Unable to create '%s..lck': %s.\n\n"
 		    "If no other git process is currently running, this probably means a\n"
 		    "git process crashed in this repository earlier. Make sure no other git\n"
 		    "process is running and remove the file manually to continue.",
 		    path, strerror(err));
 	} else {
-		die("Unable to create '%s.lock': %s", path, strerror(err));
+		die("Unable to create '%s..lck': %s", path, strerror(err));
 	}
 }
 
@@ -219,7 +219,7 @@ int commit_lock_file(struct lock_file *lk)
 	if (lk->fd >= 0 && close_lock_file(lk))
 		return -1;
 	strcpy(result_file, lk->filename);
-	i = strlen(result_file) - 5; /* .lock */
+	i = strlen(result_file) - 5; /* ..lck */
 	result_file[i] = 0;
 	if (rename(lk->filename, result_file))
 		return -1;
diff --git a/refs.c b/refs.c
index e65a3b4..b4ca305 100644
--- a/refs.c
+++ b/refs.c
@@ -266,7 +266,7 @@ static struct ref_list *get_ref_dir(const char *base, struct ref_list *list)
 			namelen = strlen(de->d_name);
 			if (namelen > 255)
 				continue;
-			if (has_extension(de->d_name, ".lock"))
+			if (has_extension(de->d_name, "..lck"))
 				continue;
 			memcpy(ref + baselen, de->d_name, namelen+1);
 			if (stat(git_path("%s", ref), &st) < 0)
@@ -681,7 +681,6 @@ int for_each_rawref(each_ref_fn fn, void *cb_data)
  * - it has double dots "..", or
  * - it has ASCII control character, "~", "^", ":" or SP, anywhere, or
  * - it ends with a "/".
- * - it ends with ".lock"
  */
 
 static inline int bad_ref_char(int ch)
@@ -743,8 +742,6 @@ int check_ref_format(const char *ref)
 				return CHECK_REF_FORMAT_ERROR;
 			if (level < 2)
 				return CHECK_REF_FORMAT_ONELEVEL;
-			if (has_extension(ref, ".lock"))
-				return CHECK_REF_FORMAT_ERROR;
 			return ret;
 		}
 	}
@@ -996,7 +993,7 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt)
 		const char *path;
 
 		if (!(delopt & REF_NODEREF)) {
-			i = strlen(lock->lk->filename) - 5; /* .lock */
+			i = strlen(lock->lk->filename) - 5; /* ..lck */
 			lock->lk->filename[i] = 0;
 			path = lock->lk->filename;
 		} else {
@@ -1363,7 +1360,7 @@ int create_symref(const char *ref_target, const char *refs_heads_master,
 		error("refname too long: %s", refs_heads_master);
 		goto error_free_return;
 	}
-	lockpath = mkpath("%s.lock", git_HEAD);
+	lockpath = mkpath("%s..lck", git_HEAD);
 	fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
 	if (fd < 0) {
 		error("Unable to open %s for writing", lockpath);
@@ -1593,7 +1590,7 @@ static int do_for_each_reflog(const char *base, each_ref_fn fn, void *cb_data)
 			namelen = strlen(de->d_name);
 			if (namelen > 255)
 				continue;
-			if (has_extension(de->d_name, ".lock"))
+			if (has_extension(de->d_name, "..lck"))
 				continue;
 			memcpy(log + baselen, de->d_name, namelen+1);
 			if (stat(git_path("logs/%s", log), &st) < 0)
diff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh
index 9aaeabd..3b7aa6d 100755
--- a/t/t3505-cherry-pick-empty.sh
+++ b/t/t3505-cherry-pick-empty.sh
@@ -26,7 +26,7 @@ test_expect_code 1 'cherry-pick an empty commit' '
 
 test_expect_success 'index lockfile was removed' '
 
-	test ! -f .git/index.lock
+	test ! -f .git/index..lck
 
 '
 
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 76b1bb4..e437cf7 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -264,9 +264,9 @@ test_expect_success 'choking "git rm" should not let it die with cruft' '
 	    i=$(( $i + 1 ))
 	done | git update-index --index-info &&
 	git rm -n "some-file-*" | :;
-	test -f .git/index.lock
+	test -f .git/index..lck
 	status=$?
-	rm -f .git/index.lock
+	rm -f .git/index..lck
 	git reset -q --hard
 	test "$status" != 0
 '
diff --git a/t/t4123-apply-shrink.sh b/t/t4123-apply-shrink.sh
index 984157f..fcd6a67 100755
--- a/t/t4123-apply-shrink.sh
+++ b/t/t4123-apply-shrink.sh
@@ -47,7 +47,7 @@ test_expect_success 'apply should fail gracefully' '
 	else
 		status=$?
 		echo "Status was $status"
-		if test -f .git/index.lock
+		if test -f .git/index..lck
 		then
 			echo Oops, should not have crashed
 			false
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 10b8f8c..afe8240 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -62,14 +62,14 @@ test_expect_success \
     'checking -f on untracked file with existing target' \
     'touch path0/untracked1 &&
      git mv -f untracked1 path0
-     test ! -f .git/index.lock &&
+     test ! -f .git/index..lck &&
      test -f untracked1 &&
      test -f path0/untracked1'
 
 # clean up the mess in case bad things happen
 rm -f idontexist untracked1 untracked2 \
      path0/idontexist path0/untracked1 path0/untracked2 \
-     .git/index.lock
+     .git/index..lck
 
 test_expect_success \
     'adding another file' \
diff --git a/t/t7502-commit.sh b/t/t7502-commit.sh
index 56cd866..100da27 100755
--- a/t/t7502-commit.sh
+++ b/t/t7502-commit.sh
@@ -241,7 +241,7 @@ test_expect_success EXECKEEPSPID 'a SIGTERM should break locks' '
 	  GIT_EDITOR=.git/FAKE_EDITOR
 	  export GIT_EDITOR
 	  exec git commit -a'\'' &&
-	test ! -f .git/index.lock
+	test ! -f .git/index..lck
 '
 
 rm -f .git/MERGE_MSG .git/COMMIT_EDITMSG
diff --git a/t/test-lib.sh b/t/test-lib.sh
index dad1437..ecce338 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -558,13 +558,13 @@ else
 		test -h "$2" &&
 		test "$1" = "$(readlink "$2")" || {
 			# be super paranoid
-			if mkdir "$2".lock
+			if mkdir "$2"..lck
 			then
 				rm -f "$2" &&
 				ln -s "$1" "$2" &&
-				rm -r "$2".lock
+				rm -r "$2"..lck
 			else
-				while test -d "$2".lock
+				while test -d "$2"..lck
 				do
 					say "Waiting for lock on $2."
 					sleep 1
-- 
1.6.3.195.gad81


-- 
Shawn.

^ permalink raw reply related	[relevance 7%]

* Bug in test-lib.sh: test_create_repo() / RFC
@ 2009-04-20 14:51  4% Michael J Gruber
  0 siblings, 0 replies; 200+ results
From: Michael J Gruber @ 2009-04-20 14:51 UTC (permalink / raw)
  To: Git Mailing List

Hi there,

running the test suite with -v for the upcoming release exposed a
certain problem with test_create_repo() whose consequences I can't quite
fathom at the moment. That means: I don't know whether it's maint
material or forbidden fruits during rc-cycle...

Problem:
Since a6d63b7 (test-lib: avoid assuming that templates/ are in the
GIT_EXEC_PATH, 2009-02-04), test_create_repo() assumes to be called from
a directory such that `pwd`/../templates/blt/ contains templates for
git-init.

Several tests (see below) call test_create_repo() from a different
directory, which means the repo is created without any of the default
files (and that a mv .git/hooks .git/hooks-disabled later in the
function errors out). Now, for most tests this probably doesn't matter
at all but it's not nice.

RFC:
I see several possible solutions:

- Make sure all tests use test_create_repo() from t/. Cumbersome and
fragile.

- Simply use $(TEST_DIRECTORY)/../templates/blt/. Nice and easy. But
uses the templates from the git repo containing t/ even when testing
against and installed git (just like now, for most of the tests).

- Teach git a "--templates-dir" option similar to "--html-path" and use
that (from the git actually being tested). Means we use the templates
belonging to the tested git; but also means we can test only git
versions containing that new option.

What do you think?

Michael

Affected tests:
t0050-filesystem.sh
t1007-hash-object.sh
t1302-repo-version.sh
t2103-update-index-ignore-missing.sh
t4027-diff-submodule.sh
t5300-pack-object.sh
t5513-fetch-track.sh
t5600-clone-fail-cleanup.sh
t5601-clone.sh
t5700-clone-reference.sh
t5710-info-alternate.sh
t6026-merge-attr.sh
t7001-mv.sh
t7010-setup.sh
t7401-submodule-summary.sh
t7506-status-submodule.sh
t7508-status.sh

^ permalink raw reply	[relevance 4%]

* [PATCH 10/16] Use prerequisite tags to skip tests that depend on symbolic links
  2009-03-21 21:26  3% [PATCH 00/16] Tests on Windows - main part Johannes Sixt
@ 2009-03-21 21:26  4% ` Johannes Sixt
  0 siblings, 0 replies; 200+ results
From: Johannes Sixt @ 2009-03-21 21:26 UTC (permalink / raw)
  To: git; +Cc: Johannes Sixt

Many tests depend on that symbolic links work.  This introduces a check
that sets the prerequisite tag SYMLINKS if the file system supports
symbolic links.  Since so many tests have to check for this prerequisite,
we do the check in test-lib.sh, so that we don't need to repeat the test
in many scripts.

To check for 'ln -s' failures, you can use a FAT partition on Linux:

$ mkdosfs -C git-on-fat 1000000
$ sudo mount -o loop,uid=j6t,gid=users,shortname=winnt git-on-fat /mnt

Clone git to /mnt and

$ GIT_SKIP_TESTS='t0001.1[34] t0010 t1301 t403[34] t4129.[47] t5701.7
          t7701.3 t9100 t9101.26 t9119 t9124.[67] t9200.10 t9600.6' \
        make test

(These additionally skipped tests depend on POSIX permissions that FAT on
Linux does not provide.)

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
 t/t0000-basic.sh                       |   43 +++++++++++++++++++++++---------
 t/t0055-beyond-symlinks.sh             |    6 ++--
 t/t1004-read-tree-m-u-wf.sh            |    6 ++--
 t/t1020-subdirectory.sh                |    2 +-
 t/t1300-repo-config.sh                 |    2 +-
 t/t2001-checkout-cache-clash.sh        |    6 ++--
 t/t2003-checkout-cache-mkdir.sh        |    8 +++---
 t/t2004-checkout-cache-temp.sh         |    2 +-
 t/t2007-checkout-symlink.sh            |    6 ++++
 t/t2100-update-cache-badpath.sh        |   14 +++++++++-
 t/t2200-add-update.sh                  |    2 +-
 t/t2201-add-update-typechange.sh       |   16 +++++++++--
 t/t2300-cd-to-toplevel.sh              |   14 +++++-----
 t/t3000-ls-files-others.sh             |    7 ++++-
 t/t3010-ls-files-killed-modified.sh    |   17 ++++++++++--
 t/t3100-ls-tree-restrict.sh            |   40 +++++++++++++++++++----------
 t/t3200-branch.sh                      |    2 +-
 t/t3700-add.sh                         |    6 ++--
 t/t4004-diff-rename-symlink.sh         |    7 +++++
 t/t4008-diff-break-rewrite.sh          |    8 +++---
 t/t4011-diff-symlink.sh                |    7 +++++
 t/t4023-diff-rename-typechange.sh      |    7 +++++
 t/t4114-apply-typechange.sh            |    7 +++++
 t/t4115-apply-symlink.sh               |    7 +++++
 t/t4122-apply-symlink-inside.sh        |    7 +++++
 t/t5000-tar-tree.sh                    |    6 +++-
 t/t5522-pull-symlink.sh                |    7 +++++
 t/t7001-mv.sh                          |    4 +-
 t/t9131-git-svn-empty-symlink.sh       |    2 +-
 t/t9132-git-svn-broken-symlink.sh      |    4 +-
 t/t9500-gitweb-standalone-no-errors.sh |   11 ++++++--
 t/test-lib.sh                          |    4 +++
 32 files changed, 211 insertions(+), 76 deletions(-)

diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
index c53de1f..f4ca4fc 100755
--- a/t/t0000-basic.sh
+++ b/t/t0000-basic.sh
@@ -115,12 +115,31 @@ test_expect_success \
     'test "$tree" = 4b825dc642cb6eb9a060e54bf8d69288fbee4904'
 
 # Various types of objects
+# Some filesystems do not support symblic links; on such systems
+# some expected values are different
 mkdir path2 path3 path3/subp3
-for p in path0 path2/file2 path3/file3 path3/subp3/file3
+paths='path0 path2/file2 path3/file3 path3/subp3/file3'
+for p in $paths
 do
     echo "hello $p" >$p
-    ln -s "hello $p" ${p}sym
 done
+if test_have_prereq SYMLINKS
+then
+	for p in $paths
+	do
+		ln -s "hello $p" ${p}sym
+	done
+	expectfilter=cat
+	expectedtree=087704a96baf1c2d1c869a8b084481e121c88b5b
+	expectedptree1=21ae8269cacbe57ae09138dcc3a2887f904d02b3
+	expectedptree2=3c5e5399f3a333eddecce7a9b9465b63f65f51e2
+else
+	expectfilter='grep -v sym'
+	expectedtree=8e18edf7d7edcf4371a3ac6ae5f07c2641db7c46
+	expectedptree1=cfb8591b2f65de8b8cc1020cd7d9e67e7793b325
+	expectedptree2=ce580448f0148b985a513b693fdf7d802cacb44f
+fi
+
 test_expect_success \
     'adding various types of objects with git update-index --add.' \
     'find path* ! -type d -print | xargs git update-index --add'
@@ -130,7 +149,7 @@ test_expect_success \
     'showing stage with git ls-files --stage' \
     'git ls-files --stage >current'
 
-cat >expected <<\EOF
+$expectfilter >expected <<\EOF
 100644 f87290f8eb2cbbea7857214459a0739927eab154 0	path0
 120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0	path0sym
 100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0	path2/file2
@@ -149,7 +168,7 @@ test_expect_success \
     'tree=$(git write-tree)'
 test_expect_success \
     'validate object ID for a known tree.' \
-    'test "$tree" = 087704a96baf1c2d1c869a8b084481e121c88b5b'
+    'test "$tree" = "$expectedtree"'
 
 test_expect_success \
     'showing tree with git ls-tree' \
@@ -160,7 +179,7 @@ cat >expected <<\EOF
 040000 tree 58a09c23e2ca152193f2786e06986b7b6712bdbe	path2
 040000 tree 21ae8269cacbe57ae09138dcc3a2887f904d02b3	path3
 EOF
-test_expect_success \
+test_expect_success SYMLINKS \
     'git ls-tree output for a known tree.' \
     'test_cmp expected current'
 
@@ -169,7 +188,7 @@ test_expect_success \
 test_expect_success \
     'showing tree with git ls-tree -r' \
     'git ls-tree -r $tree >current'
-cat >expected <<\EOF
+$expectfilter >expected <<\EOF
 100644 blob f87290f8eb2cbbea7857214459a0739927eab154	path0
 120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01	path0sym
 100644 blob 3feff949ed00a62d9f7af97c15cd8a30595e7ac7	path2/file2
@@ -200,7 +219,7 @@ cat >expected <<\EOF
 100644 blob 00fb5908cb97c2564a9783c0c64087333b3b464f	path3/subp3/file3
 120000 blob 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c	path3/subp3/file3sym
 EOF
-test_expect_success \
+test_expect_success SYMLINKS \
     'git ls-tree -r output for a known tree.' \
     'test_cmp expected current'
 
@@ -209,14 +228,14 @@ test_expect_success \
     'ptree=$(git write-tree --prefix=path3)'
 test_expect_success \
     'validate object ID for a known tree.' \
-    'test "$ptree" = 21ae8269cacbe57ae09138dcc3a2887f904d02b3'
+    'test "$ptree" = "$expectedptree1"'
 
 test_expect_success \
     'writing partial tree out with git write-tree --prefix.' \
     'ptree=$(git write-tree --prefix=path3/subp3)'
 test_expect_success \
     'validate object ID for a known tree.' \
-    'test "$ptree" = 3c5e5399f3a333eddecce7a9b9465b63f65f51e2'
+    'test "$ptree" = "$expectedptree2"'
 
 cat >badobjects <<EOF
 100644 blob 1000000000000000000000000000000000000000	dir/file1
@@ -249,7 +268,7 @@ test_expect_success \
      newtree=$(git write-tree) &&
      test "$newtree" = "$tree"'
 
-cat >expected <<\EOF
+$expectfilter >expected <<\EOF
 :100644 100644 f87290f8eb2cbbea7857214459a0739927eab154 0000000000000000000000000000000000000000 M	path0
 :120000 120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0000000000000000000000000000000000000000 M	path0sym
 :100644 100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0000000000000000000000000000000000000000 M	path2/file2
@@ -272,7 +291,7 @@ test_expect_success \
     'git diff-files >current && cmp -s current /dev/null'
 
 ################################################################
-P=087704a96baf1c2d1c869a8b084481e121c88b5b
+P=$expectedtree
 test_expect_success \
     'git commit-tree records the correct tree in a commit.' \
     'commit0=$(echo NO | git commit-tree $P) &&
@@ -308,7 +327,7 @@ test_expect_success 'update-index D/F conflict' '
 	test $numpath0 = 1
 '
 
-test_expect_success 'absolute path works as expected' '
+test_expect_success SYMLINKS 'absolute path works as expected' '
 	mkdir first &&
 	ln -s ../.git first/.git &&
 	mkdir second &&
diff --git a/t/t0055-beyond-symlinks.sh b/t/t0055-beyond-symlinks.sh
index b29c37a..0c6ff56 100755
--- a/t/t0055-beyond-symlinks.sh
+++ b/t/t0055-beyond-symlinks.sh
@@ -4,7 +4,7 @@ test_description='update-index and add refuse to add beyond symlinks'
 
 . ./test-lib.sh
 
-test_expect_success setup '
+test_expect_success SYMLINKS setup '
 	>a &&
 	mkdir b &&
 	ln -s b c &&
@@ -12,12 +12,12 @@ test_expect_success setup '
 	git update-index --add a b/d
 '
 
-test_expect_success 'update-index --add beyond symlinks' '
+test_expect_success SYMLINKS 'update-index --add beyond symlinks' '
 	test_must_fail git update-index --add c/d &&
 	! ( git ls-files | grep c/d )
 '
 
-test_expect_success 'add beyond symlinks' '
+test_expect_success SYMLINKS 'add beyond symlinks' '
 	test_must_fail git add c/d &&
 	! ( git ls-files | grep c/d )
 '
diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh
index 570d372..f19b4a2 100755
--- a/t/t1004-read-tree-m-u-wf.sh
+++ b/t/t1004-read-tree-m-u-wf.sh
@@ -157,7 +157,7 @@ test_expect_success '3-way not overwriting local changes (their side)' '
 
 '
 
-test_expect_success 'funny symlink in work tree' '
+test_expect_success SYMLINKS 'funny symlink in work tree' '
 
 	git reset --hard &&
 	git checkout -b sym-b side-b &&
@@ -177,7 +177,7 @@ test_expect_success 'funny symlink in work tree' '
 
 '
 
-test_expect_success 'funny symlink in work tree, un-unlink-able' '
+test_expect_success SYMLINKS 'funny symlink in work tree, un-unlink-able' '
 
 	rm -fr a b &&
 	git reset --hard &&
@@ -189,7 +189,7 @@ test_expect_success 'funny symlink in work tree, un-unlink-able' '
 '
 
 # clean-up from the above test
-chmod a+w a
+chmod a+w a 2>/dev/null
 rm -fr a b
 
 test_expect_success 'D/F setup' '
diff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh
index fc386ba..210e594 100755
--- a/t/t1020-subdirectory.sh
+++ b/t/t1020-subdirectory.sh
@@ -126,7 +126,7 @@ test_expect_success 'no file/rev ambiguity check inside a bare repo' '
 	cd foo.git && git show -s HEAD
 '
 
-test_expect_success 'detection should not be fooled by a symlink' '
+test_expect_success SYMLINKS 'detection should not be fooled by a symlink' '
 	cd "$HERE" &&
 	rm -fr foo.git &&
 	git clone -s .git another &&
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index 3c06842..64663e1 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -726,7 +726,7 @@ echo >>result
 
 test_expect_success '--null --get-regexp' 'cmp result expect'
 
-test_expect_success 'symlinked configuration' '
+test_expect_success SYMLINKS 'symlinked configuration' '
 
 	ln -s notyet myconfig &&
 	GIT_CONFIG=myconfig git config test.frotz nitfol &&
diff --git a/t/t2001-checkout-cache-clash.sh b/t/t2001-checkout-cache-clash.sh
index ef00753..98aa73e 100755
--- a/t/t2001-checkout-cache-clash.sh
+++ b/t/t2001-checkout-cache-clash.sh
@@ -59,10 +59,10 @@ test_expect_success \
     'git read-tree -m $tree1 && git checkout-index -f -a'
 test_debug 'show_files $tree1'
 
-ln -s path0 path1
-test_expect_success \
+test_expect_success SYMLINKS \
     'git update-index --add a symlink.' \
-    'git update-index --add path1'
+    'ln -s path0 path1 &&
+     git update-index --add path1'
 test_expect_success \
     'writing tree out with git write-tree' \
     'tree3=$(git write-tree)'
diff --git a/t/t2003-checkout-cache-mkdir.sh b/t/t2003-checkout-cache-mkdir.sh
index 71894b3..02a4fc5 100755
--- a/t/t2003-checkout-cache-mkdir.sh
+++ b/t/t2003-checkout-cache-mkdir.sh
@@ -19,7 +19,7 @@ test_expect_success \
     echo rezrov >path1/file1 &&
     git update-index --add path0 path1/file1'
 
-test_expect_success \
+test_expect_success SYMLINKS \
     'have symlink in place where dir is expected.' \
     'rm -fr path0 path1 &&
      mkdir path2 &&
@@ -59,7 +59,7 @@ test_expect_success \
      test ! -f path1/file1'
 
 # Linus fix #1
-test_expect_success \
+test_expect_success SYMLINKS \
     'use --prefix=tmp/orary/ where tmp is a symlink' \
     'rm -fr path0 path1 path2 tmp* &&
      mkdir tmp1 tmp1/orary &&
@@ -71,7 +71,7 @@ test_expect_success \
      test -h tmp'
 
 # Linus fix #2
-test_expect_success \
+test_expect_success SYMLINKS \
     'use --prefix=tmp/orary- where tmp is a symlink' \
     'rm -fr path0 path1 path2 tmp* &&
      mkdir tmp1 &&
@@ -82,7 +82,7 @@ test_expect_success \
      test -h tmp'
 
 # Linus fix #3
-test_expect_success \
+test_expect_success SYMLINKS \
     'use --prefix=tmp- where tmp-path1 is a symlink' \
     'rm -fr path0 path1 path2 tmp* &&
      mkdir tmp1 &&
diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh
index 39133b8..36cca14 100755
--- a/t/t2004-checkout-cache-temp.sh
+++ b/t/t2004-checkout-cache-temp.sh
@@ -194,7 +194,7 @@ test_expect_success \
  test $(cat ../$s1) = tree1asubdir/path5)
 )'
 
-test_expect_success \
+test_expect_success SYMLINKS \
 'checkout --temp symlink' '
 rm -f path* .merge_* out .git/index &&
 ln -s b a &&
diff --git a/t/t2007-checkout-symlink.sh b/t/t2007-checkout-symlink.sh
index 0526fce..20f3343 100755
--- a/t/t2007-checkout-symlink.sh
+++ b/t/t2007-checkout-symlink.sh
@@ -6,6 +6,12 @@ test_description='git checkout to switch between branches with symlink<->dir'
 
 . ./test-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say "symbolic links not supported - skipping tests"
+	test_done
+fi
+
 test_expect_success setup '
 
 	mkdir frotz &&
diff --git a/t/t2100-update-cache-badpath.sh b/t/t2100-update-cache-badpath.sh
index 6ef2dcf..2df3fdd 100755
--- a/t/t2100-update-cache-badpath.sh
+++ b/t/t2100-update-cache-badpath.sh
@@ -26,7 +26,12 @@ All of the attempts should fail.
 
 mkdir path2 path3
 date >path0
-ln -s xyzzy path1
+if test_have_prereq SYMLINKS
+then
+	ln -s xyzzy path1
+else
+	date > path1
+fi
 date >path2/file2
 date >path3/file3
 
@@ -38,7 +43,12 @@ rm -fr path?
 
 mkdir path0 path1
 date >path2
-ln -s frotz path3
+if test_have_prereq SYMLINKS
+then
+	ln -s frotz path3
+else
+	date > path3
+fi
 date >path0/file0
 date >path1/file1
 
diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh
index 5a8d52f..9120750 100755
--- a/t/t2200-add-update.sh
+++ b/t/t2200-add-update.sh
@@ -80,7 +80,7 @@ test_expect_success 'change gets noticed' '
 
 '
 
-test_expect_success 'replace a file with a symlink' '
+test_expect_success SYMLINKS 'replace a file with a symlink' '
 
 	rm foo &&
 	ln -s top foo &&
diff --git a/t/t2201-add-update-typechange.sh b/t/t2201-add-update-typechange.sh
index d24c7d9..2e8f702 100755
--- a/t/t2201-add-update-typechange.sh
+++ b/t/t2201-add-update-typechange.sh
@@ -11,7 +11,13 @@ test_expect_success setup '
 	_empty=$(git hash-object --stdin <xyzzy) &&
 	>yomin &&
 	>caskly &&
-	ln -s frotz nitfol &&
+	if test_have_prereq SYMLINKS; then
+		ln -s frotz nitfol &&
+		T_letter=T
+	else
+		printf %s frotz > nitfol &&
+		T_letter=M
+	fi &&
 	mkdir rezrov &&
 	>rezrov/bozbar &&
 	git add caskly xyzzy yomin nitfol rezrov/bozbar &&
@@ -29,7 +35,11 @@ test_expect_success modify '
 	>nitfol &&
 	# rezrov/bozbar disappears
 	rm -fr rezrov &&
-	ln -s xyzzy rezrov &&
+	if test_have_prereq SYMLINKS; then
+		ln -s xyzzy rezrov
+	else
+		printf %s xyzzy > rezrov
+	fi &&
 	# xyzzy disappears (not a submodule)
 	mkdir xyzzy &&
 	echo gnusto >xyzzy/bozbar &&
@@ -71,7 +81,7 @@ test_expect_success modify '
 				s/blob/000000/
 			}
 			/	nitfol/{
-				s/	nitfol/ $_z40 T&/
+				s/	nitfol/ $_z40 $T_letter&/
 				s/blob/100644/
 			}
 			/	rezrov.bozbar/{
diff --git a/t/t2300-cd-to-toplevel.sh b/t/t2300-cd-to-toplevel.sh
index 293dc35..3b01ad2 100755
--- a/t/t2300-cd-to-toplevel.sh
+++ b/t/t2300-cd-to-toplevel.sh
@@ -5,7 +5,7 @@ test_description='cd_to_toplevel'
 . ./test-lib.sh
 
 test_cd_to_toplevel () {
-	test_expect_success "$2" '
+	test_expect_success $3 "$2" '
 		(
 			cd '"'$1'"' &&
 			. git-sh-setup &&
@@ -24,14 +24,14 @@ test_cd_to_toplevel repo 'at physical root'
 
 test_cd_to_toplevel repo/sub/dir 'at physical subdir'
 
-ln -s repo symrepo
-test_cd_to_toplevel symrepo 'at symbolic root'
+ln -s repo symrepo 2>/dev/null
+test_cd_to_toplevel symrepo 'at symbolic root' SYMLINKS
 
-ln -s repo/sub/dir subdir-link
-test_cd_to_toplevel subdir-link 'at symbolic subdir'
+ln -s repo/sub/dir subdir-link 2>/dev/null
+test_cd_to_toplevel subdir-link 'at symbolic subdir' SYMLINKS
 
 cd repo
-ln -s sub/dir internal-link
-test_cd_to_toplevel internal-link 'at internal symbolic subdir'
+ln -s sub/dir internal-link 2>/dev/null
+test_cd_to_toplevel internal-link 'at internal symbolic subdir' SYMLINKS
 
 test_done
diff --git a/t/t3000-ls-files-others.sh b/t/t3000-ls-files-others.sh
index 36eee0f..b7e0306 100755
--- a/t/t3000-ls-files-others.sh
+++ b/t/t3000-ls-files-others.sh
@@ -17,7 +17,12 @@ filesystem.
 . ./test-lib.sh
 
 date >path0
-ln -s xyzzy path1
+if test_have_prereq SYMLINKS
+then
+	ln -s xyzzy path1
+else
+	date > path1
+fi
 mkdir path2 path3
 date >path2/file2
 date >path2-junk
diff --git a/t/t3010-ls-files-killed-modified.sh b/t/t3010-ls-files-killed-modified.sh
index e4f02a0..95671c2 100755
--- a/t/t3010-ls-files-killed-modified.sh
+++ b/t/t3010-ls-files-killed-modified.sh
@@ -38,7 +38,12 @@ modified without reporting path9 and path10.
 . ./test-lib.sh
 
 date >path0
-ln -s xyzzy path1
+if test_have_prereq SYMLINKS
+then
+	ln -s xyzzy path1
+else
+	date > path1
+fi
 mkdir path2 path3
 date >path2/file2
 date >path3/file3
@@ -52,8 +57,14 @@ test_expect_success \
 
 rm -fr path? ;# leave path10 alone
 date >path2
-ln -s frotz path3
-ln -s nitfol path5
+if test_have_prereq SYMLINKS
+then
+	ln -s frotz path3
+	ln -s nitfol path5
+else
+	date > path3
+	date > path5
+fi
 mkdir path0 path1 path6
 date >path0/file0
 date >path1/file1
diff --git a/t/t3100-ls-tree-restrict.sh b/t/t3100-ls-tree-restrict.sh
index 6e6a254..ee60d03 100755
--- a/t/t3100-ls-tree-restrict.sh
+++ b/t/t3100-ls-tree-restrict.sh
@@ -22,9 +22,21 @@ test_expect_success \
     'setup' \
     'mkdir path2 path2/baz &&
      echo Hi >path0 &&
-     ln -s path0 path1 &&
+     if test_have_prereq SYMLINKS
+     then
+	ln -s path0 path1 &&
+	ln -s ../path1 path2/bazbo
+	make_expected () {
+		cat >expected
+	}
+     else
+	printf path0 > path1 &&
+	printf ../path1 > path2/bazbo
+	make_expected () {
+		sed -e "s/120000 /100644 /" >expected
+	}
+     fi &&
      echo Lo >path2/foo &&
-     ln -s ../path1 path2/bazbo &&
      echo Mi >path2/baz/b &&
      find path? \( -type f -o -type l \) -print |
      xargs git update-index --add &&
@@ -41,7 +53,7 @@ test_output () {
 test_expect_success \
     'ls-tree plain' \
     'git ls-tree $tree >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 100644 blob X	path0
 120000 blob X	path1
 040000 tree X	path2
@@ -51,7 +63,7 @@ EOF
 test_expect_success \
     'ls-tree recursive' \
     'git ls-tree -r $tree >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 100644 blob X	path0
 120000 blob X	path1
 100644 blob X	path2/baz/b
@@ -63,7 +75,7 @@ EOF
 test_expect_success \
     'ls-tree recursive with -t' \
     'git ls-tree -r -t $tree >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 100644 blob X	path0
 120000 blob X	path1
 040000 tree X	path2
@@ -77,7 +89,7 @@ EOF
 test_expect_success \
     'ls-tree recursive with -d' \
     'git ls-tree -r -d $tree >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 040000 tree X	path2
 040000 tree X	path2/baz
 EOF
@@ -86,7 +98,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path' \
     'git ls-tree $tree path >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 EOF
      test_output'
 
@@ -96,7 +108,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path1 path0' \
     'git ls-tree $tree path1 path0 >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 100644 blob X	path0
 120000 blob X	path1
 EOF
@@ -105,7 +117,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path0/' \
     'git ls-tree $tree path0/ >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 EOF
      test_output'
 
@@ -114,7 +126,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2' \
     'git ls-tree $tree path2 >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 040000 tree X	path2
 EOF
      test_output'
@@ -123,7 +135,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2/' \
     'git ls-tree $tree path2/ >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 040000 tree X	path2/baz
 120000 blob X	path2/bazbo
 100644 blob X	path2/foo
@@ -135,7 +147,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2/baz' \
     'git ls-tree $tree path2/baz >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 040000 tree X	path2/baz
 EOF
      test_output'
@@ -143,14 +155,14 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2/bak' \
     'git ls-tree $tree path2/bak >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 EOF
      test_output'
 
 test_expect_success \
     'ls-tree -t filtered with path2/bak' \
     'git ls-tree -t $tree path2/bak >current &&
-     cat >expected <<\EOF &&
+     make_expected <<\EOF &&
 040000 tree X	path2
 EOF
      test_output'
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index 61a2010..f82bcdb 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -121,7 +121,7 @@ test_expect_success 'renaming a symref is not allowed' \
 	! test -f .git/refs/heads/master3
 '
 
-test_expect_success \
+test_expect_success SYMLINKS \
     'git branch -m u v should fail when the reflog for u is a symlink' '
      git branch -l u &&
      mv .git/logs/refs/heads/u real-u &&
diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 9f6454d..e98f982 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -30,7 +30,7 @@ test_expect_success \
 	 *) echo fail; git ls-files --stage xfoo1; (exit 1);;
 	 esac'
 
-test_expect_success 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
 	rm -f xfoo1 &&
 	ln -s foo xfoo1 &&
 	git add xfoo1 &&
@@ -51,7 +51,7 @@ test_expect_success \
 	 *) echo fail; git ls-files --stage xfoo2; (exit 1);;
 	 esac'
 
-test_expect_success 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
 	rm -f xfoo2 &&
 	ln -s foo xfoo2 &&
 	git update-index --add xfoo2 &&
@@ -61,7 +61,7 @@ test_expect_success 'git add: filemode=0 should not get confused by symlink' '
 	esac
 '
 
-test_expect_success \
+test_expect_success SYMLINKS \
 	'git update-index --add: Test that executable bit is not used...' \
 	'git config core.filemode 0 &&
 	 ln -s xfoo2 xfoo3 &&
diff --git a/t/t4004-diff-rename-symlink.sh b/t/t4004-diff-rename-symlink.sh
index b35af9b..3db7444 100755
--- a/t/t4004-diff-rename-symlink.sh
+++ b/t/t4004-diff-rename-symlink.sh
@@ -12,6 +12,13 @@ by an edit for them.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say 'Symbolic links not supported, skipping tests.'
+	test_done
+	exit
+fi
+
 test_expect_success \
     'prepare reference tree' \
     'echo xyzzy | tr -d '\\\\'012 >yomin &&
diff --git a/t/t4008-diff-break-rewrite.sh b/t/t4008-diff-break-rewrite.sh
index 7e343a9..e19ca65 100755
--- a/t/t4008-diff-break-rewrite.sh
+++ b/t/t4008-diff-break-rewrite.sh
@@ -99,7 +99,7 @@ test_expect_success \
     'validate result of -B -M (#4)' \
     'compare_diff_raw expected current'
 
-test_expect_success \
+test_expect_success SYMLINKS \
     'make file0 into something completely different' \
     'rm -f file0 &&
      ln -s frotz file0 &&
@@ -114,7 +114,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100	file1
 EOF
 
-test_expect_success \
+test_expect_success SYMLINKS \
     'validate result of -B (#5)' \
     'compare_diff_raw expected current'
 
@@ -129,7 +129,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 R	file0	file1
 EOF
 
-test_expect_success \
+test_expect_success SYMLINKS \
     'validate result of -B -M (#6)' \
     'compare_diff_raw expected current'
 
@@ -144,7 +144,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M	file1
 EOF
 
-test_expect_success \
+test_expect_success SYMLINKS \
     'validate result of -M (#7)' \
     'compare_diff_raw expected current'
 
diff --git a/t/t4011-diff-symlink.sh b/t/t4011-diff-symlink.sh
index 9055c8b..3a81309 100755
--- a/t/t4011-diff-symlink.sh
+++ b/t/t4011-diff-symlink.sh
@@ -9,6 +9,13 @@ test_description='Test diff of symlinks.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say 'Symbolic links not supported, skipping tests.'
+	test_done
+	exit
+fi
+
 cat > expected << EOF
 diff --git a/frotz b/frotz
 new file mode 120000
diff --git a/t/t4023-diff-rename-typechange.sh b/t/t4023-diff-rename-typechange.sh
index 297ddb5..5099862 100755
--- a/t/t4023-diff-rename-typechange.sh
+++ b/t/t4023-diff-rename-typechange.sh
@@ -4,6 +4,13 @@ test_description='typechange rename detection'
 
 . ./test-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say 'Symbolic links not supported, skipping tests.'
+	test_done
+	exit
+fi
+
 test_expect_success setup '
 
 	rm -f foo bar &&
diff --git a/t/t4114-apply-typechange.sh b/t/t4114-apply-typechange.sh
index 0f185ca..7dc35de 100755
--- a/t/t4114-apply-typechange.sh
+++ b/t/t4114-apply-typechange.sh
@@ -9,6 +9,13 @@ test_description='git apply should not get confused with type changes.
 
 . ./test-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say 'Symbolic links not supported, skipping tests.'
+	test_done
+	exit
+fi
+
 test_expect_success 'setup repository and commits' '
 	echo "hello world" > foo &&
 	echo "hi planet" > bar &&
diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh
index 9ace578..1a3aea3 100755
--- a/t/t4115-apply-symlink.sh
+++ b/t/t4115-apply-symlink.sh
@@ -9,6 +9,13 @@ test_description='git apply symlinks and partial files
 
 . ./test-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say 'Symbolic links not supported, skipping tests.'
+	test_done
+	exit
+fi
+
 test_expect_success setup '
 
 	ln -s path1/path2/path3/path4/path5 link1 &&
diff --git a/t/t4122-apply-symlink-inside.sh b/t/t4122-apply-symlink-inside.sh
index 841773f..8aad20b 100755
--- a/t/t4122-apply-symlink-inside.sh
+++ b/t/t4122-apply-symlink-inside.sh
@@ -3,6 +3,13 @@
 test_description='apply to deeper directory without getting fooled with symlink'
 . ./test-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say 'Symbolic links not supported, skipping tests.'
+	test_done
+	exit
+fi
+
 lecho () {
 	for l_
 	do
diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh
index 7a84ab6..60a4b8d 100755
--- a/t/t5000-tar-tree.sh
+++ b/t/t5000-tar-tree.sh
@@ -37,7 +37,11 @@ test_expect_success \
      cp /bin/sh a/bin &&
      printf "A\$Format:%s\$O" "$SUBSTFORMAT" >a/substfile1 &&
      printf "A not substituted O" >a/substfile2 &&
-     ln -s a a/l1 &&
+     if test_have_prereq SYMLINKS; then
+	ln -s a a/l1
+     else
+	printf %s a > a/l1
+     fi &&
      (p=long_path_to_a_file && cd a &&
       for depth in 1 2 3 4 5; do mkdir $p && cd $p; done &&
       echo text >file_with_long_path) &&
diff --git a/t/t5522-pull-symlink.sh b/t/t5522-pull-symlink.sh
index 5672b51..d887eb6 100755
--- a/t/t5522-pull-symlink.sh
+++ b/t/t5522-pull-symlink.sh
@@ -4,6 +4,13 @@ test_description='pulling from symlinked subdir'
 
 . ./test-lib.sh
 
+if ! test_have_prereq SYMLINKS
+then
+	say 'Symbolic links not supported, skipping tests.'
+	test_done
+	exit
+fi
+
 # The scenario we are building:
 #
 #   trash\ directory/
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 8fb3a56..10b8f8c 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -206,7 +206,7 @@ test_expect_success 'git mv should not change sha1 of moved cache entry' '
 
 rm -f dirty dirty2
 
-test_expect_success 'git mv should overwrite symlink to a file' '
+test_expect_success SYMLINKS 'git mv should overwrite symlink to a file' '
 
 	rm -fr .git &&
 	git init &&
@@ -225,7 +225,7 @@ test_expect_success 'git mv should overwrite symlink to a file' '
 
 rm -f moved symlink
 
-test_expect_success 'git mv should overwrite file with a symlink' '
+test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
 
 	rm -fr .git &&
 	git init &&
diff --git a/t/t9131-git-svn-empty-symlink.sh b/t/t9131-git-svn-empty-symlink.sh
index 8f35e29..9a24a65 100755
--- a/t/t9131-git-svn-empty-symlink.sh
+++ b/t/t9131-git-svn-empty-symlink.sh
@@ -88,7 +88,7 @@ test_expect_success 'enable broken symlink workaround' \
 test_expect_success '"bar" is an empty file' 'test -f x/bar && ! test -s x/bar'
 test_expect_success 'get "bar" => symlink fix from svn' \
 		'(cd x && git svn rebase)'
-test_expect_success '"bar" becomes a symlink' 'test -L x/bar'
+test_expect_success SYMLINKS '"bar" becomes a symlink' 'test -L x/bar'
 
 
 test_expect_success 'clone using git svn' 'git svn clone -r1 "$svnrepo" y'
diff --git a/t/t9132-git-svn-broken-symlink.sh b/t/t9132-git-svn-broken-symlink.sh
index b8de59e..6c4c90b 100755
--- a/t/t9132-git-svn-broken-symlink.sh
+++ b/t/t9132-git-svn-broken-symlink.sh
@@ -85,7 +85,7 @@ EOF
 
 test_expect_success 'clone using git svn' 'git svn clone -r1 "$svnrepo" x'
 
-test_expect_success '"bar" is a symlink that points to "asdf"' '
+test_expect_success SYMLINKS '"bar" is a symlink that points to "asdf"' '
 	test -L x/bar &&
 	(cd x && test xasdf = x"`git cat-file blob HEAD:bar`")
 '
@@ -94,7 +94,7 @@ test_expect_success 'get "bar" => symlink fix from svn' '
 	(cd x && git svn rebase)
 '
 
-test_expect_success '"bar" remains a proper symlink' '
+test_expect_success SYMLINKS '"bar" remains a proper symlink' '
 	test -L x/bar &&
 	(cd x && test xdoink = x"`git cat-file blob HEAD:bar`")
 '
diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh
index dce06bc..9ec5030 100755
--- a/t/t9500-gitweb-standalone-no-errors.sh
+++ b/t/t9500-gitweb-standalone-no-errors.sh
@@ -246,7 +246,7 @@ test_expect_success \
 	 gitweb_run "p=.git;a=commitdiff"'
 test_debug 'cat gitweb.log'
 
-test_expect_success \
+test_expect_success SYMLINKS \
 	'commitdiff(0): file to symlink' \
 	'rm renamed_file &&
 	 ln -s file renamed_file &&
@@ -308,7 +308,7 @@ test_debug 'cat gitweb.log'
 # ----------------------------------------------------------------------
 # commitdiff testing (taken from t4114-apply-typechange.sh)
 
-test_expect_success 'setup typechange commits' '
+test_expect_success SYMLINKS 'setup typechange commits' '
 	echo "hello world" > foo &&
 	echo "hi planet" > bar &&
 	git update-index --add foo bar &&
@@ -418,7 +418,12 @@ test_expect_success \
 	 git mv 04-rename-from 04-rename-to &&
 	 echo "Changed" >> 04-rename-to &&
 	 test_chmod +x 05-mode-change &&
-	 rm -f 06-file-or-symlink && ln -s 01-change 06-file-or-symlink &&
+	 rm -f 06-file-or-symlink &&
+	 if test_have_prereq SYMLINKS; then
+		ln -s 01-change 06-file-or-symlink
+	 else
+		printf %s 01-change > 06-file-or-symlink
+	 fi &&
 	 echo "Changed and have mode changed" > 07-change-mode-change	&&
 	 test_chmod +x 07-change-mode-change &&
 	 git commit -a -m "Large commit" &&
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 3c65cfe..5337e89 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -689,3 +689,7 @@ case $(uname -s) in
 	}
 	;;
 esac
+
+# test whether the filesystem supports symbolic links
+ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
+rm -f y
-- 
1.6.2.1.224.g2225f

^ permalink raw reply related	[relevance 4%]

* [PATCH 00/16] Tests on Windows - main part
@ 2009-03-21 21:26  3% Johannes Sixt
  2009-03-21 21:26  4% ` [PATCH 10/16] Use prerequisite tags to skip tests that depend on symbolic links Johannes Sixt
  0 siblings, 1 reply; 200+ results
From: Johannes Sixt @ 2009-03-21 21:26 UTC (permalink / raw)
  To: git; +Cc: Johannes Sixt

This is the remaining set of changes after which the test suite
passes with the MinGW port. Well, almost: There still are a few
failures, but none of them indicate a serious bug. We will address
them later.

The series is again available from here:

  git://repo.or.cz/git/mingw/j6t.git for-junio

It builds on js/windows-tests (a8cbc9ab).

The heart of this series is an addition to the test infrastructure:
Tests can be tagged by a keyword, which indicates that a particular
feature ("prerequisite") is needed. This idea was presented by Junio
some time ago, but I didn't save away the implementation.

The new features are used in this way:

1. The prerequisite is tested for and the tag is defined:

    if frob --mode=nicate 2>/dev/null; then
	test_set_prereq FROBNICATE
    else
	say "frobnication not possible, skipping some tests
    fi

2. Tests are tagged by the tag name:

    test_expect_success FROBNICATE 'frobnication' '
	frob --mode=nicate
    '

   Such a test is skipped if the tag was not defined before.

3. The prerequisite can also be tested for explicitly:

    if test_have_prereq FROBNICATE; then
	expect=foo
    else
	expect=bar
    fi

I have considered a different approach to define prerequisites,
namely with a helper function that is similar to test_expect_*:

    test_prereq FROBNICATE 'frobnication' '
	frob --mode=nicate 2>/dev/null
    '

but I find it a bit obfuscating.

Currently most prerequisites are tested for on demand. Symbolic
links are tested for in test-lib.sh because so many test scripts
need it. An option would be to move each test in its own file
that would then be sourced on demand.


Johannes Sixt (16):
  test-lib: Work around incompatible sort and find on Windows
  test-lib: Work around missing sum on Windows
  Tests on Windows: $(pwd) must return Windows-style paths
  t0050: Check whether git init detected symbolic link support
    correctly
  test-lib: Infrastructure to test and check for prerequisites
  t3600: Use test prerequisite tags
  Skip tests that fail if the executable bit is not handled by the
    filesystem
  t5302: Use prerequisite tags to skip 64-bit offset tests
  t9100, t9129: Use prerequisite tags for UTF-8 tests
  Use prerequisite tags to skip tests that depend on symbolic links
  t0060: Fix tests on Windows
  Skip tests that require a filesystem that obeys POSIX permissions
  t3700: Skip a test with backslashes in pathspec
  Use prerequisites to skip tests that need unzip
  t7004: Use prerequisite tags to skip tests that need gpg
  t5503: GIT_DEBUG_SEND_PACK is not supported on MinGW

 t/t0000-basic.sh                       |   58 +++++++++++++---
 t/t0004-unwritable.sh                  |    8 +-
 t/t0024-crlf-archive.sh                |    6 +-
 t/t0050-filesystem.sh                  |   28 +++++++-
 t/t0055-beyond-symlinks.sh             |    6 +-
 t/t0060-path-utils.sh                  |  116 +++++++++++++++++++++++---------
 t/t1004-read-tree-m-u-wf.sh            |    6 +-
 t/t1020-subdirectory.sh                |    2 +-
 t/t1300-repo-config.sh                 |    2 +-
 t/t1301-shared-repo.sh                 |   10 ++--
 t/t1504-ceiling-dirs.sh                |    2 +-
 t/t2001-checkout-cache-clash.sh        |    6 +-
 t/t2003-checkout-cache-mkdir.sh        |    8 +-
 t/t2004-checkout-cache-temp.sh         |    2 +-
 t/t2007-checkout-symlink.sh            |    6 ++
 t/t2100-update-cache-badpath.sh        |   14 +++-
 t/t2200-add-update.sh                  |    2 +-
 t/t2201-add-update-typechange.sh       |   16 ++++-
 t/t2300-cd-to-toplevel.sh              |   14 ++--
 t/t3000-ls-files-others.sh             |    7 ++-
 t/t3010-ls-files-killed-modified.sh    |   17 ++++-
 t/t3100-ls-tree-restrict.sh            |   40 +++++++----
 t/t3200-branch.sh                      |    2 +-
 t/t3600-rm.sh                          |   58 ++++++++--------
 t/t3700-add.sh                         |   16 ++--
 t/t3701-add-interactive.sh             |    9 ++-
 t/t4004-diff-rename-symlink.sh         |    7 ++
 t/t4008-diff-break-rewrite.sh          |    8 +-
 t/t4011-diff-symlink.sh                |    7 ++
 t/t4023-diff-rename-typechange.sh      |    7 ++
 t/t4102-apply-rename.sh                |    8 ++-
 t/t4114-apply-typechange.sh            |    7 ++
 t/t4115-apply-symlink.sh               |    7 ++
 t/t4122-apply-symlink-inside.sh        |    7 ++
 t/t4129-apply-samemode.sh              |   19 ++++--
 t/t5000-tar-tree.sh                    |   22 ++++---
 t/t5302-pack-index.sh                  |   15 ++---
 t/t5503-tagfollow.sh                   |    7 ++
 t/t5522-pull-symlink.sh                |    7 ++
 t/t6031-merge-recursive.sh             |   13 ++++
 t/t6200-fmt-merge-msg.sh               |    4 +-
 t/t7001-mv.sh                          |    4 +-
 t/t7004-tag.sh                         |   97 +++++++++++++-------------
 t/t7503-pre-commit-hook.sh             |    4 +-
 t/t7504-commit-msg-hook.sh             |    8 +-
 t/t9100-git-svn-basic.sh               |   37 +++++------
 t/t9129-git-svn-i18n-commitencoding.sh |   22 +++---
 t/t9131-git-svn-empty-symlink.sh       |    2 +-
 t/t9132-git-svn-broken-symlink.sh      |    4 +-
 t/t9200-git-cvsexportcommit.sh         |   13 ++--
 t/t9500-gitweb-standalone-no-errors.sh |   11 ++-
 t/test-lib.sh                          |   74 +++++++++++++++++++--
 52 files changed, 594 insertions(+), 288 deletions(-)

^ permalink raw reply	[relevance 3%]

* [ANNOUNCE] GIT 1.6.1.3
@ 2009-02-07 21:54  4% Junio C Hamano
  0 siblings, 0 replies; 200+ results
From: Junio C Hamano @ 2009-02-07 21:54 UTC (permalink / raw)
  To: git; +Cc: linux-kernel

The latest maintenance release GIT 1.6.1.3 is available at the
usual places:

  http://www.kernel.org/pub/software/scm/git/

  git-1.6.1.3.tar.{gz,bz2}			(source tarball)
  git-htmldocs-1.6.1.3.tar.{gz,bz2}		(preformatted docs)
  git-manpages-1.6.1.3.tar.{gz,bz2}		(preformatted docs)

The RPM binary packages for a few architectures are also provided
as courtesy.

  RPMS/$arch/git-*-1.6.1.3-1.fc9.$arch.rpm	(RPM)

GIT v1.6.1.3 Release Notes
==========================

Fixes since v1.6.1.2
--------------------

* "git diff --binary | git apply" pipeline did not work well when
  a binary blob is changed to a symbolic link.

* Some combinations of -b/-w/--ignore-space-at-eol to "git diff" did
  not work as expected.

* "git grep" did not pass the -I (ignore binary) option when
  calling out an external grep program.

* "git log" and friends include HEAD to the set of starting points
  when --all is given.  This makes a difference when you are not
  on any branch.

* "git mv" to move an untracked file to overwrite a tracked
  contents misbehaved.

* "git merge -s octopus" with many potential merge bases did not
  work correctly.

* RPM binary package installed the html manpages in a wrong place.

Also includes minor documentation fixes and updates.

----------------------------------------------------------------

Changes since v1.6.1.2 are as follows:

Anders Melchiorsen (2):
      Documentation: more git push examples
      Documentation: rework src/dst description in git push

David J. Mellor (1):
      Fixed broken git help -w when installing from RPM

Guanqun Lu (2):
      fix typo in Documentation
      add test-dump-cache-tree in Makefile

Johannes Schindelin (2):
      revision walker: include a detached HEAD in --all
      apply: fix access to an uninitialized mode variable, found by valgrind

Junio C Hamano (6):
      bundle: allow the same ref to be given more than once
      Documentation: simplify refspec format description
      diff.c: output correct index lines for a split diff
      builtin-apply.c: do not set bogus mode in check_preimage() for deleted path
      grep: pass -I (ignore binary) down to external grep
      GIT 1.6.1.3

Keith Cascio (2):
      test more combinations of ignore-whitespace options to diff
      Fix combined use of whitespace ignore options to diff

Linus Torvalds (1):
      Wrap inflate and other zlib routines for better error reporting

Matthieu Moy (3):
      Missing && in t/t7001.sh.
      Add a testcase for "git mv -f" on untracked files.
      builtin-mv.c: check for unversionned files before looking at the destination.

René Scharfe (1):
      merge: fix out-of-bounds memory access

SZEDER Gábor (1):
      Fix gitdir detection when in subdir of gitdir

Stefan Naewe (1):
      urls.txt: document optional port specification in git URLS

William Pursell (1):
      User-manual: "git stash <comment>" form is long gone

^ permalink raw reply	[relevance 4%]

* [PATCH 3/3] builtin-mv.c: check for unversionned files before looking at the destination.
  2009-02-04  9:32 13% ` [PATCH 2/3] [BUG] Add a testcase for "git mv -f" on untracked files Matthieu Moy
@ 2009-02-04  9:32 12%   ` Matthieu Moy
  0 siblings, 0 replies; 200+ results
From: Matthieu Moy @ 2009-02-04  9:32 UTC (permalink / raw)
  To: git, gitster; +Cc: Matthieu Moy

The previous code was failing in the case where one moves an
unversionned file to an existing destination, with mv -f: the
"existing destination" was checked first, and the error was cancelled
by the force flag.

We now check the unrecoverable error first, which fixes the bug.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 builtin-mv.c  |    8 ++++----
 t/t7001-mv.sh |    2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/builtin-mv.c b/builtin-mv.c
index bce9959..01270fe 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -162,7 +162,9 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				}
 				argc += last - first;
 			}
-		} else if (lstat(dst, &st) == 0) {
+		} else if (cache_name_pos(src, length) < 0)
+			bad = "not under version control";
+		else if (lstat(dst, &st) == 0) {
 			bad = "destination exists";
 			if (force) {
 				/*
@@ -177,9 +179,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				} else
 					bad = "Cannot overwrite";
 			}
-		} else if (cache_name_pos(src, length) < 0)
-			bad = "not under version control";
-		else if (string_list_has_string(&src_for_dst, dst))
+		} else if (string_list_has_string(&src_for_dst, dst))
 			bad = "multiple sources for the same target";
 		else
 			string_list_insert(dst, &src_for_dst);
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 52a47b5..8fb3a56 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -58,7 +58,7 @@ test_expect_success \
      test ! -f path0/untracked1 &&
      test ! -f path0/untracked2'
 
-test_expect_failure \
+test_expect_success \
     'checking -f on untracked file with existing target' \
     'touch path0/untracked1 &&
      git mv -f untracked1 path0
-- 
1.6.1.2.321.g68da9

^ permalink raw reply related	[relevance 12%]

* [PATCH 2/3] [BUG] Add a testcase for "git mv -f" on untracked files.
  2009-02-04  9:32 19% [PATCH 1/3] " Matthieu Moy
@ 2009-02-04  9:32 13% ` Matthieu Moy
  2009-02-04  9:32 12%   ` [PATCH 3/3] builtin-mv.c: check for unversionned files before looking at the destination Matthieu Moy
  0 siblings, 1 reply; 200+ results
From: Matthieu Moy @ 2009-02-04  9:32 UTC (permalink / raw)
  To: git, gitster; +Cc: Matthieu Moy

This currently fails with:
git: builtin-mv.c:217: cmd_mv: Assertion `pos >= 0' failed.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 t/t7001-mv.sh |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index e4dfe95..52a47b5 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -58,6 +58,14 @@ test_expect_success \
      test ! -f path0/untracked1 &&
      test ! -f path0/untracked2'
 
+test_expect_failure \
+    'checking -f on untracked file with existing target' \
+    'touch path0/untracked1 &&
+     git mv -f untracked1 path0
+     test ! -f .git/index.lock &&
+     test -f untracked1 &&
+     test -f path0/untracked1'
+
 # clean up the mess in case bad things happen
 rm -f idontexist untracked1 untracked2 \
      path0/idontexist path0/untracked1 path0/untracked2 \
-- 
1.6.1.2.321.g68da9

^ permalink raw reply related	[relevance 13%]

* [PATCH 1/3] Missing && in t/t7001.sh.
@ 2009-02-04  9:32 19% Matthieu Moy
  2009-02-04  9:32 13% ` [PATCH 2/3] [BUG] Add a testcase for "git mv -f" on untracked files Matthieu Moy
  0 siblings, 1 reply; 200+ results
From: Matthieu Moy @ 2009-02-04  9:32 UTC (permalink / raw)
  To: git, gitster; +Cc: Matthieu Moy

Without this, the exit status is only the one of the last line.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 t/t7001-mv.sh |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index ef2e78f..e4dfe95 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -55,7 +55,7 @@ test_expect_success \
      git mv -k untracked1 untracked2 path0 &&
      test -f untracked1 &&
      test -f untracked2 &&
-     test ! -f path0/untracked1
+     test ! -f path0/untracked1 &&
      test ! -f path0/untracked2'
 
 # clean up the mess in case bad things happen
-- 
1.6.1.2.321.g68da9

^ permalink raw reply related	[relevance 19%]

* Re: [PATCH 1/2] Missing && in t/t7001.sh.
       [not found]     <1233309819-777-?= =?ISO-8859-1?Q?1-git-send-email?= =?ISO-8859-1?Q?-=0E=10>
@ 2009-01-30 10:36  6% ` Matthieu Moy
  0 siblings, 0 replies; 200+ results
From: Matthieu Moy @ 2009-01-30 10:36 UTC (permalink / raw)
  To: git

^N^P@imag.fr writes:
^^^^

(Sorry for the bad From: header line. I must have typed something
weird at the git send-email prompt, while I thought I had just typed
"enter")

-- 
Matthieu

^ permalink raw reply	[relevance 6%]

* Re: [BUG] assertion failure in builtin-mv.c with "git mv -k"
  @ 2009-01-15 10:53  6%         ` Michael J Gruber
  0 siblings, 0 replies; 200+ results
From: Michael J Gruber @ 2009-01-15 10:53 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin, Matthieu Moy, git

Junio C Hamano venit, vidit, dixit 14.01.2009 20:02:
...
> If "git mv" did not have adequate test coverage, then please add a test
> script with both expect_success (for cases that should have been there
> when somebody worked on "git mv" originally), and expect_failure to expose
> the bug you found in your first patch.  Again, the second patch would
> update the code and flip expect_failure to expect_success.
> 
> I see there is t7001-mv and even though it claims to concentrate on its
> operation from subdirectory, it has tests for more basic modes of the
> operation.
> 
> So my recommendation would be to have a single patch that:
> 
>  (1) retitles t7001;
>  (2) adds your new -k tests to it; and
>  (3) adds the 1-liner fix.
> 

Sorry to bother you again, even after your detailed reply, but I'm a bit
confused in multiple ways (I guess that makes for multiple bits...).
First, you replied to my post, not my patch v2, but (time-wise) after my
patch v2, so I'm not sure whether your reply applies to v2 as well or
that one is OK.

Second, I took the title of t7001 to mean "mv into subdir" or "mv in and
out subdir" in order to distiguish it from "mv oldname newname", albeit
in English that leaves room from improvement.

Third, various parts of that test are in vastly different styles, and I
haven't found any test writing directions other than "follow what is
there", which leaves several alternatives. (Some use the test-lib repo,
some create their own underneath, some make assumptions about the
contents of "$TEST_DIRECTORY"/../.)

Fourth, t7001-mv is missing any test for "mv -k", and 2 of my 3
additional tests cover cases which work (pass) without the fix, which is
why I kept it separate, being unrelated. Following all your arguments
lead to the conclusion I should squash 2+3 (fix + mark expect_pass) -
until I read your conclusion, which says squash all.

I'm happy to follow any variant ("1+2+3", "1 2+3", "1 2 3", in
increasing order of preference) so there's no need to discuss or explain
this further, just tell me "do x" ;)

Cheers,
Michael

^ permalink raw reply	[relevance 6%]

Results 201-400 of ~700   |  | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2009-01-14 13:20     [BUG] assertion failure in builtin-mv.c with "git mv -k" Matthieu Moy
2009-01-14 14:53     ` Michael J Gruber
2009-01-14 15:54       ` Johannes Schindelin
2009-01-14 16:04         ` Michael J Gruber
2009-01-14 19:02           ` Junio C Hamano
2009-01-15 10:53  6%         ` Michael J Gruber
     [not found]     <1233309819-777-?= =?ISO-8859-1?Q?1-git-send-email?= =?ISO-8859-1?Q?-=0E=10>
2009-01-30 10:36  6% ` [PATCH 1/2] Missing && in t/t7001.sh Matthieu Moy
2009-02-04  9:32 19% [PATCH 1/3] " Matthieu Moy
2009-02-04  9:32 13% ` [PATCH 2/3] [BUG] Add a testcase for "git mv -f" on untracked files Matthieu Moy
2009-02-04  9:32 12%   ` [PATCH 3/3] builtin-mv.c: check for unversionned files before looking at the destination Matthieu Moy
2009-02-07 21:54  4% [ANNOUNCE] GIT 1.6.1.3 Junio C Hamano
2009-03-21 21:26  3% [PATCH 00/16] Tests on Windows - main part Johannes Sixt
2009-03-21 21:26  4% ` [PATCH 10/16] Use prerequisite tags to skip tests that depend on symbolic links Johannes Sixt
2009-04-20 14:51  4% Bug in test-lib.sh: test_create_repo() / RFC Michael J Gruber
2009-05-07 15:05     [JGIT PATCH 1/2] Add support for boolean config values "yes", "no" Shawn O. Pearce
2009-05-07 15:05     ` [JGIT PATCH 2/2] Make Repository.isValidRefName compatible with Git 1.6.3 Shawn O. Pearce
2009-05-07 23:02       ` Robin Rosenberg
2009-05-07 23:29         ` Linus Torvalds
2009-05-08  0:32           ` Junio C Hamano
2009-05-08  0:47  7%         ` Shawn O. Pearce
2009-12-02  1:35 13% [PATCH] Fixed typo Richard Hartmann
2010-09-06 18:39     [PATCH] Several tests: cd inside subshell instead of around Jens Lehmann
2010-09-06 23:16     ` Junio C Hamano
2010-09-07  2:37  4%   ` Jonathan Nieder
2010-09-24 21:06  4% [RFC PATCH 00/95] Add missing &&'s in the testsuite Elijah Newren
2010-09-24 22:22  4% [RFC PATCHv2 00/16] " Elijah Newren
2010-09-24 22:22 19% ` [RFC PATCHv2 13/16] t7001 (mv): add missing && Elijah Newren
2010-09-24 23:00  6%   ` Ævar Arnfjörð Bjarmason
2010-09-25 19:06  4% [PATCHv3 00/16] Add missing &&'s in the testsuite Elijah Newren
2010-09-25 19:07 19% ` [PATCHv3 12/16] t7001 (mv): add missing && Elijah Newren
2010-09-26 23:14  5% [PATCHv4 00/15] Add missing &&'s in the testsuite Elijah Newren
2010-09-26 23:14 21% ` [PATCHv4 11/15] t7001 (mv): add missing && Elijah Newren
2010-09-30  0:16  1% What's cooking in git.git (Sep 2010, #07; Wed, 29) Junio C Hamano
2010-10-03  5:10  4% [PATCHv5 00/16] Add missing &&'s in the testsuite Elijah Newren
2010-10-03  5:10 21% ` [PATCHv5 12/16] t7001 (mv): add missing && Elijah Newren
2010-10-03 19:59  4% [PATCHv6 00/16] Add missing &&'s in the testsuite Elijah Newren
2010-10-03 20:00 21% ` [PATCHv6 12/16] t7001 (mv): add missing && Elijah Newren
2010-10-03 20:00     ` [PATCHv6 15/16] Add missing &&'s throughout the testsuite Elijah Newren
2010-10-31  1:46       ` [PATCH en/cascade-tests] tests: add missing && Jonathan Nieder
2010-10-31  3:31         ` Junio C Hamano
2010-10-31  7:26  5%       ` [PATCH/RFC 00/10] " Jonathan Nieder
2010-10-31  7:30  6%         ` [PATCH 01/10] tests: add missing &&, batch 2 Jonathan Nieder
2010-10-14  4:46  1% What's cooking in git.git (Oct 2010, #01; Wed, 13) Junio C Hamano
2010-10-27  6:13  1% What's cooking in git.git (Oct 2010, #02; Tue, 26) Junio C Hamano
2010-11-09 19:53  1% What's cooking in git.git (Nov 2010, #01; Tue, 9) Junio C Hamano
2010-11-18  0:56  1% What's cooking in git.git (Nov 2010, #02; Wed, 17) Junio C Hamano
2010-11-25  3:16  1% What's cooking in git.git (Nov 2010, #03; Wed, 24) Junio C Hamano
2011-01-14 13:41 10% [PATCH] handle rename of case only, for windows Tim Abell
2011-01-14 14:22  0% ` Erik Faye-Lund
2011-01-14 13:44 10% Tim Abell
2011-01-14 13:54 10% [PATCH] handle rename of case only, for windows (resend) Tim Abell
2011-01-29 23:45  9% [PATCH] Handle rename of case only, for Windows Tim Abell
2011-01-31  5:05  1% [ANNOUNCE] Git 1.7.4 Junio C Hamano
2011-03-04 21:40 12% [PATCH] Allow git mv FileA fILEa when core.ignorecase = true Torsten Bögershausen
2011-03-16 13:05  0% ` Erik Faye-Lund
2011-03-16 13:18  0%   ` Erik Faye-Lund
2011-03-19 14:28  0%     ` Torsten Bögershausen
2011-03-19 14:28 11% [PATCH v2] Allow git mv FileA fILEa on case ignore file systems Torsten Bögershausen
2011-04-10  5:50  9% [PATCH] Allow git mv FILENAME Filename when core.ignorecase = true Torsten Bögershausen
2012-04-29 20:52  1% XDL_FAST_HASH breaks git on OS X 10.7.3 Brian Gernhardt
2013-02-23 14:31  4% [PATCH] Spelling fixes Ville Skyttä
2013-04-03 19:54  4% [PATCH/RFC 0/3] Teach mv to move submodules Jens Lehmann
2013-04-03 19:56 10% ` [PATCH/RFC 1/3] Teach mv to move submodules together with their work trees Jens Lehmann
2013-04-03 19:56  9% ` [PATCH/RFC 2/3] Teach mv to move submodules using a gitfile Jens Lehmann
2013-04-09 23:08       ` Junio C Hamano
2013-04-10 16:59         ` Jens Lehmann
2013-04-10 21:06  9%       ` [PATCH v2 " Jens Lehmann
2013-04-03 19:57  9% ` [PATCH/RFC 3/3] Teach mv to update the path entry in .gitmodules for moved submodules Jens Lehmann
2013-06-01  9:34  4% [PATCH 00/11] Increase test coverage on Windows by removing SYMLINKS from many tests Johannes Sixt
2013-06-01  9:34  4% ` [PATCH 05/11] tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases) Johannes Sixt
2013-06-07 20:53  4% ` [PATCH v2 00/10] Increase test coverage on Windows by removing SYMLINKS from many tests Johannes Sixt
2013-06-07 20:53  5%   ` [PATCH v2 04/10] tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases) Johannes Sixt
2013-07-22  6:57     What's cooking in git.git (Jul 2013, #07; Sun, 21) Junio C Hamano
2013-07-22  7:32     ` Jens Lehmann
2013-07-22  7:48       ` Duy Nguyen
2013-07-22 20:47         ` Jens Lehmann
2013-07-28 17:23  5%       ` Jens Lehmann
2013-07-30 19:48  6% [PATCH v3 0/5] Teach mv to move submodules Jens Lehmann
2013-07-30 19:49 10% ` [PATCH v3 1/5] Teach mv to move submodules together with their work trees Jens Lehmann
2013-07-30 19:50  9% ` [PATCH v3 2/5] Teach mv to move submodules using a gitfile Jens Lehmann
2013-07-30 19:51  8% ` [PATCH v3 4/5] Teach mv to update the path entry in .gitmodules for moved submodules Jens Lehmann
2013-08-06 19:15  8%   ` [PATCH v4 " Jens Lehmann
2013-10-11 14:29     Spurious warning when moving a file in presence of submodules Matthieu Moy
2013-10-11 17:53     ` Jens Lehmann
2013-10-13 11:52 11%   ` [PATCH] mv: Fix spurious " Jens Lehmann
2013-10-16 21:43     What's cooking in git.git (Oct 2013, #03; Wed, 16) Junio C Hamano
2013-10-17  9:48     ` Karsten Blees
2013-10-17 20:40       ` Junio C Hamano
2013-10-17 21:07  5%     ` Junio C Hamano
2013-10-18  0:42  0%       ` Karsten Blees
2013-10-18 19:37  0%         ` Jens Lehmann
2013-12-02 10:04     [BUG] git mv file directory/ creates the file directory Matthieu Moy
2013-12-02 13:35     ` Duy Nguyen
2013-12-02 17:07 11%   ` Matthieu Moy
2013-12-03  8:32 11% [PATCH] mv: let 'git mv file no-such-dir/' error out Matthieu Moy
2013-12-03 10:06  0% ` Duy Nguyen
2013-12-04  8:44 12%   ` Matthieu Moy
2013-12-04 13:10         ` Duy Nguyen
2013-12-04 17:37 10%       ` [PATCH v2] " Matthieu Moy
2013-12-04 17:44  5%       ` [PATCH] " Junio C Hamano
2013-12-04 17:48  0%         ` Matthieu Moy
2013-12-09 10:59     mv/rm submodules George Papanikolaou
2013-12-09 17:49     ` Jens Lehmann
2014-01-06 19:21 11%   ` [PATCH] mv: better document side effects when moving a submodule Jens Lehmann
2014-01-06 22:40  0%     ` Junio C Hamano
2014-01-07 17:57  0%       ` Jens Lehmann
2014-01-07 21:30  5%         ` [PATCH v2 0/2] better document side effects when [re]moving " Jens Lehmann
2014-01-07 21:31 11%           ` [PATCH v2 1/2] mv: better document side effects when moving " Jens Lehmann
2014-01-23 19:54  5% [PATCH 0/2] solaris test fixups Jeff King
2014-03-08 19:21     [PATCH] mv: prevent mismatched data when ignoring errors brian m. carlson
2014-03-15 18:56 12% ` [PATCH v2] " brian m. carlson
2014-03-24 16:56  2% [PATCH 000/144] Use the $( ... ) construct for command substitution instead of using the back-quotes Elia Pinto
2014-03-25  8:24  2% Elia Pinto
2014-03-25  8:25 20% ` [PATCH 086/144] t7001-mv.sh: use the $( ... ) construct for command substitution Elia Pinto
2014-03-25 17:22  2% [PATCH v2 000/142] Use the $( ... ) construct for command substitution instead of using the back-quotes Elia Pinto
2014-03-25 17:23 20% ` [PATCH v2 084/142] t7001-mv.sh: use the $( ... ) construct for command substitution Elia Pinto
2014-03-29 15:38     AIX fixes Charles Bailey
2014-03-29 15:39 12% ` [PATCH 2/2] Don't rely on strerror text when testing rmdir failure Charles Bailey
2014-03-29 15:48  0%   ` Jens Lehmann
2014-03-31 17:35  0%     ` Junio C Hamano
2014-04-04 16:52  2% Patch Series v3 for "use the $( ... ) construct for command substitution" Elia Pinto
2014-04-11  8:24 19% [PATCH] test: fix t7001 cp to use POSIX options Kyle J. McKay
2014-04-11 11:43  6% ` Jeff King
2014-04-11 13:44 18%   ` Kyle J. McKay
2014-04-11 19:23  5%   ` Junio C Hamano
2014-04-12 21:52  6%     ` Jens Lehmann
2014-04-11 22:22  1% What's cooking in git.git (Apr 2014, #03; Fri, 11) Junio C Hamano
2014-04-15 22:12  1% What's cooking in git.git (Apr 2014, #04; Tue, 15) Junio C Hamano
2014-04-17 21:01  1% What's cooking in git.git (Apr 2014, #05; Thu, 17) Junio C Hamano
2014-04-18 19:37  1% [ANNOUNCE] Git v2.0.0-rc0 Junio C Hamano
2014-05-09 20:00  4% [ANNOUNCE] Git v1.9.3 Junio C Hamano
2014-05-14 15:23  3% Please pull the patch series "use the $( ... ) construct for command substitution" Elia Pinto
2014-07-12  7:50     Topic sk/mingw-unicode-spawn-args breaks tests Stepan Kasal
2014-07-15 13:43     ` [PATCH 0/3] fix test suite with mingw-unicode patches Stepan Kasal
2014-07-15 18:20       ` Junio C Hamano
2014-07-15 22:52  4%     ` Karsten Blees
2014-07-16  9:29  0%       ` Stepan Kasal
2014-07-16 11:01  0%         ` Thomas Braun
2014-07-17 15:37     [PATCH 00/13] mingw unicode environment Stepan Kasal
2014-07-17 18:09  4% ` Karsten Blees
2014-07-22 21:44     What's cooking in git.git (Jul 2014, #04; Tue, 22) Junio C Hamano
2014-07-23 14:17  6% ` Karsten Blees
2014-07-23 18:24  0%   ` Junio C Hamano
2014-07-25 12:30  0%   ` Duy Nguyen
2014-07-29 19:43  0%     ` [RFC/PATCH] Windows tests: let $TRASH_DIRECTORY point to native Windows path Karsten Blees
2014-08-27 13:08  0%       ` Duy Nguyen
2014-07-30 17:10     Transaction patch series overview Ronnie Sahlberg
2014-07-31 21:41     ` Ronnie Sahlberg
2014-08-08 16:50       ` Ronnie Sahlberg
2014-08-19 19:54         ` Ronnie Sahlberg
2014-08-20 23:17           ` Jonathan Nieder
2014-09-11  3:03  2%         ` [PATCH v21 0/19] rs/ref-transaction (Re: Transaction patch series overview) Jonathan Nieder
2014-09-11  3:04 10%           ` [PATCH 01/19] mv test: recreate mod/ directory instead of relying on stale copy Jonathan Nieder
2014-10-02  1:48  1%           ` [PATCH v22 0/24] rs/ref-transaction Jonathan Nieder
2014-10-02  1:50 10%             ` [PATCH 01/24] mv test: recreate mod/ directory instead of relying on stale copy Jonathan Nieder
2014-10-15  0:45  2% [PATCH v23 0/25] rs/ref-transaction ("Use ref transactions", part 3) Jonathan Nieder
2014-10-15  0:46 10% ` [PATCH 01/25] mv test: recreate mod/ directory instead of relying on stale copy Jonathan Nieder
2014-12-11  7:46     Interested in helping open source friends on HP-UX? Junio C Hamano
2015-02-18 16:00  5% ` H.Merijn Brand
2015-02-18 17:46  0%   ` Michael J Gruber
2015-02-18 18:25  0%     ` Jeff King
2015-02-18 19:20  0%     ` H.Merijn Brand
2015-03-20 10:04     [PATCH 0/25] detecting &&-chain breakage Jeff King
2015-03-20 10:09 10% ` [PATCH 06/25] t: use verbose instead of hand-rolled errors Jeff King
2015-11-06 22:47  4% [PATCH] wt-status: use strncmp() for length-limited string comparison René Scharfe
2015-11-24 21:36     ` Jeff King
2015-11-25  2:16       ` René Scharfe
2015-11-25  9:15         ` Jeff King
2015-11-25 14:10  4%       ` [PATCH v2] wt-status: correct and simplify check for detached HEAD René Scharfe
2016-01-07 13:51  6% [PATCH 00/10] use the $( ... ) construct for command substitution Elia Pinto
2016-01-07 13:51 18% ` [PATCH 07/10] t/t7001-mv.sh: " Elia Pinto
2016-01-11 23:45  1% What's cooking in git.git (Jan 2016, #02; Mon, 11) Junio C Hamano
2016-01-13 22:23  1% What's cooking in git.git (Jan 2016, #03; Wed, 13) Junio C Hamano
2016-01-20 23:33  1% What's cooking in git.git (Jan 2016, #04; Wed, 20) Junio C Hamano
2016-01-27  0:27  1% What's cooking in git.git (Jan 2016, #05; Tue, 26) Junio C Hamano
2016-02-23 17:40  5% [RFC/PATCH 0/5] Make README more pleasant to read Matthieu Moy
2016-02-23 17:40 13% ` [PATCH 1/5] README: use markdown syntax Matthieu Moy
2016-02-23 19:07  0%   ` Junio C Hamano
2016-02-24 10:22  0% ` [RFC/PATCH 0/5] Make README more pleasant to read Jeff King
2016-02-24 13:37  0%   ` Matthieu Moy
2016-02-25  6:14  0%     ` Jeff King
2016-02-25  8:37  4% ` [PATCH v2 " Matthieu Moy
2016-02-25  8:37 13%   ` [PATCH v2 1/5] README: use markdown syntax Matthieu Moy
2016-02-26 23:41  1% [ANNOUNCE] Git v2.8.0-rc0 Junio C Hamano
2016-03-04 22:31  1% [ANNOUNCE] Git v2.8.0-rc1 Junio C Hamano
2016-03-10 23:04  1% [ANNOUNCE] Git v2.8.0-rc2 Junio C Hamano
2016-03-16 22:24  1% [ANNOUNCE] Git v2.8.0-rc3 Junio C Hamano
2016-03-21 21:32  1% [ANNOUNCE] Git v2.8.0-rc4 Junio C Hamano
2016-03-28 22:42  1% [ANNOUNCE] Git v2.8.0 Junio C Hamano
2016-04-15  8:14     'git mv' doesn't move submodule if it's in a subdirectory Albin Otterhäll
2016-04-15 17:18     ` Stefan Beller
2016-04-15 17:59 14%   ` Stefan Beller
2016-04-15 18:21  0%     ` Junio C Hamano
2016-04-15 18:24  0%       ` Stefan Beller
2016-04-15 19:11 11%         ` [PATCH] mv: allow moving nested submodules Stefan Beller
2016-04-18 16:54 12% Stefan Beller
2016-04-18 20:54  0% ` Junio C Hamano
2016-04-18 23:41  5% [PATCH 0/2] WAS: " Stefan Beller
2016-04-18 23:41 11% ` [PATCH 2/2] " Stefan Beller
2016-04-19  7:13  0%   ` Jacob Keller
2016-04-19 18:32 11% [PATCH] " Stefan Beller
2016-06-28  0:15 12% [PATCH] submodule: test moving recursive submodule Stefan Beller
2016-06-28  6:13  0% ` Bart Bogaerts
2016-06-28  6:28  0%   ` Bart Bogaerts
2016-06-28 18:24 12% [PATCHv2] " Stefan Beller
2016-08-05 14:41  4% [PATCH] git mv: do not keep slash in `git mv dir non-existing-dir/` Johannes Schindelin
2016-08-05 15:52     ` Junio C Hamano
2016-08-05 15:58  6%   ` Johannes Schindelin
2016-08-05 16:18  0%     ` Junio C Hamano
2016-08-09  8:53  6% [PATCH] Spelling fixes Ville Skyttä
2016-08-09 18:19  0% ` Junio C Hamano
2017-01-04  1:48  5% [PATCHv4 0/2] pathspec: give better message for submodule related pathspec error Stefan Beller
2017-01-04  1:48 10% ` [PATCH 1/2] submodule tests: don't use itself as a submodule Stefan Beller
2017-01-05 19:29  5% [PATCHv6 0/2] pathspec: give better message for submodule related pathspec error Stefan Beller
2017-01-05 19:29 10% ` [PATCHv6 1/2] submodule tests: don't use itself as a submodule Stefan Beller
2017-02-15  0:34     [RFCv3 PATCH 00/14] Checkout aware of Submodules! Stefan Beller
2017-02-15  0:34     ` [PATCH 02/14] lib-submodule-update.sh: define tests for recursing into submodules Stefan Beller
2017-02-15 16:51       ` Brandon Williams
2017-02-15 18:52  6%     ` Stefan Beller
2017-03-08 17:44     [PATCH] submodule--helper.c: remove duplicate code me
2017-03-08 18:53  4% ` Stefan Beller
2017-04-09 19:11  2% [PATCH 0/2] test: Detect *lots* of bugs by adding non-alnum to trash dir names Ævar Arnfjörð Bjarmason
2017-04-09 19:11  1% ` [PATCH 1/2] tests: mark tests that fail when the TEST_DIRECTORY is unusual Ævar Arnfjörð Bjarmason
2017-05-02 12:29     [PATCH 0/5] Abide by our own rules regarding line endings Johannes Schindelin
2017-05-02 21:56     ` Jonathan Nieder
2017-05-03 14:23  3%   ` Johannes Schindelin
2017-08-17 10:34 13% [PATCH] add test for bug in git-mv with nested submodules Heiko Voigt
2017-08-17 19:05  0% ` Stefan Beller
2017-08-18 16:06  0%   ` Heiko Voigt
2017-08-18 19:04         ` Stefan Beller
2017-09-15 11:50 12%       ` [PATCH v2] add test for bug in git-mv for recursive submodules Heiko Voigt
2017-09-17  0:46  0%         ` Junio C Hamano
2017-09-18 20:03  0%           ` Stefan Beller
2017-09-20 13:46  0%             ` Heiko Voigt
2017-10-06 19:00     [PATCH 1/2] tests: use shell negation instead of test_must_fail for test_cmp Stefan Beller
2017-10-06 19:00  6% ` [PATCH 2/2] tests: fix diff order arguments in test_cmp Stefan Beller
2017-11-01 13:00     [PATCH 1/2] sequencer: factor out rewrite_file() René Scharfe
2017-11-01 14:44     ` [PATCH 1/2] wrapper.c: consistently quote filenames in error messages Simon Ruderich
2017-11-02  4:40       ` Junio C Hamano
2017-11-02  5:16 12%     ` Junio C Hamano
2017-12-16  1:31     feature-request: git "cp" like there is git mv Jonathan Nieder
2017-12-31 19:11     ` Stefan Moch
2017-12-31 19:11 19%   ` [PATCH 1/2] Add test case for mv --dry-run to t7001-mv.sh Stefan Moch
2018-02-07 23:13  1% What's cooking in git.git (Feb 2018, #01; Wed, 7) Junio C Hamano
2018-02-14  1:51  1% What's cooking in git.git (Feb 2018, #02; Tue, 13) Junio C Hamano
2018-02-14 17:35     [PATCH 3/7] worktree move: new command Junio C Hamano
2018-02-14 21:56  5% ` [PATCH] t/known-leaky: add list of known-leaky test scripts Martin Ågren
2018-02-22  0:31  1% What's cooking in git.git (Feb 2018, #03; Wed, 21) Junio C Hamano
2018-03-01 22:20  1% What's cooking in git.git (Mar 2018, #01; Thu, 1) Junio C Hamano
2018-03-06 23:34  1% What's cooking in git.git (Mar 2018, #02; Tue, 6) Junio C Hamano
2018-03-13 20:19  6% [GSoC] [PATCH] test: avoid pipes in git related commands for test suite Pratik Karki
2018-03-14  7:30  0% ` Eric Sunshine
2018-03-14  9:57  0%   ` Ævar Arnfjörð Bjarmason
2018-03-15 17:04     Junio C Hamano
2018-03-19 17:32  3% ` [GSoC][PATCH] " Pratik Karki
2018-03-21 11:02  0%   ` Eric Sunshine
2018-03-21 15:23  3%     ` [GSoC][PATCH v3] test: avoid pipes in git related commands for test Pratik Karki
2018-03-16  0:57  1% [ANNOUNCE] Git v2.17.0-rc0 Junio C Hamano
2018-03-21 18:58     [GSoC][PATCH v3] test: avoid pipes in git related commands for test Eric Sunshine
2018-03-23 15:01  3% ` [GSoC][PATCH v4] " Pratik Karki
2018-03-22 22:11  3% [ANNOUNCE] Git v2.16.3 Junio C Hamano
2018-03-25  8:37     [GSoC][PATCH v4] test: avoid pipes in git related commands for test Eric Sunshine
2018-03-27 17:31  3% ` [GSoC][PATCH v5] " Pratik Karki
2018-03-27 21:39  5% [PATCH 0/5] Moving submodules with nested submodules Stefan Beller
2018-03-27 21:39  9% ` [PATCH 5/5] submodule: fixup nested submodules after moving the submodule Stefan Beller
2018-03-27 23:25  0%   ` Brandon Williams
2018-03-28  0:42     Stefan Beller
2018-03-28 17:24  4% ` [PATCHv2 0/6] Moving submodules with nested submodules Stefan Beller
2018-03-28 17:24  9%   ` [PATCH 5/6] submodule: fixup nested submodules after moving the submodule Stefan Beller

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).