Skip to content

Commit

Permalink
Merge pull request #509 from mih/bf-core-7522
Browse files Browse the repository at this point in the history
Patch update for more robust behavior with adjusted branches
  • Loading branch information
mih authored Oct 25, 2023
2 parents 4574a91 + e70fde6 commit 4dac4b0
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 0 deletions.
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)

0 comments on commit 4dac4b0

Please sign in to comment.