summaryrefslogtreecommitdiff
path: root/shared.c
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2007-05-13 14:21:19 +0200
committerLars Hjemli <hjemli@gmail.com>2007-05-13 14:21:19 +0200
commitc4ef667961ef4668c9449124f97d55b9ac46c059 (patch)
tree3e1d3ed9dbf2bac55d0ffbcd2909c5d935fae48b /shared.c
parent48dc00342effe3ba530ff6cbb79e5d0d5fc740fd (diff)
downloadcgit-c4ef667961ef4668c9449124f97d55b9ac46c059.tar.gz
cgit-c4ef667961ef4668c9449124f97d55b9ac46c059.tar.bz2
cgit-c4ef667961ef4668c9449124f97d55b9ac46c059.zip
Add standard interface for file diff functions
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'shared.c')
-rw-r--r--shared.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/shared.c b/shared.c
index f8a17b6..801f68d 100644
--- a/shared.c
+++ b/shared.c
@@ -207,6 +207,85 @@ void cgit_diff_tree_cb(struct diff_queue_struct *q,
}
}
+static int load_mmfile(mmfile_t *file, const unsigned char *sha1)
+{
+ enum object_type type;
+
+ if (is_null_sha1(sha1)) {
+ file->ptr = (char *)"";
+ file->size = 0;
+ } else {
+ file->ptr = read_sha1_file(sha1, &type, &file->size);
+ }
+ return 1;
+}
+
+/*
+ * Receive diff-buffers from xdiff and concatenate them as
+ * needed across multiple callbacks.
+ *
+ * This is basically a copy of xdiff-interface.c/xdiff_outf(),
+ * ripped from git and modified to use globals instead of
+ * a special callback-struct.
+ */
+char *diffbuf = NULL;
+int buflen = 0;
+
+int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf)
+{
+ int i;
+
+ for (i = 0; i < nbuf; i++) {
+ if (mb[i].ptr[mb[i].size-1] != '\n') {
+ /* Incomplete line */
+ diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
+ memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
+ buflen += mb[i].size;
+ continue;
+ }
+
+ /* we have a complete line */
+ if (!diffbuf) {
+ ((linediff_fn)priv)(mb[i].ptr, mb[i].size);
+ continue;
+ }
+ diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
+ memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
+ ((linediff_fn)priv)(diffbuf, buflen + mb[i].size);
+ free(diffbuf);
+ diffbuf = NULL;
+ buflen = 0;
+ }
+ if (diffbuf) {
+ ((linediff_fn)priv)(diffbuf, buflen);
+ free(diffbuf);
+ diffbuf = NULL;
+ buflen = 0;
+ }
+ return 0;
+}
+
+int cgit_diff_files(const unsigned char *old_sha1,
+ const unsigned char *new_sha1,
+ linediff_fn fn)
+{
+ mmfile_t file1, file2;
+ xpparam_t diff_params;
+ xdemitconf_t emit_params;
+ xdemitcb_t emit_cb;
+
+ if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1))
+ return 1;
+
+ diff_params.flags = XDF_NEED_MINIMAL;
+ emit_params.ctxlen = 3;
+ emit_params.flags = XDL_EMIT_FUNCNAMES;
+ emit_cb.outf = filediff_cb;
+ emit_cb.priv = fn;
+ xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb);
+ return 0;
+}
+
void cgit_diff_tree(const unsigned char *old_sha1,
const unsigned char *new_sha1,
filepair_fn fn)
4496811608c549fb541e1&follow=1'>clip: suppress kill errorJason A. Donenfeld2-3/+3 2014-03-22clip: do not race on osxJason A. Donenfeld1-5/+5 2014-03-22clip: use pkill instead of procJason A. Donenfeld1-1/+1 2014-03-20Keepass import should include root-level entriesErik Mackdanz1-0/+1 Repro steps: 1. In KeePass, add some entries as children of the root node 2. Export the KeePass to foo.xml 3. 'keepass2pass.py -f foo.xml' Expect: all entries imported Actual: root-level entries are skipped 2014-03-20keepassx2pass: friendly title fieldPhilip Chase1-1/+24 This patch removes several special characters while attempting to preserve as much meaning in the filename as possible. These changes are made to the KeepassX title before it is used as a file password store filename: - Spaces between words in file names are replaced with camelCasing. - The characters \ | ( ) are each replaced with a hyphen. - Trailing hypens are removed. - @ is replaced with "At" - ' is removed