The Overview
I use vim every day. In the course of my use, I ran across neovim, a folk of vim with aim to introduce new features, such as asynchronous disk operation. I wanted to submit my first patch in hacktoberfest to this project.
What is neovim
This is a folk of vim. It has multiple aims, such as decreasing bloat, implement asynchronous disk operation, and to be a drop-in replacement of vim. It also aims to adopt different development culture than that of vim where the course of development is more open to the community. While all of them are interesting goals catering to specific needs, I am most interested in the asynchronous disk operation using libuv.
What is libuv
libuv is a set of libraries designed to perform asynchronous disk operations. It is widely used in projects such as node.js, and of course, neovim.
What is the issue
libuv has introduced uv_fs_copyfile() method. I intend on implementing this function in neovim. So far, I found two locations where neovim copies a file over, and they have to do with buffer. As far as I can tell, there is no dedicated function for copying of file; the logic is embedded right into a huge function called file_mess() and uses buffer write function to do the writing.
Contributing to neovim
Every project has their own way, or an agreement, as to how community would work together to contribute code. Neovim has decided to take an approach that maximizes github features to communicate what is going on in different parts of the code.
Method and culture
When working on a particular issue, first, the coder must create a pull request regarding the issue as soon as possible with [WIP] tag. This serves to let others know that someone is working on the issue. As the development is ready to be presented, the tag is changed to [RFC], meaning requesting review. Once it has reached maturity with sufficient reviews, the tag turns into [RDY], ready and waiting to be merged.
I have made my [WIP] pull request on implementing uv_fs_copyfile().
Difficulties
As I am looking at the C code, a procedural language, currently, I am daunted by the sheer size of some of the function, and how different functions are interacting with each other. This is surprisingly different from my experience with C++, or Object Oriented Programming in general; I am used to seeing objects interacting with each other using member functions that does one thing really well. Currently, I am looking at file_mess() function call that is spanning several hundreds of lines doing just about everything. I am trying to understand how I should approach the situation: should I make my own small function and then call it in the file_mess(), or should I follow the way it is written and try to code right into the logic? Perhaps I am missing the point and there is already a function for copyfile? I only see buffer write function, which seem more a general purpose write function, being used in the code, though. I am unwilling to alter a general purpose function for the specific purpose of copying the file, either. Well, I am going to look a bit further into it before making a decision as to how I will approach it.
Comments
Post a Comment