last_modified: don't find_blob; find the commit! #10
|
@ -463,12 +463,19 @@ module Make (Pclock : Mirage_clock.PCLOCK) = struct
|
||||||
|
|
||||||
let last_modified t key =
|
let last_modified t key =
|
||||||
let open Lwt.Infix in
|
let open Lwt.Infix in
|
||||||
find_blob t key >>=
|
match t.committed, t.head with
|
||||||
Option.fold
|
| None, None ->
|
||||||
~none:(Lwt.return (Error (`Not_found key)))
|
Lwt.return (Error (`Not_found key))
|
||||||
~some:(fun head ->
|
| Some _, _ ->
|
||||||
Store.read_exn t.store head >|= function
|
Lwt.return_ok
|
||||||
| Commit c ->
|
(Option.fold
|
||||||
|
~none:Ptime.epoch
|
||||||
|
~some:Fun.id (Ptime.of_float_s (Int64.to_float (now ()))))
|
||||||
|
| None, Some head ->
|
||||||
|
(* See https://github.com/ocaml/ocaml/issues/9301 why we have the
|
||||||
|
intermediate [r] value. *)
|
||||||
|
let+ r = Store.read_exn t.store head in
|
||||||
|
let[@warning "-8"] Commit c = r in
|
||||||
let author = Git_commit.author c in
|
let author = Git_commit.author c in
|
||||||
let secs, tz_offset = author.Git.User.date in
|
let secs, tz_offset = author.Git.User.date in
|
||||||
let secs =
|
let secs =
|
||||||
|
@ -486,10 +493,6 @@ module Make (Pclock : Mirage_clock.PCLOCK) = struct
|
||||||
~some:Fun.id (Ptime.of_float_s (Int64.to_float secs))
|
~some:Fun.id (Ptime.of_float_s (Int64.to_float secs))
|
||||||
in
|
in
|
||||||
hannes marked this conversation as resolved
Outdated
|
|||||||
Ok ts
|
Ok ts
|
||||||
| _ ->
|
|
||||||
reynir
commented
We ended up here due to We ended up here due to `find_blob` returning a `Blob _` and not a `Commit _` (how surprising given the name!)
hannes
commented
should the same be applied to should the same be applied to `digest` -- where !6 and !8 introduced the `val commit` since we ended up in https://github.com/robur-coop/git-kv/issues/6...
reynir
commented
Hm. To me it seems fine that Hm. To me it seems fine that `digest` returns the blob. As I understand it it's a digest that represents the file data. Maybe @dinosaure, who has a much better understanding of both git and ocaml-git, has an opinion?
hannes
commented
What Here, it is nowadays computed by the commit if we're not in change_and_push, and by this Blob thingy if we're in change_and_push. Of course we can leave that as is -- but I think that having a divergence in what the digest is computed over depending on whether we're in change_and_push or not may lead to unexpected strange error situations. But this is off-topic to the PR you propose here... What `digest` should return is a unique hash of the data. This can be achieved by the last commit sha1. This can as well be done by computing a hash of the content.
Here, it is nowadays computed by the commit if we're not in change_and_push, and by this Blob thingy if we're in change_and_push. Of course we can leave that as is -- but I think that having a divergence in what the digest is computed over depending on whether we're in change_and_push or not may lead to unexpected strange error situations.
But this is off-topic to the PR you propose here...
|
|||||||
Ok (Option.fold
|
|
||||||
~none:Ptime.epoch
|
|
||||||
~some:Fun.id (Ptime.of_float_s (Int64.to_float (now ())))))
|
|
||||||
|
|
||||||
let digest t key =
|
let digest t key =
|
||||||
let open Lwt.Infix in
|
let open Lwt.Infix in
|
||||||
|
|
this case shouldn't be needed
What do you suggest instead? Mute partial match warnings?
yes, as done in
let pull
This is done in
d2a0e526da
. I found that there's no support for infix attributes on binding operators (.e.glet+
) so I went with an intermediate binding.https://github.com/ocaml/ocaml/issues/9301