Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Patch update for more robust behavior with adjusted branches #509

Merged
merged 1 commit into from
Oct 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions changelog.d/20231025_202631_michael.hanke_bf_core_7522.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
### 🐛 Bug Fixes

- Add patch to fix `update`'s target detection for adjusted mode datasets
that can crash under some circumstances.
See https://github.com/datalad/datalad/issues/7507, fixed via
https://github.com/datalad/datalad-next/pull/509 (by @mih)
1 change: 1 addition & 0 deletions datalad_next/patches/enabled.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@
customremotes_main,
create_sibling_gitlab,
run,
update,
)
58 changes: 58 additions & 0 deletions datalad_next/patches/update.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""Robustify ``update()`` target detection for adjusted mode datasets

The true cause of the problem is not well understood.
https://github.com/datalad/datalad/issues/7507 documents that it is not
easy to capture the breakage in a test.
"""

from . import apply_patch


# This function is taken from datalad-core@cdc0ceb30ae04265c5369186acf2ab2683a8ec96
# datalad/distribution/update.py
# The change has been proposed in https://github.com/datalad/datalad/pull/7522
def _choose_update_target(repo, branch, remote, cfg_remote):
"""Select a target to update `repo` from.

Note: This function is not concerned with _how_ the update is done (e.g.,
merge, reset, ...).

Parameters
----------
repo : Repo instance
branch : str
The current branch.
remote : str
The remote which updates are coming from.
cfg_remote : str
The configured upstream remote.

Returns
-------
str (the target) or None if a choice wasn't made.
"""
target = None
if cfg_remote and remote == cfg_remote:
# Use the configured cfg_remote branch as the target.
#
# In this scenario, it's tempting to use FETCH_HEAD as the target. For
# a merge, that would be the equivalent of 'git pull REMOTE'. But doing
# so would be problematic when the GitRepo.fetch() call was passed
# all_=True. Given we can't use FETCH_HEAD, it's tempting to use the
# branch.*.merge value, but that assumes a value for remote.*.fetch.
target = repo.call_git_oneline(
["rev-parse", "--symbolic-full-name", "--abbrev-ref=strict",
# THIS IS THE PATCH: prefix @{upstream} with the branch name
# of the corresponding branch
f"{repo.get_corresponding_branch(branch) or ''}" "@{upstream}"],
read_only=True)
elif branch:
remote_branch = "{}/{}".format(remote, branch)
if repo.commit_exists(remote_branch):
target = remote_branch
return target


apply_patch(
'datalad.distribution.update', None, '_choose_update_target',
_choose_update_target)
Loading