Re: [PATCH v2] checkout: print something when checking out paths

2018-11-14 Thread Duy Nguyen
On Wed, Nov 14, 2018 at 11:12 AM Junio C Hamano  wrote:
>
> Nguyễn Thái Ngọc Duy   writes:
>
> > One of the problems with "git checkout" is that it does so many
> > different things and could confuse people specially when we fail to
> > handle ambiguation correctly.
>
> You would have realized that this is way too noisy if you ran "make
> test", which may have spewed something like this on the screen.

Oh I realize it because it's part of my git build and I often use "git
co ". I'm just telling (or kidding?) myself that I'm just so
used to the old behavior and may need some time to feel comfortable
with the new one.

> [19:09:19] t4120-apply-popt.sh  ok 1624 
> ms ( 0.26 usr  0.21 sys +  5.31 cusr  3.51 csys =  9.29 CPU)
> [19:09:20] t9164-git-svn-dcommit-concurrent.sh  skipped: Perl 
> SVN libraries not found or unusable
> [19:09:20] t1310-config-default.sh  ok  177 
> ms ( 0.07 usr  0.01 sys +  0.89 cusr  0.66 csys =  1.63 CPU)
> ===(   20175;154  1297/?  155/?  6/?  3/3  2/?  4/?  4/?  3/?  5... 
> )===Checked out 1 path out of the index
> Checked out 1 path out of the index
> Checked out 1 path out of the index
> Checked out 1 path out of the index
> Checked out 1 path out of the index
> [19:09:20] t1408-packed-refs.sh ... ok  310 
> ms ( 0.06 usr  0.00 sys +  0.69 cusr  0.52 csys =  1.27 CPU)
> [19:09:20] t0025-crlf-renormalize.sh .. ok  246 
> ms ( 0.03 usr  0.01 sys +  0.34 cusr  0.22 csys =  0.60 CPU)
>
> I am very tempted to suggest to treat this as a training wheel and
> enable only when checkout.showpathcount is set to true, or something
> like that.

Maybe we just drop it then. I'm not adding a training wheel. I'm
trying to make this complex command safer somewhat. But maybe this is
a wrong direction. I'll give the idea "switch-branch / restore-path
alternative commands" a go some time. Then the new generation can just
stick to those and old timers stay with "git checkout".
-- 
Duy


Re: [PATCH v2] checkout: print something when checking out paths

2018-11-14 Thread Junio C Hamano
Nguyễn Thái Ngọc Duy   writes:

> One of the problems with "git checkout" is that it does so many
> different things and could confuse people specially when we fail to
> handle ambiguation correctly.

You would have realized that this is way too noisy if you ran "make
test", which may have spewed something like this on the screen.

[19:09:19] t4120-apply-popt.sh  ok 1624 ms 
( 0.26 usr  0.21 sys +  5.31 cusr  3.51 csys =  9.29 CPU)
[19:09:20] t9164-git-svn-dcommit-concurrent.sh  skipped: Perl 
SVN libraries not found or unusable
[19:09:20] t1310-config-default.sh  ok  177 ms 
( 0.07 usr  0.01 sys +  0.89 cusr  0.66 csys =  1.63 CPU)
===(   20175;154  1297/?  155/?  6/?  3/3  2/?  4/?  4/?  3/?  5... )===Checked 
out 1 path out of the index
Checked out 1 path out of the index
Checked out 1 path out of the index
Checked out 1 path out of the index
Checked out 1 path out of the index
[19:09:20] t1408-packed-refs.sh ... ok  310 ms 
( 0.06 usr  0.00 sys +  0.69 cusr  0.52 csys =  1.27 CPU)
[19:09:20] t0025-crlf-renormalize.sh .. ok  246 ms 
( 0.03 usr  0.01 sys +  0.34 cusr  0.22 csys =  0.60 CPU)

I am very tempted to suggest to treat this as a training wheel and
enable only when checkout.showpathcount is set to true, or something
like that.


[PATCH v2] checkout: print something when checking out paths

2018-11-13 Thread Nguyễn Thái Ngọc Duy
One of the problems with "git checkout" is that it does so many
different things and could confuse people specially when we fail to
handle ambiguation correctly.

