summaryrefslogtreecommitdiff
path: root/src/storage.cpp
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2021-11-23 20:38:07 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2021-11-23 20:44:36 +0100
commit39f11bb10f8b0f8797110a6d8ce70b8c975e112f (patch)
tree9637a899d38963fe2816c9d8d758fc1f62a30b4d /src/storage.cpp
parent61d29440aae4713320083d81df1c9745c638aca0 (diff)
Storage: reload head before update
Diffstat (limited to 'src/storage.cpp')
-rw-r--r--src/storage.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/storage.cpp b/src/storage.cpp
index f68cb68..05b100a 100644
--- a/src/storage.cpp
+++ b/src/storage.cpp
@@ -821,14 +821,15 @@ bool Storage::replaceHead(UUID type, UUID id, const Ref & old, const Ref & ref)
optional<Ref> Storage::updateHead(UUID type, UUID id, const Ref & old, const std::function<Ref(const Ref &)> & f)
{
- Ref r = f(old);
- if (r.digest() == old.digest() || replaceHead(type, id, old, r))
+ auto cur = old.storage().headRef(type, id);
+ if (!cur)
+ return nullopt;
+
+ Ref r = f(*cur);
+ if (r.digest() == cur->digest() || replaceHead(type, id, *cur, r))
return r;
- if (auto cur = old.storage().headRef(type, id))
- return updateHead(type, id, *cur, f);
- else
- return nullopt;
+ return updateHead(type, id, *cur, f);
}
int Storage::watchHead(UUID type, UUID wid, const std::function<void(const Ref &)> watcher) const