Skip to content

Conversation

aibaars
Copy link
Contributor

@aibaars aibaars commented Mar 5, 2025

Previously the add_helper function would check whether the command contains a \ or / character to determine whether it is absolute. It should have used starts_with instead of contains. In addition an absolute on Windows a path my start with a drive letter. The git cli implements this by checking if the second character is a ':'.

See also: https://github.com/git/git/blob/6a64ac7b014fa2cfa7a69af3c253bcd53a94b428/credential.c#L492-L493

Fixes #1136

@rustbot rustbot added the S-waiting-on-review Status: Waiting on review label Mar 5, 2025
@aibaars aibaars force-pushed the fix-credential-helper branch from 16bd0dc to ef3bca9 Compare March 10, 2025 10:41
@aibaars aibaars force-pushed the fix-credential-helper branch from ef3bca9 to c776e8d Compare March 10, 2025 10:42
Copy link
Contributor

@ehuss ehuss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

fn is_absolute_path(path: &str) -> bool {
path.starts_with('/')
|| path.starts_with('\\')
|| cfg!(windows) && path.chars().nth(1).is_some_and(|x| x == ':')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a minor note, this is slightly different from https://github.com/git-for-windows/git/blob/cca1f38702730b35f52c29efd62864b85e85ddcc/compat/win32/path-utils.c#L9-L31, but probably not enough to matter here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, git2-rs uses the str type while the git C uses a char* and if I understand the git C code correctly, it just tries to handle the case where the drive letter is a UTF8 character. I'd expect the str::nth function to take care of that already. However, there might indeed be some behaviour differences in corner cases at I'm not aware of.

@ehuss ehuss added this pull request to the merge queue Mar 17, 2025
Merged via the queue into rust-lang:master with commit 1e1687e Mar 17, 2025
7 checks passed
@ehuss
Copy link
Contributor

ehuss commented Mar 17, 2025

Note that this was relaxed in #429 which previously looked for starts_with, but I agree it is probably better to match behavior with git itself, and the : check should accommodate the original issue.

facebook-github-bot pushed a commit to facebook/sapling that referenced this pull request May 15, 2025
Summary:
# Changelog

## 0.20.2 - 2025-05-05
[0.20.1...0.20.2](rust-lang/git2-rs@git2-0.20.1...git2-0.20.2)

### Added

- Added `Status::WT_UNREADABLE`.
  [#1151](rust-lang/git2-rs#1151)

### Fixed

- Added missing codes for `GIT_EDIRECTORY`, `GIT_EMERGECONFLICT`, `GIT_EUNCHANGED`, `GIT_ENOTSUPPORTED`, and `GIT_EREADONLY` to `Error::raw_code`.
  [#1153](rust-lang/git2-rs#1153)
- Fixed missing initialization in `Indexer::new`.
  [#1160](rust-lang/git2-rs#1160)

## 0.20.1 - 2025-03-17
[0.20.0...0.20.1](rust-lang/git2-rs@git2-0.20.0...git2-0.20.1)

### Added

- Added `Repository::branch_upstream_merge()`
  [#1131](rust-lang/git2-rs#1131)
- Added `Index::conflict_get()`
  [#1134](rust-lang/git2-rs#1134)
- Added `Index::conflict_remove()`
  [#1133](rust-lang/git2-rs#1133)
- Added `opts::set_cache_object_limit()`
  [#1118](rust-lang/git2-rs#1118)
- Added `Repo::merge_file_from_index()` and associated `MergeFileOptions` and `MergeFileResult`.
  [#1062](rust-lang/git2-rs#1062)

### Changed

- The `url` dependency minimum raised to 2.5.4
  [#1128](rust-lang/git2-rs#1128)
- Changed the tracing callback to abort the process if the callback panics instead of randomly detecting the panic in some other function.
  [#1121](rust-lang/git2-rs#1121)
- Credential helper config (loaded with `CredentialHelper::config`) now checks for helpers that start with something that looks like an absolute path, rather than checking for a `/` or `\` anywhere in the helper string (which resolves an issue if the helper had arguments with `/` or `\`).
  [#1137](rust-lang/git2-rs#1137)

### Fixed

- Fixed panic in `Remote::url_bytes` if the url is empty.
  [#1120](rust-lang/git2-rs#1120)
- Fixed incorrect lifetimes on `Patch::delta`, `Patch::hunk`, and `Patch::line_in_hunk`. The return values must not outlive the `Patch`.
  [#1141](rust-lang/git2-rs#1141)
- Bumped requirement to libgit2-sys 0.18.1, which fixes linking of advapi32 on Windows.
  [#1143](rust-lang/git2-rs#1143)

ignore-conflict-markers

Reviewed By: JakobDegen

Differential Revision: D74659779

fbshipit-source-id: a18bcd8f58bc62c7eedbfa5939a791002e18d7bc
facebook-github-bot pushed a commit to facebookincubator/reindeer that referenced this pull request May 15, 2025
Summary:
# Changelog

## 0.20.2 - 2025-05-05
[0.20.1...0.20.2](rust-lang/git2-rs@git2-0.20.1...git2-0.20.2)

### Added

- Added `Status::WT_UNREADABLE`.
  [#1151](rust-lang/git2-rs#1151)

### Fixed

- Added missing codes for `GIT_EDIRECTORY`, `GIT_EMERGECONFLICT`, `GIT_EUNCHANGED`, `GIT_ENOTSUPPORTED`, and `GIT_EREADONLY` to `Error::raw_code`.
  [#1153](rust-lang/git2-rs#1153)
- Fixed missing initialization in `Indexer::new`.
  [#1160](rust-lang/git2-rs#1160)

## 0.20.1 - 2025-03-17
[0.20.0...0.20.1](rust-lang/git2-rs@git2-0.20.0...git2-0.20.1)

### Added

- Added `Repository::branch_upstream_merge()`
  [#1131](rust-lang/git2-rs#1131)
- Added `Index::conflict_get()`
  [#1134](rust-lang/git2-rs#1134)
- Added `Index::conflict_remove()`
  [#1133](rust-lang/git2-rs#1133)
- Added `opts::set_cache_object_limit()`
  [#1118](rust-lang/git2-rs#1118)
- Added `Repo::merge_file_from_index()` and associated `MergeFileOptions` and `MergeFileResult`.
  [#1062](rust-lang/git2-rs#1062)

### Changed

- The `url` dependency minimum raised to 2.5.4
  [#1128](rust-lang/git2-rs#1128)
- Changed the tracing callback to abort the process if the callback panics instead of randomly detecting the panic in some other function.
  [#1121](rust-lang/git2-rs#1121)
- Credential helper config (loaded with `CredentialHelper::config`) now checks for helpers that start with something that looks like an absolute path, rather than checking for a `/` or `\` anywhere in the helper string (which resolves an issue if the helper had arguments with `/` or `\`).
  [#1137](rust-lang/git2-rs#1137)

### Fixed

- Fixed panic in `Remote::url_bytes` if the url is empty.
  [#1120](rust-lang/git2-rs#1120)
- Fixed incorrect lifetimes on `Patch::delta`, `Patch::hunk`, and `Patch::line_in_hunk`. The return values must not outlive the `Patch`.
  [#1141](rust-lang/git2-rs#1141)
- Bumped requirement to libgit2-sys 0.18.1, which fixes linking of advapi32 on Windows.
  [#1143](rust-lang/git2-rs#1143)

ignore-conflict-markers

Reviewed By: JakobDegen

Differential Revision: D74659779

fbshipit-source-id: a18bcd8f58bc62c7eedbfa5939a791002e18d7bc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-review Status: Waiting on review
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Credentials helpers such as git config credential.helper "store --file /path/to/credentials" interpreted wrongly
3 participants