Introduction
Introduction Statistics Contact Development Disclaimer Help
toptimization: only diff the tree when it is needed for the diffstat... - stagi…
git clone git://src.adamsgaard.dk/stagit
Log
Files
Refs
README
LICENSE
---
commit f53f481b3f02431b151ae9953998d7c7b3138585
parent 20c37e4fe4bfef13642542f3fa15aa73c92a037c
Author: Hiltjo Posthuma <[email protected]>
Date: Sun, 18 Mar 2018 15:34:37 +0100
optimization: only diff the tree when it is needed for the diffstat...
... also clear all fields in the structure on failure.
This is not as big an optimization as stagit-gopher, because the diffstat is
displayed in the log, but the difference is still measurable.
Diffstat:
M stagit.c | 44 +++++++++++++++++++----------…
1 file changed, 27 insertions(+), 17 deletions(-)
---
diff --git a/stagit.c b/stagit.c
t@@ -87,7 +87,7 @@ deltainfo_free(struct deltainfo *di)
if (!di)
return;
git_patch_free(di->patch);
- di->patch = NULL;
+ memset(di, 0, sizeof(*di));
free(di);
}
t@@ -95,6 +95,7 @@ int
commitinfo_getstats(struct commitinfo *ci)
{
struct deltainfo *di;
+ git_diff_options opts;
const git_diff_delta *delta;
const git_diff_hunk *hunk;
const git_diff_line *line;
t@@ -102,6 +103,20 @@ commitinfo_getstats(struct commitinfo *ci)
size_t ndeltas, nhunks, nhunklines;
size_t i, j, k;
+ if (git_tree_lookup(&(ci->commit_tree), repo, git_commit_tree_id(ci->c…
+ goto err;
+ if (!git_commit_parent(&(ci->parent), ci->commit, 0)) {
+ if (git_tree_lookup(&(ci->parent_tree), repo, git_commit_tree_…
+ ci->parent = NULL;
+ ci->parent_tree = NULL;
+ }
+ }
+
+ git_diff_init_options(&opts, GIT_DIFF_OPTIONS_VERSION);
+ opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH;
+ if (git_diff_tree_to_tree(&(ci->diff), repo, ci->parent_tree, ci->comm…
+ goto err;
+
ndeltas = git_diff_num_deltas(ci->diff);
if (ndeltas && !(ci->deltas = calloc(ndeltas, sizeof(struct deltainfo …
err(1, "calloc");
t@@ -143,6 +158,15 @@ commitinfo_getstats(struct commitinfo *ci)
return 0;
err:
+ git_diff_free(ci->diff);
+ ci->diff = NULL;
+ git_tree_free(ci->commit_tree);
+ ci->commit_tree = NULL;
+ git_tree_free(ci->parent_tree);
+ ci->parent_tree = NULL;
+ git_commit_free(ci->parent);
+ ci->parent = NULL;
+
if (ci->deltas)
for (i = 0; i < ci->ndeltas; i++)
deltainfo_free(ci->deltas[i]);
t@@ -166,13 +190,14 @@ commitinfo_free(struct commitinfo *ci)
if (ci->deltas)
for (i = 0; i < ci->ndeltas; i++)
deltainfo_free(ci->deltas[i]);
+
free(ci->deltas);
- ci->deltas = NULL;
git_diff_free(ci->diff);
git_tree_free(ci->commit_tree);
git_tree_free(ci->parent_tree);
git_commit_free(ci->commit);
git_commit_free(ci->parent);
+ memset(ci, 0, sizeof(*ci));
free(ci);
}
t@@ -180,7 +205,6 @@ struct commitinfo *
commitinfo_getbyoid(const git_oid *id)
{
struct commitinfo *ci;
- git_diff_options opts;
if (!(ci = calloc(1, sizeof(struct commitinfo))))
err(1, "calloc");
t@@ -197,20 +221,6 @@ commitinfo_getbyoid(const git_oid *id)
ci->summary = git_commit_summary(ci->commit);
ci->msg = git_commit_message(ci->commit);
- if (git_tree_lookup(&(ci->commit_tree), repo, git_commit_tree_id(ci->c…
- goto err;
- if (!git_commit_parent(&(ci->parent), ci->commit, 0)) {
- if (git_tree_lookup(&(ci->parent_tree), repo, git_commit_tree_…
- ci->parent = NULL;
- ci->parent_tree = NULL;
- }
- }
-
- git_diff_init_options(&opts, GIT_DIFF_OPTIONS_VERSION);
- opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH;
- if (git_diff_tree_to_tree(&(ci->diff), repo, ci->parent_tree, ci->comm…
- goto err;
-
return ci;
err:
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.