Patchwork [5,of,5,V3,c-hglib] examples: export-import command example, implemented using level 0

login
register
mail settings
Submitter Giovanni Gherdovich
Date Feb. 7, 2014, 10:26 p.m.
Message ID <d2f51737f8b2b819796c.1391811961@tosh>
Download mbox | patch
Permalink /patch/3519/
State Accepted
Headers show

Comments

Giovanni Gherdovich - Feb. 7, 2014, 10:26 p.m.
# HG changeset patch
# User Iulian Stana and Giovanni Gherdovich <g.gherdovich@gmail.com>
# Date 1380292048 -10800
#      Fri Sep 27 17:27:28 2013 +0300
# Node ID d2f51737f8b2b819796c660b8fb5728862684ccc
# Parent  658ac21e531b82c1cc1208d6c2950013f7cc508c
examples: export-import command example, implemented using level 0

This is a illustative implementation for export-import command. The
implementation is using just level0 functions.

This example prove the possibility of creating a function that export data from
a repository and import it to a second repository without buffering the entire
data in memory.
Matt Mackall - Feb. 17, 2014, 11:03 p.m.
On Fri, 2014-02-07 at 23:26 +0100, Giovanni Gherdovich wrote:
> # HG changeset patch
> # User Iulian Stana and Giovanni Gherdovich <g.gherdovich@gmail.com>
> # Date 1380292048 -10800
> #      Fri Sep 27 17:27:28 2013 +0300
> # Node ID d2f51737f8b2b819796c660b8fb5728862684ccc
> # Parent  658ac21e531b82c1cc1208d6c2950013f7cc508c
> examples: export-import command example, implemented using level 0

These are queued for c-hglib, thanks. They all came through with tabs
converted to spaces + one space dropped, so I've manually re-indented
them all. Probably gmail's fault.

Patch

diff -r 658ac21e531b -r d2f51737f8b2 README
--- a/README	Fri Sep 27 17:11:45 2013 +0300
+++ b/README	Fri Sep 27 17:27:28 2013 +0300
@@ -78,6 +78,38 @@ 
 In the example folder you will find examples on how you can use c-hglib API.
 To compile the binary files you can use the Makefile from the root directory.
 
+* Export-Import example:
+
+The export-import example will use the level 0 implementation and will export
+the first revision from the first given repository and will import it to the
+second given repository.
+To compile the binary file you can use the make tool with "examples" target.
+  > make examples
+
+This action will create an executable file named export_import_level0.
+
+This executable is `export`-ing revision 0 from a repo (whose path is given as
+first argument) and `import`-ing it to another repo (whose path is given as
+second argument).
+
+If c-hglib has not been installed system-wide via `make install`, the
+environment variable LD_LIBRARY_PATH has to be augmented with the path of
+libhg.so, which is likely to be the path to c-hglib sources (it's the case if
+only `make build` has been run).
+
+  e.g: LD_LIBRARY_PATH=/path/to/c-hglib:$LD_LIBRARY_PATH \
+       ./export_import_level0 export_repo_path import_repo_path
+
+To run this example, you can use two existing mercurial repository,
+or create some throw-away ones just for the example. Here is how
+you can create an ad-hoc repository
+  e.g:
+  > hg init export
+  > cd export
+  > touch foo ; echo boloo > foo; hg add foo ; hg commit -m foo
+  > cd ..
+  > hg init import
+
 * Import example:
 
 The import example will use the level 0 implementation and will import to the
diff -r 658ac21e531b -r d2f51737f8b2 examples/export-import.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/export-import.c	Fri Sep 27 17:27:28 2013 +0300
@@ -0,0 +1,98 @@ 
+/* For more details please check the README file from the root directory.*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "client.h"
+#include "utils.h"
+
+#define BUFF_SIZE 4096
+
+/**
+ * \brief The export-import command example.
+ *
+ * An export-import process that is not buffering the entire path in to memory
+ * \param ehandle The handle connection, from where I am exporting
+ * \param ihandle The handle connection, where I am importing.
+ * \retval exitcode
+ * */
+int hg_export_import_by_hand(hg_handle *ehandle, hg_handle *ihandle)
+{
+       char *export_comm[] = {"export", "-r", "0", NULL};
+       char *import_comm[] = {"import", "-", NULL};
+       char ebuff[BUFF_SIZE], ibuff[BUFF_SIZE];
+       int eexitcode, iexitcode;
+
+       hg_rawcommand(ehandle, export_comm);
+       hg_rawcommand(ihandle, import_comm);
+
+       hg_header *ehead, *ihead;
+       while (ehead = hg_read_header(ehandle), ehead->channel != r) {
+               if (ehead->channel == o) {
+                       if (hg_rawread(ehandle, ebuff, BUFF_SIZE) > 0) {
+                               ihead = hg_read_header(ihandle);
+                               while (ihead->channel == o ||
+                                                       ihead->channel == e) {
+                                       if (hg_rawread(ihandle, ibuff,
+                                                       BUFF_SIZE) > 0) {
+                                               printf("%s\n", ibuff);
+                                       }
+                                       ihead = hg_read_header(ihandle);
+                               }
+                               if (ihead->channel == L) {
+                                       hg_rawwrite(ihandle, ebuff,
+                                                               strlen(ebuff));
+                               }
+                       }
+               } else if (ehead->channel == e) {
+                       if (hg_rawread(ehandle, ebuff, BUFF_SIZE) > 0) {
+                               printf("err = %s", ebuff);
+                       }
+               }
+       }
+
+       ihead = hg_read_header(ihandle);
+       hg_rawwrite(ihandle, ebuff, 0);
+
+       while (ihead = hg_read_header(ihandle), ihead->channel != r) {
+               if (ihead->channel == o || ihead->channel == e) {
+                       if (hg_rawread(ihandle, ibuff, BUFF_SIZE) > 0) {
+                               printf("%s", ibuff);
+                       }
+               }
+       }
+
+       eexitcode = hg_exitcode(ehandle);
+       iexitcode = hg_exitcode(ihandle);
+       printf("exitcode for export process is %d \n", eexitcode);
+       printf("exitcode for import process is %d \n", iexitcode);
+
+       return eexitcode + iexitcode;
+}
+
+/**
+ * \brief The main function
+ * */
+int main(int argc, char **argv)
+{
+       hg_handle *ehandle, *ihandle;
+       int exitcode;
+
+       if (argc != 3) {
+               printf("Usage: %s export_repo_path import_repo_path\n",
+                                                               argv[0]);
+               return 1;
+       }
+
+       ehandle = hg_open(argv[1], NULL);
+       ihandle = hg_open(argv[2], NULL);
+
+       exitcode = hg_export_import_by_hand(ehandle, ihandle);
+       hg_close(&ehandle);
+       hg_close(&ihandle);
+
+       return exitcode;
+}