From 96f3ca173331c5dba505d2ef5106cb0d605ec3be Mon Sep 17 00:00:00 2001 From: Roman Perepelitsa Date: Thu, 10 Jun 2021 10:15:02 +0200 Subject: Squashed 'gitstatus/' changes from 113f1f69..96b520b2 96b520b2 build v1.5.1 binaries for all platforms ffeb0507 bump version to v1.5.1 1bcbea07 mbuild: disable pacman upgrades on msys 39dbb92f log a warning if unable to parse packed-refs a9d70ec0 add `-r` flag to gitstatus_start in bash bindings (#241) abbf9a79 don't use static_assert with one argument as it's not available prior to c++17 (#239) f8c396e4 drop all tags if packed-refs doesn't have a header line (https://github.com/romkatv/powerlevel10k/issues/1428) git-subtree-dir: gitstatus git-subtree-split: 96b520b248ca872646e27b3df4535898356e4637 --- src/options.cc | 2 +- src/tag_db.cc | 33 ++++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/options.cc b/src/options.cc index 1879c424..46f3845c 100644 --- a/src/options.cc +++ b/src/options.cc @@ -54,7 +54,7 @@ long ParseInt(const char* s) { } size_t ParseSizeT(const char* s) { - static_assert(sizeof(long) <= sizeof(size_t)); + static_assert(sizeof(long) <= sizeof(size_t), ""); long res = ParseLong(s); return res >= 0 ? res : -1; } diff --git a/src/tag_db.cc b/src/tag_db.cc index 0e440791..31b150bd 100644 --- a/src/tag_db.cc +++ b/src/tag_db.cc @@ -212,13 +212,29 @@ void TagDb::ParsePack() { char* p = &pack_[0]; char* e = p + pack_.size(); - if (*p == '#') { - char* eol = std::strchr(p, '\n'); - if (!eol) return; - *eol = 0; - if (!std::strstr(p, " fully-peeled") || !std::strstr(p, " sorted")) return; - p = eol + 1; + // Usually packed-refs starts with the following line: + // + // # pack-refs with: peeled fully-peeled sorted + // + // However, some users can produce pack-refs without this line. + // See https://github.com/romkatv/powerlevel10k/issues/1428. + // I don't know how they do it. Without the header line we cannot + // assume that refs are sorted, which isn't a big deal because we + // can just sort them. What's worse is that refs cannot be assumed + // to be fully-peeled. We don't want to peel them, so we just drop + // all tags. + if (*p != '#') { + LOG(WARN) << "packed-refs doesn't have a header. Won't resolve tags."; + return; + } + + char* eol = std::strchr(p, '\n'); + if (!eol) return; + *eol = 0; + if (!std::strstr(p, " fully-peeled") || !std::strstr(p, " sorted")) { + LOG(WARN) << "packed-refs has unexpected header. Won't resolve tags."; } + p = eol + 1; name2id_.reserve(pack_.size() / 128); id2name_.reserve(pack_.size() / 128); @@ -249,7 +265,10 @@ void TagDb::ParsePack() { id2name_.push_back(tag); } - VERIFY(std::is_sorted(name2id_.begin(), name2id_.end(), ByName)); + if (!std::is_sorted(name2id_.begin(), name2id_.end(), ByName)) { + // "sorted" in the header of packed-refs promisses that this won't trigger. + std::sort(name2id_.begin(), name2id_.end(), ByName); + } id2name_dirty_ = true; GlobalThreadPool()->Schedule([this] { -- cgit v1.2.3