Move write_shallow_commits to fetch-pack.c
[gitweb.git] / setup.c
diff --git a/setup.c b/setup.c
index 51e354ca0760d8b6593fe50720b47c160dd8fe59..ce87900ce3c68ace0f231827bdda0e9a65ef15b3 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -85,8 +85,17 @@ static void NORETURN die_verify_filename(const char *prefix, const char *arg)
 {
        unsigned char sha1[20];
        unsigned mode;
-       /* try a detailed diagnostic ... */
-       get_sha1_with_mode_1(arg, sha1, &mode, 0, prefix);
+
+       /*
+        * Saying "'(icase)foo' does not exist in the index" when the
+        * user gave us ":(icase)foo" is just stupid.  A magic pathspec
+        * begins with a colon and is followed by a non-alnum; do not
+        * let get_sha1_with_mode_1(only_to_die=1) to even trigger.
+        */
+       if (!(arg[0] == ':' && !isalnum(arg[1])))
+               /* try a detailed diagnostic ... */
+               get_sha1_with_mode_1(arg, sha1, &mode, 1, prefix);
+
        /* ... or fall back the most general message. */
        die("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
            "Use '--' to separate paths from revisions", arg);
@@ -136,20 +145,19 @@ void verify_non_filename(const char *prefix, const char *arg)
  * Possible future magic semantics include stuff like:
  *
  *     { PATHSPEC_NOGLOB, '!', "noglob" },
+ *     { PATHSPEC_ICASE, '\0', "icase" },
  *     { PATHSPEC_RECURSIVE, '*', "recursive" },
  *     { PATHSPEC_REGEXP, '\0', "regexp" },
  *
  */
 #define PATHSPEC_FROMTOP    (1<<0)
-#define PATHSPEC_ICASE      (1<<1)
 
-struct pathspec_magic {
+static struct pathspec_magic {
        unsigned bit;
        char mnemonic; /* this cannot be ':'! */
        const char *name;
 } pathspec_magic[] = {
        { PATHSPEC_FROMTOP, '/', "top" },
-       { PATHSPEC_ICASE, '\0', "icase" },
 };
 
 /*
@@ -165,12 +173,11 @@ struct pathspec_magic {
  * the prefix part must always match literally, and a single stupid
  * string cannot express such a case.
  */
-const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
+static const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
 {
        unsigned magic = 0;
        const char *copyfrom = elt;
-       const char *retval;
-       int i, free_source = 0;
+       int i;
 
        if (elt[0] != ':') {
                ; /* nothing to do */
@@ -199,9 +206,6 @@ const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
                }
                if (*copyfrom == ')')
                        copyfrom++;
-       } else if (!elt[1]) {
-               /* Just ':' -- no element! */
-               return NULL;
        } else {
                /* shorthand */
                for (copyfrom = elt + 1;
@@ -224,31 +228,10 @@ const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
                        copyfrom++;
        }
 
-       if (magic & PATHSPEC_ICASE) {
-               struct strbuf sb = STRBUF_INIT;
-               for (i = 0; copyfrom[i]; i++) {
-                       int ch = copyfrom[i];
-                       if (('a' <= ch && ch <= 'z') ||
-                           ('A' <= ch && ch <= 'Z')) {
-                               strbuf_addf(&sb, "[%c%c]",
-                                           tolower(ch), toupper(ch));
-                       } else {
-                               strbuf_addch(&sb, ch);
-                       }
-               }
-               if (sb.len) {
-                       free_source = 1;
-                       copyfrom = strbuf_detach(&sb, NULL);
-               }
-       }
-
        if (magic & PATHSPEC_FROMTOP)
-               retval = xstrdup(copyfrom);
+               return xstrdup(copyfrom);
        else
-               retval = prefix_path(prefix, prefixlen, copyfrom);
-       if (free_source)
-               free((char *)copyfrom);
-       return retval;
+               return prefix_path(prefix, prefixlen, copyfrom);
 }
 
 const char **get_pathspec(const char *prefix, const char **pathspec)
@@ -399,7 +382,7 @@ const char *read_gitfile_gently(const char *path)
        const char *slash;
        struct stat st;
        int fd;
-       size_t len;
+       ssize_t len;
 
        if (stat(path, &st))
                return NULL;
@@ -449,6 +432,7 @@ static const char *setup_explicit_git_dir(const char *gitdirenv,
        const char *work_tree_env = getenv(GIT_WORK_TREE_ENVIRONMENT);
        const char *worktree;
        char *gitfile;
+       int offset;
 
        if (PATH_MAX - 40 < strlen(gitdirenv))
                die("'$%s' too big", GIT_DIR_ENVIRONMENT);
@@ -514,15 +498,15 @@ static const char *setup_explicit_git_dir(const char *gitdirenv,
                return NULL;
        }
 
-       if (!prefixcmp(cwd, worktree) &&
-           cwd[strlen(worktree)] == '/') { /* cwd inside worktree */
+       offset = dir_inside_of(cwd, worktree);
+       if (offset >= 0) {      /* cwd inside worktree? */
                set_git_dir(real_path(gitdirenv));
                if (chdir(worktree))
                        die_errno("Could not chdir to '%s'", worktree);
                cwd[len++] = '/';
                cwd[len] = '\0';
                free(gitfile);
-               return cwd + strlen(worktree) + 1;
+               return cwd + offset;
        }
 
        /* cwd outside worktree */