setup_git_directory_gently() expects two types of failures to
discover a git directory (e.g. .git/):

  - GIT_DIR_HIT_CEILING: could not find a git directory in any
        parent directories of the cwd.
  - GIT_DIR_HIT_MOUNT_POINT: could not find a git directory in
        any parent directories up to the mount point of the cwd.

Both cases are handled in a similar way, but there are misleading
and unimportant differences. In both cases, setup_git_directory_gently()
should:

  - Die if we are not in a git repository. Otherwise:
  - Set nongit_ok = 1, indicating that we are not in a git repository
        but this is ok.
  - Call strbuf_release() on any non-static struct strbufs that we
        allocated.

Before this change are two misleading additional behaviors:

  - GIT_DIR_HIT_CEILING: setup_nongit() changes to the cwd for no
        apparent reason. We never had the chance to change directories
        up to this point so chdir(current cwd) is pointless.
  - GIT_DIR_HIT_MOUNT_POINT: strbuf_release() frees the buffer
        of a static struct strbuf (cwd). This is unnecessary because the
        struct is static so its buffer is always reachable. This is also
        misleading because nowhere else in the function is this buffer
        released.

This change eliminates these two misleading additional behaviors and
deletes setup_nogit() because the code is clearer without it. The
result is that we can see clearly that GIT_DIR_HIT_CEILING and
GIT_DIR_HIT_MOUNT_POINT lead to the same behavior (ignoring the
different help messages).

Thanks-to: Johannes Schindelin <johannes.schinde...@gmx.de>
Signed-off-by: Erin Dahlgren <eedahlg...@gmail.com>
---
 setup.c | 34 +++++++++++++---------------------
 1 file changed, 13 insertions(+), 21 deletions(-)

diff --git a/setup.c b/setup.c
index 1be5037..b441e39 100644
--- a/setup.c
+++ b/setup.c
@@ -831,16 +831,6 @@ static const char *setup_bare_git_dir(struct strbuf *cwd, 
int offset,
        return NULL;
 }
 
-static const char *setup_nongit(const char *cwd, int *nongit_ok)
-{
-       if (!nongit_ok)
-               die(_("not a git repository (or any of the parent directories): 
%s"), DEFAULT_GIT_DIR_ENVIRONMENT);
-       if (chdir(cwd))
-               die_errno(_("cannot come back to cwd"));
-       *nongit_ok = 1;
-       return NULL;
-}
-
 static dev_t get_device_or_die(const char *path, const char *prefix, int 
prefix_len)
 {
        struct stat buf;
@@ -1097,18 +1087,20 @@ const char *setup_git_directory_gently(int *nongit_ok)
                prefix = setup_bare_git_dir(&cwd, dir.len, &repo_fmt, 
nongit_ok);
                break;
        case GIT_DIR_HIT_CEILING:
-               prefix = setup_nongit(cwd.buf, nongit_ok);
-               break;
+               if (!nongit_ok)
+                       die(_("not a git repository (or any of the parent 
directories): %s"),
+                                       DEFAULT_GIT_DIR_ENVIRONMENT);
+               *nongit_ok = 1;
+               strbuf_release(&dir);
+               return NULL;
        case GIT_DIR_HIT_MOUNT_POINT:
-               if (nongit_ok) {
-                       *nongit_ok = 1;
-                       strbuf_release(&cwd);
-                       strbuf_release(&dir);
-                       return NULL;
-               }
-               die(_("not a git repository (or any parent up to mount point 
%s)\n"
-                     "Stopping at filesystem boundary 
(GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."),
-                   dir.buf);
+               if (!nongit_ok)
+                       die(_("not a git repository (or any parent up to mount 
point %s)\n"
+                                               "Stopping at filesystem 
boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."),
+                                       dir.buf);
+               *nongit_ok = 1;
+               strbuf_release(&dir);
+               return NULL;
        default:
                BUG("unhandled setup_git_directory_1() result");
        }
-- 
2.7.4

Reply via email to