mirror of
https://github.com/NixOS/nix.git
synced 2025-11-30 06:01:00 +01:00
Fix the parsing of the sourcehut refs file
Since a26be9f3b8, the same parser is used
to parse the result of sourcehut’s `HEAD` endpoint (coming from [git
dumb protocol]) and the output of `git ls-remote`. However, they are very
slightly different (the former doesn’t specify the current reference
since it’s implied to be `HEAD`).
Unify both, and make the parser a bit more robust and understandable (by
making it more typed and adding tests for it)
[git dumb protocol]: https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols#_the_dumb_protocol
This commit is contained in:
parent
470e27ce80
commit
e68676e6c8
7 changed files with 116 additions and 63 deletions
|
|
@ -6,7 +6,7 @@
|
|||
#include "url-parts.hh"
|
||||
#include "pathlocks.hh"
|
||||
#include "util.hh"
|
||||
#include "git-utils.hh"
|
||||
#include "git.hh"
|
||||
|
||||
#include "fetch-settings.hh"
|
||||
|
||||
|
|
@ -72,13 +72,16 @@ std::optional<std::string> readHead(const Path & path)
|
|||
|
||||
std::string_view line = output;
|
||||
line = line.substr(0, line.find("\n"));
|
||||
if (const auto ref = parseListReferenceHeadRef(line); ref) {
|
||||
debug("resolved HEAD ref '%s' for repo '%s'", *ref, path);
|
||||
return *ref;
|
||||
}
|
||||
if (const auto rev = parseListReferenceForRev("HEAD", line); rev) {
|
||||
debug("resolved HEAD rev '%s' for repo '%s'", *rev, path);
|
||||
return *rev;
|
||||
if (const auto parseResult = git::parseLsRemoteLine(line)) {
|
||||
switch (parseResult->kind) {
|
||||
case git::LsRemoteRefLine::Kind::Symbolic:
|
||||
debug("resolved HEAD ref '%s' for repo '%s'", parseResult->target, path);
|
||||
break;
|
||||
case git::LsRemoteRefLine::Kind::Object:
|
||||
debug("resolved HEAD rev '%s' for repo '%s'", parseResult->target, path);
|
||||
break;
|
||||
}
|
||||
return parseResult->target;
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue