#pragma section-numbers 2 = GSoC Student Guidance and Project Ideas for 2016 = /!\ Please see also our [[SummerOfCode/2016]] page, which contains additional information for GSoC for this year. <> == About Mercurial == * '''What is Mercurial?''' Mercurial is a free, distributed source control management tool. It efficiently handles projects of any size and offers an easy and intuitive interface. * '''Why is it interesting?''' Besides the extremely good reasons just above, Mercurial is also interesting for many other reasons, including: a great extension system, excellent backwards compatibility, excellent documentation, ... Specifically for students, it's interesting because it offers a range of topics to work on from low-level speed optimizations all the way up to a web interface. * '''Who uses it?''' Mercurial is used by individuals, organizations and companies all over the world. The same goes for contributors: in the open source community, a well-known organization using Mercurial is the Mozilla project, but companies like Facebook, Google and many others also contribute to Mercurial. * '''What language is it written in?''' Mercurial is mostly written in Python. We rewrite some parts that are very performance-sensitive in C. == Contacting the Mercurial developers == The following channels are used by default for communication. Please use them to introduce yourself! * IRC: many developers chat and discuss planned changes to Mercurial here. Keep in mind that most developers are in US timezones, so it might take quite a bit of time (hours) to get a response outside of those timezones! * The developer [[MailingLists#The_Mercurial-Devel_list|mailing list]]: this list is mostly used to submit patches and discuss them. == Getting started/Candidate checklist == All candidates should do the following ''before'' completing their application: 1. Check the [[SummerOfCode/Ideas2016]] page 1. [[https://www.mercurial-scm.org/wiki/SummerOfCode/Ideas2016?action=subscribe|Subscribe to this page]] to get email when it changes 1. Introduce yourself on [[IRC]] 1. Introduce yourself on the [[MailingLists#The_Mercurial-Devel_list|mailing list]] 1. Read the ContributingChanges pages. 1. Look at the [[https://bz.mercurial-scm.org/buglist.cgi?quicksearch=keyword:easy|easy bugs list]] and contribute a patch. Feel free to ask questions on IRC or the mailing list while getting started! 1. Follow the steps to apply: check the [[https://wiki.python.org/moin/SummerOfCode/2016#How_do_I_Apply.3F|application checklis]] and [[https://summerofcode.withgoogle.com/student-signup/|submit your application]]. 1. Add yourself to the [[SummerOfCode/Candidates2016]] list, so we can have an early view of how many candidates there are. == Things we look for in a candidate == * Demonstrates understanding of our tools, procedures, and source code by successfully submitting patches (see last step above) * Participates in the community, especially via IRC * Makes a commitment to work on GSoC full-time * Gives an indication that she or he enjoys working with Mercurial enough to become a long-term contributor, after GSoC is over. == GSoC ideas == Here are some ideas of possible 2016 summer project ideas for Mercurial. Your own ideas are welcome. You may decide to work on these ideas or use them as a starting point for your own. === Example Project === * '''Project description''': This is an example project. Please add a clear description with some details about the idea. * '''Skills''': Specific programming languages, domain-specific knowledge... For example: Python, network programming * '''Difficulty level''': Easy/Intermediate/Difficult * '''Related reading/Links''': Useful links to wiki pages, specific relevant mailing list discussions or patches, ... * '''Further details''': Additional detail about the idea * '''Point of Contact''': Who wrote this proposal and could answer question about it. * '''Potential mentors''': mentors likely to be involved with this project === Moving toward Python3 === ==== Project description ==== Mercurial currently only supports Python 2. We'd like to improve Python3 support, but that will require a lot of work. A large amount of the work is relatively simple. Some of the first tasks needed will be: * Fixing the warnings in the Python3 compatibility test ([[https://www.mercurial-scm.org/repo/hg/file/default/tests/test-check-py3-compat.t|test-check-py3-compat.t]]). * Fix imports to use absolute_import across the code base. [[https://www.mercurial-scm.org/repo/hg/rev/68b9abf1cb82|Some]] [[https://www.mercurial-scm.org/repo/hg/rev/798535853345|examples]] [[https://www.mercurial-scm.org/repo/hg/rev/b1adf32b0605|of]] [[https://www.mercurial-scm.org/repo/hg/rev/a16489f9132d|this]] [[https://www.mercurial-scm.org/repo/hg/rev/e6d3dad71e44|work]] [[https://www.mercurial-scm.org/repo/hg/rev/071af8d385a9|are]] [[https://www.mercurial-scm.org/repo/hg/rev/ce3ae9ccd800|available]]. * Some of our modules don't yet parse in Python3. This needs to be fixed as well. * We currently use '''2to3''' to compile to Python3 bytecode. Rather than using this, we should unify our codebase to work in Python2 and Python3. * Some Python modules have different names or different properties in Python3. A compatibility layer (or conditional imports) will be necessary to handle these changes. Further (also more difficult) tasks are listed on the [[Python3]] page, but the above will most likely take up quite a bit of time already. ==== Project properties ==== * '''Skills''': Python * '''Difficulty level''': Easy * '''Related reading/Links''': [[Python3]] * '''Further details''': See [[Python3]]. There's also quite a bit of explanation to be found [[https://docs.python.org/3/howto/pyporting.html|online]]. * '''Point of Contact''': Gregory Szorc (indygreg on IRC), Augie Fackler (durin42 on IRC) * '''Potential mentors''': Sean Farley, Martin von Zweigbergk, Martijn Pieters === Improve commit graph in hgweb === ==== Project description ==== Current graph rendering code in hgweb is pretty clunky and not very extensible or efficient. We could update it to use hgweb's own JSON API, to be faster and smarter, to show more things and to look nicer. You can see an example of the current hgweb interface at the [[https://www.mercurial-scm.org/repo/hg/graph|Mercurial's main repo]]. This task can vary a lot depending on your own preferences, as you can do quite a few different subtasks. * Think up a good (extensible, self-descriptive) format for graph data to put into JSON and implement it server-side * Update client-side code to use JSON for initial rendering and rendering on scroll-down ("infinite scroll") * Make client-side code to render graph in chunks (will help with performance after a number of infinite-scrolls and will solve issue4020) * Maybe use SVG instead of * Add (non-public) phases to commits in graph (next to branches, tags and bookmarks) * Display special (e.g. branch-closing) commits in a different way * Display special edges, such as source-destination of a graft * Add an ability to see obsoleted changesets (including obsolescence edge) * Show faded-out edge(s) from the nodes on the top of the screen if they have children (e.g. when tip is not the topmost graph node), this is already done for nodes with parents at the screen bottom More ideas and visual decisions could be borrowed from TortoiseHg, Bitbucket and Kiln. ==== Project properties ==== * '''Skills''': Python (server-side), JavaScript (client-side) * '''Difficulty level''': Intermediate (but can become more difficult if you can take up some of the more complicated subtasks) * '''Related reading/Links''': https://bz.mercurial-scm.org/show_bug.cgi?id=4020 https://bz.mercurial-scm.org/show_bug.cgi?id=2570 (not limited to these) * '''Point of Contact''': AntonShestakov (av6 on IRC) * '''Potential mentors''': Martin von Zweigbergk, Martijn Pieters, Sean Farley === Implement templating for more commands === ==== Project description ==== The ''hg log'' subcommand has a flexible [[Topic:templates|templating language]]. Its flexibility allows creating custom commands or providing guaranteed output for tools. One example is using ''hg log --template "{node}\n"'' to see the full SHA-1 hash of a changeset. [[http://jordi.inversethought.com/blog/customising-mercurial-like-a-pro/|Another example]] is using templates (in combination with other features like revsets) to create useful and completely customized output for all changesets currently being added by a developer/user. Currently, the ''--template'' parameter is fully supported only by the Cmd:log command, but many others could benefit from using the template language as well. This could be very varied, for example adding full template support to Cmd:summary or Cmd:identify. Commands like Cmd:bookmarks and Cmd:blame already have an experimental ''--template'' argument and can use the template language, but they have a very limited set of template keywords. This proposal consists of two major parts: * First, a research/design part, where it's necessary to check which commands should receive templating support and if there are specific new template options that are needed for specific commands. Additionally, it would be useful to see which commands need template support first. As part of your student proposal, you could already do this analysis for one specific command (or possibly a few). * Secondly, an implementation part, where template support should be added (and documented) to those commands that need it most urgently. ==== Project properties ==== * '''Skills''': Python * '''Difficulty level''': Difficult * '''Related reading/Links''': [[GenericTemplatingPlan]] * '''Point of Contact''': RyanMcElroy * '''Potential mentors''': Martijn Pieters, Sean Farley, Martin von Zweigbergk === Allow largefiles to be at a different location === ==== Project description ==== Mercurial has a feature called largefiles, which allows storing large files outside of the normal history (more details, see [[LargefilesExtension]]). Currently, largefiles must be stored in the same location as the main hosting server. The goal of this project would be to: 1. allow the user to change the location (to say, a central file server for a team) 2. allow the server to send a url (with an authentication token) to the client that would tell the client where to push the largefile. A number of possibilities is available for this. For example, it would be possible to add a new server 'capability', so clients know this server supports a new location for storing largefiles. Alternatively (and preferred so far in developer discussions), a concept called [[PushkeyConcept]] could be used. This concept allows Mercurial to send additional key-value pairs with extra information (in this case using a 'largefiles' identifier. This project will also involve quite a bit of discussion regarding the design with the Mercurial developers. ==== Project properties ==== * '''Skills''': Python * '''Difficulty level''': Difficult * '''Related reading/Links''': Some discussion already happened [[https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-February/079273.html|on the mailing list]]. * '''Further details''': [[LargefilesExtension]] * '''Point of Contact''': Sean Farley * '''Potential mentors''': Sean Farley, Martijn Pieters, Martin von Zweigbergk == Other ideas? == Come talk to us on [[IRC]]. ---- CategoryGsoc