On Tue, Feb 18, 2014 at 8:40 AM, Nguyễn Thái Ngọc Duy <pclo...@gmail.com> wrote:
> The normal rule is anything outside refs/heads/ is detached. This
> strictens the rule a bit more: if the branch is checked out (either in

s/strictens/increases strictness of/

> $GIT_COMMON_DIR/HEAD or any $GIT_DIR/repos/.../HEAD) then it's
> detached as well.
>
> A hint is given so the user knows where to go and do something there
> if they still want to checkout undetached here.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
> ---
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index f961604..7b86f2b 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -433,6 +433,11 @@ struct branch_info {
>         const char *name; /* The short name used */
>         const char *path; /* The full name of a real branch */
>         struct commit *commit; /* The named commit */
> +       /*
> +        * if not null the branch is detached because it's alrady

s/alrady/already/

> +        * checked out in this checkout
> +        */
> +       char *checkout;
>  };
>
> +static void check_linked_checkouts(struct branch_info *new)
> +{
> +       struct strbuf path = STRBUF_INIT;
> +       DIR *dir;
> +       struct dirent *d;
> +
> +       strbuf_addf(&path, "%s/repos", get_git_common_dir());
> +       if ((dir = opendir(path.buf)) == NULL)

strbuf_release(&path);

> +               return;
> +
> +       strbuf_reset(&path);
> +       strbuf_addf(&path, "%s/HEAD", get_git_common_dir());
> +       /*
> +        * $GIT_COMMON_DIR/HEAD is practically outside
> +        * $GIT_DIR so resolve_ref_unsafe() won't work (it
> +        * uses git_path). Parse the ref ourselves.
> +        */
> +       if (check_linked_checkout(new, "", path.buf)) {
> +               strbuf_release(&path);
> +               closedir(dir);
> +               return;
> +       }
> +
> +       while ((d = readdir(dir)) != NULL) {
> +               if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
> +                       continue;
> +               strbuf_reset(&path);
> +               strbuf_addf(&path, "%s/repos/%s/HEAD",
> +                           get_git_common_dir(), d->d_name);
> +               if (check_linked_checkout(new, d->d_name, path.buf))
> +                       break;
> +       }
> +       strbuf_release(&path);
> +       closedir(dir);
> +}
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to