On 2/2/2018 10:32 AM, SZEDER Gábor wrote:
Teach Git to write a commit graph file by checking all packed objects
to see if they are commits, then store the file in the given pack
directory.
I'm afraid that scanning all packed objects is a bit of a roundabout
way to approach this.

In my git repo, with 9 pack files at the moment, i.e. not that big a
repo and not that many pack files:

   $ time ./git commit-graph --write --update-head
   4df41a3d1cc408b7ad34bea87b51ec4ccbf4b803

   real    0m27.550s
   user    0m27.113s
   sys     0m0.376s

In comparison, performing a good old revision walk to gather all the
info that is written into the graph file:

   $ time git log --all --topo-order --format='%H %T %P %cd' |wc -l
   52954

   real    0m0.903s
   user    0m0.972s
   sys     0m0.058s

Two reasons this is in here:

(1) It's easier to get the write implemented this way and add the reachable closure later (which I do).

(2) For GVFS, we want to add all commits that arrived in a "prefetch pack" to the graph even if we do not have a ref that points to the commit yet. We expect many commits to become reachable soon and having them in the graph saves a lot of time in merge-base calculations.

So, (1) is for patch simplicity, and (2) is why I want it to be an option in the final version. See the --stdin-packs argument later for a way to do this incrementally.

I expect almost all users to use the reachable closure method with --stdin-commits (and that's how I will integrate automatic updates with 'fetch', 'repack', and 'gc' in a later patch).


+char* get_commit_graph_filename_hash(const char *pack_dir,
+                                    struct object_id *hash)
+{
+       size_t len;
+       struct strbuf head_path = STRBUF_INIT;
+       strbuf_addstr(&head_path, pack_dir);
+       strbuf_addstr(&head_path, "/graph-");
+       strbuf_addstr(&head_path, oid_to_hex(hash));
+       strbuf_addstr(&head_path, ".graph");
Nit: this is assembling the path of a graph file, not that of a
graph-head, so the strbuf should be renamed accordingly.

+
+       return strbuf_detach(&head_path, &len);
+}

Reply via email to