One way to help with that is tell the user what sort of operation is
actually carried out. When switching branches, we always print
something unless --quiet, either

 - "HEAD is now at ..."
 - "Reset branch ..."
 - "Already on ..."
 - "Switched to and reset ..."
 - "Switched to a new branch ..."
 - "Switched to branch ..."

Checking out paths however is silent. Print something so that if we
got the user intention wrong, they won't waste too much time to find
that out. For the remaining cases of checkout we now print either

 - "Checked out ... paths out of the index"
 - "Checked out ... paths out of "

Since the purpose of printing this is to help disambiguate. Only do it
when "--" is missing.

Signed-off-by: Nguyễn Thái Ngọc Duy 
---
 v2 updates the messages a bit but it does not check isatty or add
 --count-paths, for consistency reason with how messages are printed
 in the branch switching case.
 
 Consistency is not always a good reason to follow. But I haven't
 seen a strong reason to go against it.

 apply.c  |  3 ++-
 builtin/checkout-index.c |  6 --
 builtin/checkout.c   | 39 +++
 builtin/difftool.c   |  2 +-
 cache.h  |  4 ++--
 entry.c  | 10 ++
 unpack-trees.c   |  6 +++---
 7 files changed, 49 insertions(+), 21 deletions(-)

diff --git a/apply.c b/apply.c
index 073d5f0451..5876b02197 100644
--- a/apply.c
+++ b/apply.c
@@ -3352,7 +3352,8 @@ static int checkout_target(struct index_state *istate,
 
costate.refresh_cache = 1;
costate.istate = istate;
-   if (checkout_entry(ce, , NULL) || lstat(ce->name, st))
+   if (checkout_entry(ce, , NULL, NULL) ||
+   lstat(ce->name, st))
return error(_("cannot checkout %s"), ce->name);
return 0;
 }
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 88b86c8d9f..bada491f58 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -67,7 +67,8 @@ static int checkout_file(const char *name, const char *prefix)
continue;
did_checkout = 1;
if (checkout_entry(ce, ,
-   to_tempfile ? topath[ce_stage(ce)] : NULL) < 0)
+  to_tempfile ? topath[ce_stage(ce)] : NULL,
+  NULL) < 0)
errs++;
}
 
@@ -111,7 +112,8 @@ static void checkout_all(const char *prefix, int 
prefix_length)
write_tempfile_record(last_ce->name, prefix);
}
if (checkout_entry(ce, ,
-   to_tempfile ? topath[ce_stage(ce)] : NULL) < 0)
+  to_tempfile ? topath[ce_stage(ce)] : NULL,
+  NULL) < 0)
errs++;
last_ce = ce;
}
diff --git a/builtin/checkout.c b/builtin/checkout.c
index acdafc6e4c..3a0b86ec1c 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -44,6 +44,7 @@ struct checkout_opts {
int ignore_skipworktree;
int ignore_other_worktrees;
int show_progress;
+   int count_checkout_paths;
/*
 * If new checkout options are added, skip_merge_working_tree
 * should be updated accordingly.
@@ -165,12 +166,13 @@ static int check_stages(unsigned stages, const struct 
cache_entry *ce, int pos)
 }
 
 static int checkout_stage(int stage, const struct cache_entry *ce, int pos,
- const struct checkout *state)
+ const struct checkout *state, int *nr_checkouts)
 {
while (pos < active_nr &&
   !strcmp(active_cache[pos]->name, ce->name)) {
if (ce_stage(active_cache[pos]) == stage)
-   return checkout_entry(active_cache[pos], state, NULL);
+   return checkout_entry(active_cache[pos], state,
+ NULL, nr_checkouts);
pos++;
}
if (stage == 2)
@@ -179,7 +181,7 @@ static int checkout_stage(int stage, const struct 
cache_entry *ce, int pos,
return error(_("path '%s' does not have their version"), 
ce->name);
 }
 
-static int checkout_merged(int pos, const struct checkout *state)
+static int checkout_merged(int pos, const struct checkout *state, int 
*nr_checkouts)
 {
struct cache_entry *ce = active_cache[pos];
const char *path = ce->name;
@@ -242,7 +244,7 @@ static int checkout_merged(int pos, const struct checkout 
*state)
ce = make_transient_cache_entry(mode, , path, 2);
if (!ce)
die(_("make_cache_entry failed for path '%s'"), path);
-   status = checkout_entry(ce, state, NULL);
+   status =