From: Omar Polo Subject: Re: make it possible to ignore Git config file To: Stefan Sperling Cc: gameoftrees@openbsd.org Date: Sat, 23 Jul 2022 17:33:06 +0200 Stefan Sperling wrote: > Omar found a test failure in test_rebase_no_author_info(), where the > author from ~/.gitconfig will be used instead of having no author set. > > This patch adds a switch we can use to ignore Git configuration settings. > Git's config file contains some data we must not ignore, such as the > repository format version (smart idea to store this in the user-facing > config file, isn't it), and any enabled repository format extensions > (if any of them are enabled then we must not touch the repository). > > Once this is in, we can fix test_rebase_no_author_info() by setting > this variable. It might also be useful in other situations, so I decided > to document it instead of making it a hidden setting. > > ok? i've ok'd this too fast, sorry. there are two things to fix > diff /home/stsp/src/got > commit - 2c8899b952f67f90ab3a26b4331491832fe93c8a > path + /home/stsp/src/got > blob - ea412540fd202511367fedfbeaa5f864e0051758 > file + got/got.1 > --- got/got.1 > +++ got/got.1 > @@ -2750,7 +2750,7 @@ argument corresponds to the work tree's root directory > for all tracked files. > .El > .Sh ENVIRONMENT > -.Bl -tag -width GOT_AUTHOR > +.Bl -tag -width GOT_IGNORE_GITCONFIG > .It Ev GOT_AUTHOR > The author's name and email address, such as > .Dq An Flan Hacker Aq Mt flan_hacker@openbsd.org . > @@ -2806,6 +2806,9 @@ The default limit on the number of commits traversed b > .Cm got log . > If set to zero, the limit is unbounded. > This variable will be silently ignored if it is set to a non-numeric value. > +.It Ev GOT_IGNORE_GITCONFIG > +If this variable is set then any remote repository definitions or author > +information found in Git configuration files will be ignored. > .El > .Sh FILES > .Bl -tag -width packed-refs -compact > blob - c16937331653c5414c3a3ed0215a2b9f3193f106 > file + lib/repository.c > --- lib/repository.c > +++ lib/repository.c > @@ -678,6 +678,23 @@ read_gitconfig(struct got_repository *repo, const char > repo_gitconfig_path); > if (err) > goto done; > + > + if (getenv("GOT_IGNORE_GITCONFIG") != NULL) { > + int i; > + > + for (i = 0; i < repo->ngitconfig_remotes; i++) { > + got_repo_free_remote_repo_data( > + &repo->gitconfig_remotes[i]); > + } > + free(repo->gitconfig_remotes); needs to be set to NULL too to avoid a double free in got_repo_close (found the hard way) > + repo->ngitconfig_remotes = 0; > + > + free(repo->gitconfig_author_name); > + repo->gitconfig_author_name = NULL; > + free(repo->gitconfig_author_email); > + repo->gitconfig_author_email = NULL; should reset also the global fields, otherwise it doesn't fix the issue with the test. > + } > + > done: > free(repo_gitconfig_path); > return err; diff /home/op/w/got commit - dd2ffb6aab71d23f9c6afaa547b597deed3f43ad path + /home/op/w/got blob - 5f060f8735c6ad9bc96ad7421ce6a62402cc7d5c file + lib/repository.c --- lib/repository.c +++ lib/repository.c @@ -687,12 +687,18 @@ read_gitconfig(struct got_repository *repo, const char &repo->gitconfig_remotes[i]); } free(repo->gitconfig_remotes); + repo->gitconfig_remotes = NULL; repo->ngitconfig_remotes = 0; free(repo->gitconfig_author_name); repo->gitconfig_author_name = NULL; free(repo->gitconfig_author_email); repo->gitconfig_author_email = NULL; + + free(repo->global_gitconfig_author_name); + repo->global_gitconfig_author_name = NULL; + free(repo->global_gitconfig_author_email); + repo->global_gitconfig_author_email = NULL; } done: