All of lore.kernel.org
 help / color / mirror / Atom feed
* git check-ignore --verbose fails oddly when invoked via an alias
@ 2020-05-10 19:59 D. Ben Knoble
  2020-05-11  0:24 ` Đoàn Trần Công Danh
  0 siblings, 1 reply; 2+ messages in thread
From: D. Ben Knoble @ 2020-05-10 19:59 UTC (permalink / raw)
  To: git

Hello all,

I have some bizarre behavior I cannot explain. Worse, I've had a hard
time coming up with a minimal test-case for it.

I have the following two aliases:

    ig = check-ignore
    igv = !git ig --verbose

I use them to verify git-ignore rules occasionally. Today, I was
working on a project where git igv * kept failing (exit code 1,
indicating none of the provided files are ignored). However, when I do
git check-ignore --verbose *, I get the expected output.

You'll even see in the GIT_TRACE outputs above that one behaves very
differently from the other for unknown reasons

Debugging information:

$ pwd
/Users/Knoble/write/junk-drawer/code
$ g rev-parse --show-toplevel
/Users/Knoble/write/junk-drawer
$ tree -a sml-binary
sml-binary/
├── .cm
│   ├── GUID
│   │   └── myprog.sml
│   ├── SKEL
│   │   └── myprog.sml
│   └── amd64-unix
│       └── myprog.sml
├── .gitignore
├── Makefile
├── myprog
├── myprog.amd64-darwin
├── myprog.cm
├── myprog.sml
└── tmp
    ├── bin
    │   └── myprog
    └── lib
        └── myprog.amd64-darwin

7 directories, 11 files
$ cat sml-binary/.gitignore
myprog
myprog.amd64-darwin
$ g check-ignore sml-binary/*
sml-binary/myprog
sml-binary/myprog.amd64-darwin
$ g check-ignore --verbose sml-binary/*
code/sml-binary/.gitignore:1:myprog sml-binary/myprog
code/sml-binary/.gitignore:2:myprog.amd64-darwin sml-binary/myprog.amd64-darwin
$ g ig sml-binary/*
sml-binary/myprog
sml-binary/myprog.amd64-darwin
$ g igv sml-binary/*
$ echo $?
1
$ pushd sml-binary/
~/write/junk-drawer/code/sml-binary ~/write/junk-drawer/code
~/write/junk-drawer/code/sml-binary
$ g ig *
myprog
myprog.amd64-darwin
$ g ig --verbose *
code/sml-binary/.gitignore:1:myprog myprog
code/sml-binary/.gitignore:2:myprog.amd64-darwin myprog.amd64-darwin
$ g igv *
$ echo $?
1
$ GIT_TRACE2=2 g igv *
15:48:21.773549 common-main.c:48                  version 2.26.2
15:48:21.773904 common-main.c:49                  start git igv
Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp
15:48:21.774443 git.c:697                         cmd_name
_run_dashed_ (_run_dashed_)
15:48:21.774473 run-command.c:735                 child_start[0]
git-igv Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp
15:48:21.774735 run-command.c:950                 child_exit[0] pid:-1
code:-1 elapsed:0.000249
15:48:21.775368 repository.c:130                  worktree
/Users/Knoble/write/junk-drawer
15:48:21.775427 git.c:352                         alias igv -> 'git ig
--verbose' Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml
tmp
15:48:21.775439 git.c:354                         cmd_name
_run_shell_alias_ (_run_dashed_/_run_shell_alias_)
15:48:21.775445 run-command.c:735                 child_start[1] 'git
ig --verbose' Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml
tmp
15:48:21.786123 common-main.c:48                  version 2.26.2
15:48:21.786579 common-main.c:49                  start git ig
--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp
15:48:21.787201 git.c:697                         cmd_name
_run_dashed_ (_run_dashed_/_run_shell_alias_/_run_dashed_)
15:48:21.787243 run-command.c:735                 child_start[0]
git-ig --verbose Makefile myprog myprog.amd64-darwin myprog.cm
myprog.sml tmp
15:48:21.787464 run-command.c:950                 child_exit[0] pid:-1
code:-1 elapsed:0.000216
15:48:21.787781 git.c:389                         alias ig ->
check-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm
myprog.sml tmp
15:48:21.787794 git.c:753                         cmd_name
_run_git_alias_
(_run_dashed_/_run_shell_alias_/_run_dashed_/_run_git_alias_)
15:48:21.787801 run-command.c:735                 child_start[1] git
check-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm
myprog.sml tmp
15:48:21.793959 common-main.c:48                  version 2.26.2
15:48:21.794206 common-main.c:49                  start
/usr/local/Cellar/git/2.26.2/libexec/git-core/git check-ignore
--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp
15:48:21.794427 repository.c:130                  worktree
/Users/Knoble/write/junk-drawer
15:48:21.794671 git.c:440                         cmd_name
check-ignore (_run_dashed_/_run_shell_alias_/_run_dashed_/_run_git_alias_/check-ignore)
15:48:21.795513 git.c:674                         exit elapsed:0.003100 code:1
15:48:21.795529 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.003121 code:1
15:48:21.795935 run-command.c:990                 child_exit[1]
pid:98684 code:1 elapsed:0.008108
15:48:21.795971 git.c:773                         exit elapsed:0.012124 code:1
15:48:21.795995 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.012139 code:1
15:48:21.796351 run-command.c:990                 child_exit[1]
pid:98683 code:1 elapsed:0.020896
15:48:21.796391 git.c:358                         exit elapsed:0.024746 code:1
15:48:21.796416 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.024761 code:1
$ GIT_TRACE2=2 g ig --verbose *
15:57:42.274337 common-main.c:48                  version 2.26.2
15:57:42.274640 common-main.c:49                  start git ig
--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp
15:57:42.275146 git.c:697                         cmd_name
_run_dashed_ (_run_dashed_)
15:57:42.275167 run-command.c:735                 child_start[0]
git-ig --verbose Makefile myprog myprog.amd64-darwin myprog.cm
myprog.sml tmp
15:57:42.275422 run-command.c:950                 child_exit[0] pid:-1
code:-1 elapsed:0.000246
15:57:42.275763 git.c:389                         alias ig ->
check-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm
myprog.sml tmp
15:57:42.275781 git.c:753                         cmd_name
_run_git_alias_ (_run_dashed_/_run_git_alias_)
15:57:42.275794 run-command.c:735                 child_start[1] git
check-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm
myprog.sml tmp
15:57:42.282613 common-main.c:48                  version 2.26.2
15:57:42.282876 common-main.c:49                  start
/usr/local/Cellar/git/2.26.2/libexec/git-core/git check-ignore
--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp
15:57:42.283146 repository.c:130                  worktree
/Users/Knoble/write/junk-drawer
15:57:42.283520 git.c:440                         cmd_name
check-ignore (_run_dashed_/_run_git_alias_/check-ignore)
code/sml-binary/.gitignore:1:myprog     myprog
code/sml-binary/.gitignore:2:myprog.amd64-darwin        myprog.amd64-darwin
15:57:42.284561 git.c:674                         exit elapsed:0.003839 code:0
15:57:42.284588 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.003876 code:0
15:57:42.285171 run-command.c:990                 child_exit[1]
pid:99078 code:0 elapsed:0.009354
15:57:42.285212 git.c:773                         exit elapsed:0.012930 code:0
15:57:42.285246 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.012950 code:0

Failed attempt to produce a minimal example:

$ g init
Dépôt Git vide initialisé dans /private/tmp/git-test/.git/
$ mkdir subdir
$ touch subdir/{a..c}
$ ls
subdir/
$ tree
.
└── subdir
    ├── a
    ├── b
    └── c

1 directory, 3 files
$ echo a >> subdir/.gitignore
$ g status -s
?? subdir/
$ g add --intend-to-add .
$ g status -s
 A subdir/.gitignore
 A subdir/b
 A subdir/c
$ g commit --all -m 'init'
[master (commit racine) 832876e] init
 3 files changed, 1 insertion(+)
 create mode 100644 subdir/.gitignore
 create mode 100644 subdir/b
 create mode 100644 subdir/c
$ g igv *
$ echo $?
1
# ^^^ expected, nothing ignored
$ g igv subdir/*
subdir/.gitignore:1:a   subdir/a
# ^^^ also expected???

D. Ben Knoble

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: git check-ignore --verbose fails oddly when invoked via an alias
  2020-05-10 19:59 git check-ignore --verbose fails oddly when invoked via an alias D. Ben Knoble
@ 2020-05-11  0:24 ` Đoàn Trần Công Danh
  0 siblings, 0 replies; 2+ messages in thread
