Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode

2013-03-24 Thread Jonathan Nieder
Duy Nguyen wrote:
> On Mon, Mar 25, 2013 at 1:17 AM, Jonathan Nieder  wrote:

>> Hm, should this be the default?
>>
>> In principle, I would expect
>>
>> git checkout -- .
>>
>> to make the worktree match the index, respecting the sparse checkout.
>> And something like
>>
>> git checkout --widen -- .
>>
>> to change the sparse checkout pattern.
[...]
> Changing the default may involve a painful transition phase (e.g. "add
> -u").

I don't think it needs to.  There aren't many people using sparse
checkout even these days, and I think they'd generally be happy about
the change.

But if we want to be conservative until some later point (like 2.1),
perhaps --sparse should be named something like --no-widen?  That
way, I can do

git checkout --no-widen -- .

to make the worktree match the index, respecting the sparse checkout.
And I can do

git checkout --widen -- .

to change the sparse checkout pattern.  Meanwhile the confusing
command

git checkout -- .

would be ill-defined for sparse checkouts --- in past git versions,
if I understand you correctly it acted like --widen, while in some
unspecified future version it may change to mean --no-widen.  No
need for warnings because I doubt anyone is relying on either
behavior.

Would that work?
Jonathan
--
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


Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode

2013-03-24 Thread Duy Nguyen
On Mon, Mar 25, 2013 at 1:17 AM, Jonathan Nieder  wrote:
>> +--sparse::
>> + In sparse checkout mode, `git checkout -- ` would
>> + update all entries matched by  regardless sparse
>> + patterns. This option only updates entries matched by 
>> + and sparse patterns.
>
> Hm, should this be the default?
>
> In principle, I would expect
>
> git checkout -- .
>
> to make the worktree match the index, respecting the sparse checkout.
> And something like
>
> git checkout --widen -- .
>
> to change the sparse checkout pattern.  But of course it is easily
> possible that I am missing some details of how sparse checkout is
> used in practice.
>
> What do you think?

Changing the default may involve a painful transition phase (e.g. "add
-u"). I think making it the default via alias should be good enough in
most cases. We also need to think how it impacts checkout usage in
scripts. I think it might be ok, but I haven't finished my morning
coffee yet, so..
-- 
Duy
--
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


Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode

2013-03-24 Thread Kirill Müller

Hi

On 03/24/2013 07:17 PM, Jonathan Nieder wrote:

Hi,

Nguyễn Thái Ngọc Duy wrote:


--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of the 
working tree.
  Afterwards you will be ready to prepare your new files, repopulating the
  working tree, by copying them from elsewhere, extracting a tarball, etc.

+
+--sparse::
+   In sparse checkout mode, `git checkout -- ` would
+   update all entries matched by  regardless sparse
+   patterns. This option only updates entries matched by 
+   and sparse patterns.

Hm, should this be the default?

In principle, I would expect

git checkout -- .

to make the worktree match the index, respecting the sparse checkout.
And something like

git checkout --widen -- .

to change the sparse checkout pattern.  But of course it is easily
possible that I am missing some details of how sparse checkout is
used in practice.

What do you think?
Thank you for your opinion. I'd second that. When I do a sparse 
checkout, I want to see only the directories I have included and not 
excluded, unless I explicitly change that.



-Kirill
--
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


Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode

2013-03-24 Thread Jonathan Nieder
Hi,

Nguyễn Thái Ngọc Duy wrote:

> --- a/Documentation/git-checkout.txt
> +++ b/Documentation/git-checkout.txt
> @@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of 
> the working tree.
>  Afterwards you will be ready to prepare your new files, repopulating the
>  working tree, by copying them from elsewhere, extracting a tarball, etc.
>
> +
> +--sparse::
> + In sparse checkout mode, `git checkout -- ` would
> + update all entries matched by  regardless sparse
> + patterns. This option only updates entries matched by 
> + and sparse patterns.

Hm, should this be the default?

In principle, I would expect

git checkout -- .

to make the worktree match the index, respecting the sparse checkout.
And something like

git checkout --widen -- .

to change the sparse checkout pattern.  But of course it is easily
possible that I am missing some details of how sparse checkout is
used in practice.

What do you think?
Jonathan
--
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


Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode

2013-03-23 Thread Eric Sunshine
On Sun, Mar 24, 2013 at 1:06 AM, Nguyễn Thái Ngọc Duy  wrote:
> diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
> index 8edcdca..45a2b53 100644
> --- a/Documentation/git-checkout.txt
> +++ b/Documentation/git-checkout.txt
> @@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of 
> the working tree.
> +--sparse::
> +   In sparse checkout mode, `git checkout -- ` would
> +   update all entries matched by  regardless sparse

s/regardless/regardless of/

> +   patterns. This option only updates entries matched by 
> +   and sparse patterns.
> +
--
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


[PATCH] checkout: add --sparse for restoring files in sparse checkout mode

2013-03-23 Thread Nguyễn Thái Ngọc Duy
"git checkout -- " is usually used to restore all modified
files in . In sparse checkout mode, this command is overloaded
with another meaning: to add back all files in  that are
excluded by sparse patterns.

Add "--sparse" option to do what normal mode does: restore all
modified files and nothing else.

Signed-off-by: Nguyễn Thái Ngọc Duy 
---
 I'm not sure if rejecting --sparse when it has no effects (e.g.
 switching branches or interactive mode) like this patch does is a
 good idea. I think it's good in general to spot unused options. On
 the other hand, people may want to add an alias
 "co = checkout --sparse" to make this behavior "default". In that
 case silently ignoring --sparse may be a good idea.

 Documentation/git-checkout.txt   |  7 +++
 builtin/checkout.c   | 18 --
 t/t1011-read-tree-sparse-checkout.sh | 12 
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index 8edcdca..45a2b53 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of the 
working tree.
 Afterwards you will be ready to prepare your new files, repopulating the
 working tree, by copying them from elsewhere, extracting a tarball, etc.
 
+
+--sparse::
+   In sparse checkout mode, `git checkout -- ` would
+   update all entries matched by  regardless sparse
+   patterns. This option only updates entries matched by 
+   and sparse patterns.
+
 -m::
 --merge::
When switching branches,
diff --git a/builtin/checkout.c b/builtin/checkout.c
index a9c1b5a..3a32145 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -35,6 +35,7 @@ struct checkout_opts {
int force_detach;
int writeout_stage;
int overwrite_ignore;
+   int sparse;
 
const char *new_branch;
const char *new_branch_force;
@@ -224,7 +225,7 @@ static int checkout_paths(const struct checkout_opts *opts,
struct checkout state;
static char *ps_matched;
unsigned char rev[20];
-   int flag;
+   int flag, sparse;
struct commit *head;
int errs = 0;
int stage = opts->writeout_stage;
@@ -254,9 +255,13 @@ static int checkout_paths(const struct checkout_opts *opts,
die(_("Cannot update paths and switch to branch '%s' at the 
same time."),
opts->new_branch);
 
-   if (opts->patch_mode)
+   if (opts->patch_mode) {
+   if (opts->sparse != -1)
+   die(_("--[no-]sparse cannot be used in interactive 
mode"));
return run_add_interactive(revision, "--patch=checkout",
   opts->pathspec);
+   }
+   sparse = opts->sparse != -1 ? opts->sparse : 0;
 
lock_file = xcalloc(1, sizeof(struct lock_file));
 
@@ -275,6 +280,8 @@ static int checkout_paths(const struct checkout_opts *opts,
struct cache_entry *ce = active_cache[pos];
if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
continue;
+   if (sparse && ce_skip_worktree(ce))
+   continue;
match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, 
ps_matched);
}
 
@@ -315,6 +322,8 @@ static int checkout_paths(const struct checkout_opts *opts,
struct cache_entry *ce = active_cache[pos];
if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
continue;
+   if (sparse && ce_skip_worktree(ce))
+   continue;
if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, 
NULL)) {
if (!ce_stage(ce)) {
errs |= checkout_entry(ce, &state, NULL);
@@ -963,6 +972,9 @@ static int checkout_branch(struct checkout_opts *opts,
if (opts->pathspec)
die(_("paths cannot be used with switching branches"));
 
+   if (opts->sparse != -1)
+   die(_("--[no-]sparse can only be used with paths"));
+
if (opts->patch_mode)
die(_("'%s' cannot be used with switching branches"),
"--patch");
@@ -1029,6 +1041,7 @@ int cmd_checkout(int argc, const char **argv, const char 
*prefix)
OPT_STRING(0, "conflict", &conflict_style, N_("style"),
   N_("conflict style (merge or diff3)")),
OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks 
interactively")),
+   OPT_BOOL(0, "sparse", &opts.sparse, N_("limit pathspecs to 
sparse entries only")),
{ OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
  N_("second guess 'git checkout no-such-branch'"),
  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
@@ -1039,6 +1052,7 @@ int cmd_ch