From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, johannes.schindelin@gmx.de,
Derrick Stolee <derrickstolee@github.com>
Subject: [PATCH v2 0/3] scalar: two downstream improvements
Date: Tue, 22 Aug 2023 17:24:12 +0000 [thread overview]
Message-ID: <pull.1569.v2.git.1692725056.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1569.git.1692025937.gitgitgadget@gmail.com>
While updating git-for-windows/git and microsoft/git for the 2.42.0 release
window, a few patches that we've been running in those forks for a while
came to light as something that would be beneficial to the core Git project.
Here are some that are focused on the 'scalar' command.
* Patch 1 adds a --no-src option to scalar clone to appease users who want
to use scalar but object to the creation of the src directory.
* Patches 2 and 3 help when scalar reconfigure -a fails. Patch 2 is a
possibly helpful change on its own for other uses in the future.
Updates in V2
=============
Thanks, Junio, for the helpful review!
* In Patch 1, the '--[no-]src' documentation is tightened and the tests
check the contents of the repository worktree.
* In Patch 2, the commit message is reworded to be more clear about
positive values of the enum.
* In Patch 2, the GIT_DIR_NONE option of the enum is never returned, so it
does not need to exist. A case in scalar.c referenced it, so it is
removed as part of the patch (though that case was removed later by patch
3 anyway).
* In Patch 2, the discover_git_directory() wrapper is updated to return -1
instead of 1, as it did before this patch.
* In Patch 3, the 'failed' variable is renamed to 'succeeded' and the cases
that update the value are swapped. The return code is set to -1 for any
error instead of having a custom value based on the return from error()
or error_errno().
Thanks, -Stolee
Derrick Stolee (3):
scalar: add --[no-]src option
setup: add discover_git_directory_reason()
scalar reconfigure: help users remove buggy repos
Documentation/scalar.txt | 8 ++++-
scalar.c | 65 +++++++++++++++++++++++++++++-----------
setup.c | 34 ++++++++-------------
setup.h | 35 ++++++++++++++++++++--
t/t9211-scalar-clone.sh | 12 ++++++++
5 files changed, 110 insertions(+), 44 deletions(-)
base-commit: a82fb66fed250e16d3010c75404503bea3f0ab61
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1569%2Fderrickstolee%2Fscalar-no-src-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1569/derrickstolee/scalar-no-src-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1569
Range-diff vs v1:
1: c1c7e2f049e ! 1: 0b6957beccb scalar: add --[no-]src option
@@ Documentation/scalar.txt: remote-tracking branch for the branch this option was
`--single-branch` clone was made, no remote-tracking branch is created.
+--[no-]src::
-+ Specify if the repository should be created within a `src` directory
-+ within `<enlistment>`. This is the default behavior, so use
-+ `--no-src` to opt-out of the creation of the `src` directory.
++ By default, `scalar clone` places the cloned repository within a
++ `<entlistment>/src` directory. Use `--no-src` to place the cloned
++ repository directly in the `<enlistment>` directory.
+
--[no-]full-clone::
A sparse-checkout is initialized by default. This behavior can be
@@ t/t9211-scalar-clone.sh: test_expect_success 'scalar clone warns when background
+ scalar clone --no-src "file://$(pwd)/to-clone" without-src &&
+
+ test_path_is_dir with-src/src &&
-+ test_path_is_missing without-src/src
++ test_path_is_missing without-src/src &&
++
++ (cd with-src/src && ls ?*) >with &&
++ (cd without-src && ls ?*) >without &&
++ test_cmp with without
+'
+
test_done
2: fbba6252aea ! 2: 787af0f9744 setup: add discover_git_directory_reason()
@@ Commit message
1. The zero value of the enum is actually GIT_DIR_NONE, so nonpositive
results are errors.
- 2. There are multiple successful states, so some positive results are
+ 2. There are multiple successful states; positive results are
successful.
+ It is worth noting that GIT_DIR_NONE is not returned, so we remove this
+ option from the enum. We must be careful to keep the successful reasons
+ as positive values, so they are given explicit positive values.
+ Further, a use in scalar.c was previously impossible, so it is removed.
+
Instead of updating all callers immediately, add a new method,
discover_git_directory_reason(), and convert discover_git_directory() to
be a thin shim on top of it.
+ One thing that is important to note is that discover_git_directory()
+ previously returned -1 on error, so let's continue that into the future.
+ There is only one caller (in scalar.c) that depends on that signedness
+ instead of a non-zero check, so clean that up, too.
+
Because there are extra checks that discover_git_directory_reason() does
after setup_git_directory_gently_1(), there are other modes that can be
returned for failure states. Add these modes to the enum, but be sure to
@@ Commit message
Signed-off-by: Derrick Stolee <derrickstolee@github.com>
+ ## scalar.c ##
+@@ scalar.c: static int cmd_reconfigure(int argc, const char **argv)
+ warning(_("removing stale scalar.repo '%s'"),
+ dir);
+ strbuf_release(&buf);
+- } else if (discover_git_directory(&commondir, &gitdir) < 0) {
+- warning_errno(_("git repository gone in '%s'"), dir);
+- res = -1;
+ } else {
+ git_config_clear();
+
+
## setup.c ##
@@ setup.c: static const char *allowed_bare_repo_to_string(
return NULL;
@@ setup.c: static enum discovery_result setup_git_directory_gently_1(struct strbuf
cwd_len = dir.len;
- if (setup_git_directory_gently_1(&dir, gitdir, NULL, 0) <= 0) {
-+ if ((result = setup_git_directory_gently_1(&dir, gitdir, NULL, 0)) <= 0) {
++ result = setup_git_directory_gently_1(&dir, gitdir, NULL, 0);
++ if (result <= 0) {
strbuf_release(&dir);
- return -1;
+ return result;
@@ setup.c: int discover_git_directory(struct strbuf *commondir,
const char *setup_git_directory_gently(int *nongit_ok)
@@ setup.c: const char *setup_git_directory_gently(int *nongit_ok)
+ }
*nongit_ok = 1;
break;
- case GIT_DIR_NONE:
+- case GIT_DIR_NONE:
+ case GIT_DIR_CWD_FAILURE:
+ case GIT_DIR_INVALID_FORMAT:
/*
@@ setup.h: const char *resolve_gitdir_gently(const char *suspect, int *return_erro
+ * from discover_git_directory.
+ */
+enum discovery_result {
-+ GIT_DIR_NONE = 0,
-+ GIT_DIR_EXPLICIT,
-+ GIT_DIR_DISCOVERED,
-+ GIT_DIR_BARE,
++ GIT_DIR_EXPLICIT = 1,
++ GIT_DIR_DISCOVERED = 2,
++ GIT_DIR_BARE = 3,
+ /* these are errors */
+ GIT_DIR_HIT_CEILING = -1,
+ GIT_DIR_HIT_MOUNT_POINT = -2,
@@ setup.h: const char *resolve_gitdir_gently(const char *suspect, int *return_erro
/*
* Find the commondir and gitdir of the repository that contains the current
* working directory, without changing the working directory or other global
-@@ setup.h: void setup_work_tree(void);
+ * state. The result is appended to commondir and gitdir. If the discovered
+ * gitdir does not correspond to a worktree, then 'commondir' and 'gitdir' will
* both have the same result appended to the buffer. The return value is
- * either 0 upon success and non-zero if no repository was found.
+- * either 0 upon success and non-zero if no repository was found.
++ * either 0 upon success and -1 if no repository was found.
*/
-int discover_git_directory(struct strbuf *commondir,
- struct strbuf *gitdir);
+static inline int discover_git_directory(struct strbuf *commondir,
+ struct strbuf *gitdir)
+{
-+ return discover_git_directory_reason(commondir, gitdir) <= 0;
++ if (discover_git_directory_reason(commondir, gitdir) <= 0)
++ return -1;
++ return 0;
+}
+
const char *setup_git_directory_gently(int *);
3: 907410f76c4 ! 3: 7ac7311863d scalar reconfigure: help users remove buggy repos
@@ scalar.c: static int cmd_reconfigure(int argc, const char **argv)
git_config(get_scalar_repos, &scalar_repos);
for (i = 0; i < scalar_repos.nr; i++) {
-+ int failed = 0;
++ int succeeded = 0;
const char *dir = scalar_repos.items[i].string;
strbuf_reset(&commondir);
@@ scalar.c: static int cmd_reconfigure(int argc, const char **argv)
warning_errno(_("could not switch to '%s'"), dir);
- res = -1;
- continue;
-+ failed = -1;
+ goto loop_end;
}
@@ scalar.c: static int cmd_reconfigure(int argc, const char **argv)
if (remove_deleted_enlistment(&buf))
- res = error(_("could not remove stale "
- "scalar.repo '%s'"), dir);
-+ failed = error(_("could not remove stale "
-+ "scalar.repo '%s'"), dir);
- else
+- else
- warning(_("removing stale scalar.repo '%s'"),
++ error(_("could not remove stale "
++ "scalar.repo '%s'"), dir);
++ else {
+ warning(_("removed stale scalar.repo '%s'"),
dir);
++ succeeded = 1;
++ }
strbuf_release(&buf);
-- } else if (discover_git_directory(&commondir, &gitdir) < 0) {
-- warning_errno(_("git repository gone in '%s'"), dir);
-- res = -1;
- } else {
- git_config_clear();
--
-- the_repository = &r;
-- r.commondir = commondir.buf;
-- r.gitdir = gitdir.buf;
--
-- if (set_recommended_config(1) < 0)
-- res = -1;
+ goto loop_end;
+ }
+
+ switch (discover_git_directory_reason(&commondir, &gitdir)) {
+ case GIT_DIR_INVALID_OWNERSHIP:
+ warning(_("repository at '%s' has different owner"), dir);
-+ failed = -1;
+ goto loop_end;
+
+ case GIT_DIR_DISCOVERED:
++ succeeded = 1;
+ break;
+
+ default:
+ warning(_("repository not found in '%s'"), dir);
-+ failed = -1;
+ break;
+ }
+
@@ scalar.c: static int cmd_reconfigure(int argc, const char **argv)
+ the_repository = &r;
+ r.commondir = commondir.buf;
+ r.gitdir = gitdir.buf;
-+
-+ if (set_recommended_config(1) < 0)
-+ failed = -1;
-+
+
+- the_repository = &r;
+- r.commondir = commondir.buf;
+- r.gitdir = gitdir.buf;
++ if (set_recommended_config(1) >= 0)
++ succeeded = 1;
+
+- if (set_recommended_config(1) < 0)
+- res = -1;
+loop_end:
-+ if (failed) {
-+ res = failed;
++ if (!succeeded) {
++ res = -1;
+ warning(_("to unregister this repository from Scalar, run\n"
+ "\tgit config --global --unset --fixed-value scalar.repo \"%s\""),
+ dir);
--
gitgitgadget
next prev parent reply other threads:[~2023-08-22 17:24 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-14 15:12 [PATCH 0/3] scalar: two downstream improvements Derrick Stolee via GitGitGadget
2023-08-14 15:12 ` [PATCH 1/3] scalar: add --[no-]src option Derrick Stolee via GitGitGadget
2023-08-14 16:02 ` Junio C Hamano
2023-08-14 19:20 ` Derrick Stolee
2023-08-14 15:12 ` [PATCH 2/3] setup: add discover_git_directory_reason() Derrick Stolee via GitGitGadget
2023-08-14 16:29 ` Junio C Hamano
2023-08-14 16:55 ` Junio C Hamano
2023-08-14 15:12 ` [PATCH 3/3] scalar reconfigure: help users remove buggy repos Derrick Stolee via GitGitGadget
2023-08-14 16:44 ` Junio C Hamano
2023-08-22 17:24 ` Derrick Stolee via GitGitGadget [this message]
2023-08-22 17:24 ` [PATCH v2 1/3] scalar: add --[no-]src option Derrick Stolee via GitGitGadget
2023-08-23 9:25 ` Oswald Buddenhagen
2023-08-22 17:24 ` [PATCH v2 2/3] setup: add discover_git_directory_reason() Derrick Stolee via GitGitGadget
2023-08-22 19:30 ` Junio C Hamano
2023-08-22 19:39 ` Derrick Stolee
2023-08-23 9:58 ` Oswald Buddenhagen
2023-08-22 17:24 ` [PATCH v2 3/3] scalar reconfigure: help users remove buggy repos Derrick Stolee via GitGitGadget
2023-08-22 19:45 ` Junio C Hamano
2023-08-25 17:21 ` Derrick Stolee
2023-08-25 18:05 ` Junio C Hamano
2023-08-28 13:52 ` [PATCH v3 0/3] scalar: two downstream improvements Derrick Stolee via GitGitGadget
2023-08-28 13:52 ` [PATCH v3 1/3] scalar: add --[no-]src option Derrick Stolee via GitGitGadget
2023-08-28 13:52 ` [PATCH v3 2/3] setup: add discover_git_directory_reason() Derrick Stolee via GitGitGadget
2023-08-28 13:52 ` [PATCH v3 3/3] scalar reconfigure: help users remove buggy repos Derrick Stolee via GitGitGadget
2023-08-28 16:22 ` [PATCH v3 0/3] scalar: two downstream improvements Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1569.v2.git.1692725056.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=derrickstolee@github.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).