From: Đoàn Trần Công Danh @ 2020-05-11  0:24 UTC (permalink / raw)
  To: D. Ben Knoble; +Cc: git

On 2020-05-10 15:59:08-0400, "D. Ben Knoble" <ben.knoble@gmail.com> wrote:
> I have the following two aliases:
> 
>     ig = check-ignore
>     igv = !git ig --verbose

Your "git igv" is an alias to a shell command.

> $ pwd
> /Users/Knoble/write/junk-drawer/code
> $ g rev-parse --show-toplevel
> /Users/Knoble/write/junk-drawer

You're working on subdirectory of git worktree.

> $ tree -a sml-binary
> sml-binary/

[.snip.]

> $ cat sml-binary/.gitignore
> myprog
> myprog.amd64-darwin
> $ g check-ignore sml-binary/*
> sml-binary/myprog
> sml-binary/myprog.amd64-darwin
> $ g check-ignore --verbose sml-binary/*
> code/sml-binary/.gitignore:1:myprog sml-binary/myprog
> code/sml-binary/.gitignore:2:myprog.amd64-darwin sml-binary/myprog.amd64-darwin
> $ g ig sml-binary/*
> sml-binary/myprog
> sml-binary/myprog.amd64-darwin
> $ g igv sml-binary/*
> $ echo $?
> 1

In git-config(1), we've noted that:

           Note that
           shell commands will be executed from the top-level directory of a
           repository, which may not necessarily be the current directory.
           GIT_PREFIX is set as returned by running git rev-parse
           --show-prefix from the original current directory. See git-rev-
           parse(1).

Which is the parent directory of your "$PWD".

So, two below commands are equivalent:

	$ git igv sml-binary/*
	$ (cd .. && git check-ignore --verbose sml-binary/myprog sml-binary/myprog.amd64-darwin <and other files>)

From Git 2.23.0, Git allows recursive alias expansion:

	igv = ig --verbose

-- 
Danh

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-05-11  0:29 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-10 19:59 git check-ignore --verbose fails oddly when invoked via an alias D. Ben Knoble
2020-05-11  0:24 ` Đoàn Trần Công Danh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.