Thread (119 messages) 119 messages, 6 authors, 14d ago

Re: [PATCH v2 5/9] reset: introduce ability to skip reference updates

From: Phillip Wood <hidden>
Date: 2026-06-05 15:12:57

Hi Patrick

On 03/06/2026 17:14, Patrick Steinhardt wrote:
In a subsequent commit we'll introduce a new caller to `reset_head()`
that really only wants to update the index and working tree, without
updating any references. Introduce a new flag that lets the caller
perform this operation.
We already have a flag to update ORIG_HEAD so would it make more sense 
to have a flag to update HEAD, rather than adding a flag to disable the 
updates? It would mean updating the existing callers but I think it is a 
clearer api and it avoids the pitfall of

	RESET_HEAD_ORIG_HEAD | RESET_HEAD_SKIP_REF_UPDATES

I wonder about the function name as well if we make updating HEAD 
optional then what does reset_head() mean? Maybe we should rename it 
something along the lines of reset_worktree() or update_working_copy()? 
I'm not really sure what a good name would be.

Thanks

Phillip
quoted hunk ↗ jump to hunk
Signed-off-by: Patrick Steinhardt <redacted>
---
  reset.c | 7 ++++++-
  reset.h | 3 +++
  2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/reset.c b/reset.c
index a8d7eea4d6..ed9df6ca5c 100644
--- a/reset.c
+++ b/reset.c
@@ -93,6 +93,7 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts)
  	unsigned refs_only = opts->flags & RESET_HEAD_REFS_ONLY;
  	unsigned update_orig_head = opts->flags & RESET_HEAD_ORIG_HEAD;
  	unsigned dry_run = opts->flags & RESET_HEAD_DRY_RUN;
+	unsigned skip_ref_updates = opts->flags & RESET_HEAD_SKIP_REF_UPDATES;
  	struct object_id *head = NULL, head_oid;
  	struct tree_desc desc[2] = { { NULL }, { NULL } };
  	struct lock_file lock = LOCK_INIT;
@@ -112,6 +113,9 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts)
  	if (opts->branch_msg && !opts->branch)
  		BUG("branch reflog message given without a branch");
  
+	if (skip_ref_updates && (opts->branch || refs_only))
+		BUG("asked to perform ref updates and skip them at the same time");
+
  	if (!refs_only && !dry_run && repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
  		ret = -1;
  		goto leave_reset_head;
@@ -196,7 +200,8 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts)
  		goto leave_reset_head;
  	}
  
-	if (oid != &head_oid || update_orig_head || switch_to_branch)
+	if (!skip_ref_updates &&
+	    (oid != &head_oid || update_orig_head || switch_to_branch))
  		ret = update_refs(r, opts, oid, head);
  
  leave_reset_head:
diff --git a/reset.h b/reset.h
index 9f696382c1..cb0700ffa7 100644
--- a/reset.h
+++ b/reset.h
@@ -27,6 +27,9 @@ enum reset_head_flags {
  	 * any user-visible state.
  	 */
  	RESET_HEAD_DRY_RUN = (1 << 5),
+
+	/* Skip updating any references, only update the worktree and index. */
+	RESET_HEAD_SKIP_REF_UPDATES = (1 << 6),
  };
  
  struct reset_head_opts {
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help