Differences between revisions 2 and 4 (spanning 2 versions)
Revision 2 as of 2013-06-21 23:00:45
Size: 3293
Editor: 5-12-23-230
Comment:
Revision 4 as of 2013-06-22 01:24:19
Size: 3297
Editor: adsl-ull-210-241
Comment: added some cute monospaced fonts
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
=C-Hglib= = C-Hglib =
Line 54: Line 54:

{{{
Line 55: Line 57:
Line 57: Line 58:

│ ├── main.c

│ ├── Makefile.am

│ ├── utils.c

│ └── utils.h
   ├── main.c
   ├── Makefile.am
   ├── utils.c
   └── utils.h
Line 67: Line 63:
Line 69: Line 64:

── tests
── tests
Line 73: Line 66:
}}}

C-Hglib

A C library for interfacing with Mercurial's CommandServer.

1. Getting the source

You can clone the packeage from its primary repository c-hglib.

2. First plan

Some steps that I want to do first:

  • create an open mechanism between Client (C library) and Server ( Mercurial Command Server)
  • close the connection
  • readchannel function that will get the channel and the length of message.
  • create the _hello function, that will receive the first message, after the connection.
  • cmdbuilder, will compute the command that will be sent to CommandServer.

  • runcommand, will send the build command to the server and will return the compute message.
  • mercurial commands.

How to make it happen:

  • Create an open mechanism between Client (C library) and Server ( Mercurial Command Server)
    • First I will try to compute a command that will be execute in the child process.
    • It will be of the form “HGPATH serve --cmdserver pipe --config ui.interactive=True” + “-R path ”
    • I will create two pipes for the bidirectional connection. Then I will fork a new process, where I’ll execute the command that will open the Command Server. In the child process I will redirect the input, the output and the error in to the pipes (for the communication Client-Server). In my case the child process will open the Command Server and the parent process will be the client.
    • The communication will be through the pipes descriptors.
    • The open function will return a Client structure that will contain the pipes descriptors and other useful information.
  • Close the connection
    • Will kill the command server and will close the pipe descriptors for a specific Client.
  • readchannel function that will get the channel and the length of message.
    • Will read a char (the channel) and a uint (the length). There are chances for a problem to occur over here with the unsigned integer (the Command Server will send to me an integer in big endian form).
    • Most probably I will have to create a conversion mechanism.
  • create the _hello function that will receive the first message, after the connection.
    • This function will read the channel and the default data. Then I will check the correctness of data.
  • cmdbuilder, will compute the command that will be sent to CommandServer.

    • This function will return a list with a compute command that will be send to CommandServer. This function will be called by all mercurial commands.

  • runcommand, will send the build command to the server and will return the compute message.
    • From this function I will sent through pipes the commands and I will receive the specific answers. This will be the function that will make the communication.

3. My starts points will be

4. Directory tree

.
├── hglib
│   ├── main.c
│   ├── Makefile.am
│   ├── utils.c
│   └── utils.h
├── Makefile.am
├── README.md
├── tests
└── Makefile.am

C-Hglib (last edited 2014-11-11 22:05:57 by rcl)