Patchwork [2,of,6,RFC,hglib] hg_log: a high level function for mercurial log command

login
register
mail settings
Submitter Iulian Stana
Date Sept. 5, 2013, 2:13 p.m.
Message ID <4307b7b1166b01417bb9.1378390402@doppler>
Download mbox | patch
Permalink /patch/2333/
State Deferred, archived
Headers show

Comments

Iulian Stana - Sept. 5, 2013, 2:13 p.m.
# HG changeset patch
# User Iulian Stana <julian.stana@gmail.com>
# Date 1378383005 -10800
#      Thu Sep 05 15:10:05 2013 +0300
# Node ID 4307b7b1166b01417bb9e15467c9db16d059484b
# Parent  f9378d0bd4c029c52c50ee5205255f24e2073a6d
hg_log: a high level function for mercurial log command

This function can provide a huge amount of data. To prevent a stack overflow
this function will not provide any data. This function will provide a mechanism
to get data in chunks in a parse way.

Using hg_csetstream_buffer structure and hg_fetch_cset_entry function the data
will be delivered to user in chunks(a changeset at a time) and will be put in a
parse structure.

Patch

diff --git a/client.c b/client.c
--- a/client.c
+++ b/client.c
@@ -22,3 +22,24 @@ 
 	*buff = new_buff;
 	return new_buff_size;
 }
+
+/* The high level log command for hglib API. */
+hg_csetstream_buffer *hg_log(hg_handle *handle, int (*callback)(const char *msg,
+						size_t len), char *argument[])
+{
+	hg_csetstream_buffer *cbuf = malloc(sizeof(hg_csetstream_buffer));
+	cbuf->handle = handle;
+
+	cbuf->command = cmdbuilder("log", argument, "--template", CHANGESET,
+							NULL);
+
+	if(hg_rawcommand(handle, cbuf->command) < 0){
+		return NULL;
+	}
+
+	cbuf->callback = callback;
+	cbuf->buffer = NULL;
+	cbuf->buf_size = 0;
+
+	return cbuf;
+}
diff --git a/client.h b/client.h
new file mode 100644
--- /dev/null
+++ b/client.h
@@ -0,0 +1,52 @@ 
+#ifndef _CLIENT_H_
+#define _CLIENT_H_
+
+#include <errno.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+
+typedef struct hg_csetstream_buffer{
+	hg_handle *handle;
+	int (*callback)(const char *msg, size_t len);
+	char **command;
+	char *buffer;
+	int buf_size;
+	int first_cset_size;
+}hg_csetstream_buffer;
+
+
+
+/**
+ * \brief hg_log command for hglib API.
+ *
+ * It's an advance function to get revision history. It's more like the start 
+ * point of the action, this function will prepare the query question and will 
+ * send it to the cmd-server.
+ *
+ * Return the revision history of the specified files or the entire project.
+ * File history is shown without following rename or copy history of files.
+ * Use follow with a filename to follow history across renames and copies.
+ * follow without a filename will only show ancestors or descendants of the
+ * starting revision. followfirst only follows the first parent of merge
+ * revisions.
+ *
+ * If revrange isn't specified, the default is "tip:0" unless follow is set,
+ * in which case the working directory parent is used as the starting
+ * revision.
+ *
+ * \param handle The handle of the connection, wherewith I want to communicate
+ * \param callback A function that will handle error data. 
+ *                 A NULL pointer will ignore error data.
+ * \param argument The option list. Will contain all option that you wish.
+ * \retval hg_csetstream_buffer A pointer to hg_csetstream_buffer structure if 
+ *                              successful
+ * \retval NULL to indicate an error, with errno set appropriately.
+ *
+ * errno can be:
+ *      - hg_rawcommand errors
+ * */
+hg_csetstream_buffer *hg_log(hg_handle *handle, int (*callback)(const char *msg,
+						size_t len), char *argument[]);
+
+#endif