git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 4/7] worktree: prune duplicate entries referencing same worktree path

From
Shourya Shukla <shouryashukla.oo@gmail.com>
Date
Jun 10, 2020, 11:50 UTC
Message-ID
<20200610115028.GA11750@konoha>
In-Reply-To
<20200610063049.74666-5-sunshine@sunshineco.com>
Show 45 quoted lines
> diff --git a/builtin/worktree.c b/builtin/worktree.c
> index 706ac68751..65492752a7 100644
> --- a/builtin/worktree.c
> +++ b/builtin/worktree.c
> @@ -67,7 +67,12 @@ static void delete_worktrees_dir_if_empty(void)
>  	rmdir(git_path("worktrees")); /* ignore failed removal */
>  }
>  
> -static int should_prune_worktree(const char *id, struct strbuf *reason)
> +/*
> + * Return true if worktree entry should be pruned, along with the reason for
> + * pruning. Otherwise, return false and the worktree's path, or NULL if it
> + * cannot be determined. Caller is responsible for freeing returned path.
> + */
> +static int should_prune_worktree(const char *id, struct strbuf *reason, char **wtpath)
>  {
>  	struct stat st;
>  	char *path;
> @@ -75,6 +80,7 @@ static int should_prune_worktree(const char *id, struct strbuf *reason)
>  	size_t len;
>  	ssize_t read_result;
>  
> +	*wtpath = NULL;
>  	if (!is_directory(git_path("worktrees/%s", id))) {
>  		strbuf_addstr(reason, _("not a valid directory"));
>  		return 1;
> @@ -120,16 +126,17 @@ static int should_prune_worktree(const char *id, struct strbuf *reason)
>  	}
>  	path[len] = '\0';
>  	if (!file_exists(path)) {
> -		free(path);
>  		if (stat(git_path("worktrees/%s/index", id), &st) ||
>  		    st.st_mtime <= expire) {
>  			strbuf_addstr(reason, _("gitdir file points to non-existent location"));
> +			free(path);
>  			return 1;
>  		} else {
> +			*wtpath = path;
>  			return 0;
>  		}
>  	}
> -	free(path);
> +	*wtpath = path;
>  	return 0;
>  }

What exactly is the role of 'wtpath' in here? Maybe this is explained in the later patches.

Show 16 quoted lines
> @@ -141,22 +148,52 @@ static void prune_worktree(const char *id, const char *reason)
>  		delete_git_dir(id);
>  }
>  
> +static int prune_cmp(const void *a, const void *b)
> +{
> +	const struct string_list_item *x = a;
> +	const struct string_list_item *y = b;
> +	int c;
> +
> +	if ((c = fspathcmp(x->string, y->string)))
> +	    return c;
> +	/* paths same; sort by .git/worktrees/<id> */
> +	return strcmp(x->util, y->util);
> +}
> 

Can we rename the function arguments better? 'a' and 'b' sound very naive to me. Maybe change these to something more like: 'firstwt' and 'secondwt'? Yeah even this sounds kiddish but you get the idea right? Or like 'wt' and 'wt_dup'?

Show 10 quoted lines
> diff --git a/t/t2401-worktree-prune.sh b/t/t2401-worktree-prune.sh
> index b7d6d5d45a..fd3916fee0 100755
> --- a/t/t2401-worktree-prune.sh
> +++ b/t/t2401-worktree-prune.sh
> @@ -92,4 +92,16 @@ test_expect_success 'not prune proper checkouts' '
>  	test -d .git/worktrees/nop
>
>  
> +test_expect_success 'prune duplicate (linked/linked)' '
> +	test_when_finished rm -fr .git/worktrees w1 w2 &&
Nit: maybe make it 'rm -rf' as that's the popular way of doing it?

Otherwise this looks good to me. But again, we need comments from others too.

Nicely done! :)
Previous: Eric SunshineNext: Eric Sunshine
Message 11 of 13 in “worktree: tighten duplicate path detection”
  1. 0/7 worktree: tighten duplicate path detectionEric Sunshine, Jun 10, 2020
  2. 1/7 worktree: factor out repeated string literalEric Sunshine, Jun 10, 2020
  3. 2/7 worktree: give "should be pruned?" function more meaningful nameEric Sunshine, Jun 10, 2020
  4. 6/7 worktree: generalize candidate worktree path validationEric Sunshine, Jun 10, 2020
  5. Shourya ShuklaJun 10, 2020
  6. Eric SunshineJun 10, 2020
  7. 3/7 worktree: make high-level pruning re-usableEric Sunshine, Jun 10, 2020
  8. 5/7 worktree: prune linked worktree referencing main worktree pathEric Sunshine, Jun 10, 2020
  9. 7/7 worktree: make "move" refuse to move atop missing registered worktreeEric Sunshine, Jun 10, 2020
  10. 4/7 worktree: prune duplicate entries referencing same worktree pathEric Sunshine, Jun 10, 2020
  11. Shourya ShuklaJun 10, 2020
  12. Eric SunshineJun 10, 2020
  13. Junio C HamanoJun 10, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.