Size: 2431
Comment: recat and style fixes
|
← Revision 45 as of 2022-02-21 17:44:01 ⇥
Size: 4725
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
## page was renamed from Basic Coding Style | ## page was renamed from BasicCodingStyle #pragma section-numbers 2 <<Include(A:dev)>> |
Line 3: | Line 5: |
== Basic do's and don'ts == | = Coding Style = |
Line 5: | Line 7: |
Don't: | How to make your code pretty the Mercurial way. |
Line 7: | Line 9: |
* don't use tabs * don't use lines longer than 80 characters * don't leave trailing whitespace * don't name functions or classes with Uppercase, !CamelCase or lots_of_under_bars * don't make helper functions prefixed with do_ * don't use underscores in identifiers in new code * in general, don't make [[mpm]] use his shift key any more than he has to * don't use default arguments without a good reason * don't use a class unless it makes your code smaller and easier to read * don't use Unicode strings unless you ''really'' grok Mercurial's charset philosophy * don't put OS-specific hacks outside of util.py and friends * don't use Python features from 2.5 or later (so no conditional expressions, unified try/except/finally) |
<<TableOfContents>> |
Line 20: | Line 11: |
Do: | == Introduction == |
Line 22: | Line 13: |
* use single quotes rather than double quotes * use a single underscore prefix for private methods and functions * use a single underscore prefix for a helper function * add a linebreak after a colon * add docstrings * use _() to mark things for i18n * add testcases to the test suite * run the test suite |
This page is intended to save new developers a few round-trips when [[ContributingChanges|contributing changes]]. It doesn't cover everything, but it does cover some of the most common mistakes people make. |
Line 31: | Line 15: |
-- [[mpm]] | == Some code doesn't agree with the coding style! == |
Line 33: | Line 17: |
== Rules for tabs and spaces in C == | Yes, because some code predates the coding style and has not yet been rewritten to conform. Please follow the coding style for all new code. |
Line 35: | Line 19: |
See http://selenic.com/pipermail/mercurial-devel/2009-August/015110.html | == Naming conventions == |
Line 37: | Line 21: |
== contrib/check-code.py == The source includes a helper script, contrib/check-code.py, to check code for 'style errors'. == Variable conventions == |
The new (since the end of 2019) naming conventions mostly follow PEP8 for new code. For private methods and helper functions, the convention is to use a single leading underbar. Use a trailing underbar to avoid shadowing built-ins and imported modules. |
Line 45: | Line 25: |
|| '''name''' || '''description''' || || fctx || a context.filectx instance || || fn, fname || filename || || fp || a python file(like) object || |
|| '''name''' || '''description''' || || p1, p2 || first and second parents || || ctx || a context.changectx instance (or derivative) || || fctx || a context.filectx instance || || fn, fname || filename || || fp || a python file(like) object || || repo || a localrepo or review object || || unfi || an unfiltered local repo instance || == Whitespace and syntax == We use [[https://black.readthedocs.io/en/stable/|black]] for most style formatting. Use it! An [[https://www.mercurial-scm.org/repo/hg/file/tip/contrib/examples/fix.hgrc|example configuration]] for the [[https://www.mercurial-scm.org/repo/hg/help/fix|fix extension]] which automates cleaning up style issues after commit. == Language features and compatibility == * Mercurial is designed for SupportedPythonVersions and onward so don't use new features: * Don't add default arguments to new functions unless you're going to use them == Classes == * Think twice about using classes, functions are almost always smaller and simpler * Private methods and variables should be indicated with a leading underscore * Destructors in Python are not reliable and should be avoided == Unicode and character encoding == Character encoding is a complex topic (see [[EncodingStrategy|Encoding Strategy]] for an overview) but Mercurial generally follows these rules: * Almost all string data is manipulated either as plain byte strings in the local encoding or in no encoding * Mercurial-specific metadata like usernames is converted to UTF-8 byte strings in a restricted number of places using fromlocal/tolocal * Unicode objects are '''avoided wherever possible''' and no core APIs are designed to handle them |
Line 51: | Line 59: |
* use _() to mark things for i18n |
|
Line 74: | Line 84: |
== User options == * Options are named `foo-bar` not `foobar` or `foo_bar`, also see [[UIGuideline|UI Guideline]] for more information. == Miscellaneous == * Don't put OS-specific hacks outside of util.py and friends * add docstrings * follow the [[HelpStyleGuide||style guide]] when adding help texts == Automated checking == A lot of the rules in this document and a bunch of others can be automatically checked with our '`check-code`' script: {{{ $ python contrib/check-code.py --blame `hg manifest` mercurial/i18n.py:42 (working directory): > u = u'\n\n'.join([p and t.ugettext(unicode(p, 'ascii')) or '' for p in paragraphs]) line too long }}} We recommend you '''run this script before every submission'''. In addition to catching style and portability issues in Python code, it will also inspect our C code and test suite. == See also == * [[ContributingChanges|Contributing changes]] - how to send us your changes * [[HelpStyleGuide|Help style guide]] - pointers on writing online help text * [[WritingTests|Writing tests]] - how to extend the test suite |
Note:
This page is primarily intended for developers of Mercurial.
Coding Style
How to make your code pretty the Mercurial way.
Contents
1. Introduction
This page is intended to save new developers a few round-trips when contributing changes. It doesn't cover everything, but it does cover some of the most common mistakes people make.
2. Some code doesn't agree with the coding style!
Yes, because some code predates the coding style and has not yet been rewritten to conform. Please follow the coding style for all new code.
3. Naming conventions
The new (since the end of 2019) naming conventions mostly follow PEP8 for new code. For private methods and helper functions, the convention is to use a single leading underbar. Use a trailing underbar to avoid shadowing built-ins and imported modules.
Throughout the code, the following variables usually refer to the same thing:
name |
description |
p1, p2 |
first and second parents |
ctx |
a context.changectx instance (or derivative) |
fctx |
a context.filectx instance |
fn, fname |
filename |
fp |
a python file(like) object |
repo |
a localrepo or review object |
unfi |
an unfiltered local repo instance |
4. Whitespace and syntax
We use black for most style formatting. Use it! An example configuration for the fix extension which automates cleaning up style issues after commit.
5. Language features and compatibility
Mercurial is designed for SupportedPythonVersions and onward so don't use new features:
- Don't add default arguments to new functions unless you're going to use them
6. Classes
- Think twice about using classes, functions are almost always smaller and simpler
- Private methods and variables should be indicated with a leading underscore
- Destructors in Python are not reliable and should be avoided
7. Unicode and character encoding
Character encoding is a complex topic (see Encoding Strategy for an overview) but Mercurial generally follows these rules:
- Almost all string data is manipulated either as plain byte strings in the local encoding or in no encoding
- Mercurial-specific metadata like usernames is converted to UTF-8 byte strings in a restricted number of places using fromlocal/tolocal
Unicode objects are avoided wherever possible and no core APIs are designed to handle them
8. Status and error messages
- use _() to mark things for i18n
Short messages should look like this:
adding foo.txt
Note the following:
it starts with a lower-case word.
it has no trailing full-stop (.).
Some existing strings don't follow this style and are kept like that for backwards compatibility reasons. But please write all new strings in this style.
The above message should look like this in your code:
ui.status(_('adding %s\n') % filename)
Please note:
The _ function is used to mark the string as translatable. Import it from the i18n module.
The string interpolation is done after the call to the _ function.
9. User options
Options are named foo-bar not foobar or foo_bar, also see UI Guideline for more information.
10. Miscellaneous
- Don't put OS-specific hacks outside of util.py and friends
- add docstrings
follow the HelpStyleGuide when adding help texts
11. Automated checking
A lot of the rules in this document and a bunch of others can be automatically checked with our 'check-code' script:
$ python contrib/check-code.py --blame `hg manifest` mercurial/i18n.py:42 (working directory): > u = u'\n\n'.join([p and t.ugettext(unicode(p, 'ascii')) or '' for p in paragraphs]) line too long
We recommend you run this script before every submission. In addition to catching style and portability issues in Python code, it will also inspect our C code and test suite.
12. See also
Contributing changes - how to send us your changes
Help style guide - pointers on writing online help text
Writing tests - how to extend the test suite