AdGuardHome/HACKING.md
Eugene Burkov 8a9c6e8a02 Pull request: cover with tests
Merge in DNS/adguard-home from 2271-cover-with-tests to master

Updates #2271.

Squashed commit of the following:

commit db6440efe05171bc15367a2996521848ca348053
Merge: db7fa726b bf4c256c7
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Mon Nov 16 19:23:09 2020 +0300

    Merge branch 'master' into 2271-cover-with-tests

commit db7fa726bb91b08ec7aaa6c0c818c88b5feb87cd
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Mon Nov 16 18:26:51 2020 +0300

    all: clean dependencies sum

commit b8dc6078c4bcc0de1b7e9073832de122f6fe38a4
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Mon Nov 16 16:46:00 2020 +0300

    testutil: improve code quality

commit 001b7194682b1f00aa54dc5a28236faed5a5b02d
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Mon Nov 16 16:29:49 2020 +0300

    testutil: enhance functionality

commit f6ccd91a4df6c56778eab8ae50e88e3818b20dd3
Merge: 43fa2eefb 6358240e9
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Mon Nov 16 15:57:37 2020 +0300

    Merge branch 'master' into 2271-cover-with-tests

commit 43fa2eefbc10ef361603cacc1ca12092b12a057a
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Mon Nov 16 14:55:15 2020 +0300

    querylog: replace fake log with real in tests

commit b95bee7565a14a02c80c78131b3ced224663dd8a
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Mon Nov 16 12:38:59 2020 +0300

    dnsfilter: replace thoughtless declaration with idiomatic one

commit a210b1586092e7ae91a9e67c972fa2d2f6baded6
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Fri Nov 13 19:00:25 2020 +0300

    all: refresh golibs dependencies

commit 4ff97bd1ade6c80e274ff5716e44df4eba55bdd9
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Fri Nov 13 18:38:47 2020 +0300

    all: remove std log

commit 542dbda10fefce9f46d15489712b163d919b1291
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Fri Nov 13 13:46:39 2020 +0300

    querylog: improve test logic and readability

commit 796d402385925e8e62a1b4c7bf56e4ceec22418c
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Thu Nov 12 19:06:42 2020 +0300

    all: improve code quality

commit e81894c11ef15b0453e8e5297f1349936a32f9dd
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Thu Nov 12 18:32:30 2020 +0300

    all: cover with tests

commit 252d81fc8a50a91b02cf0f6f35cc22178a2a4d90
Author: Eugene Burkov <e.burkov@adguard.com>
Date:   Thu Nov 12 17:32:01 2020 +0300

    all: cover with tests
2020-11-16 19:45:31 +03:00

4.0 KiB

AdGuardHome Developer Guidelines

As of 2020-11-12, this document is still a work-in-progress. Some of the rules aren't enforced, and others might change. Still, this is a good place to find out about how we want our code to look like.

Git

  • Follow the commit message header format:

    pkg: fix the network error logging issue
    

    Where pkg is the package where most changes took place. If there are several such packages, just write all.

  • Keep your commit messages to be no wider than eighty (80) columns.

  • Only use lowercase letters in your commit message headers.

Go

  • https://github.com/golang/go/wiki/CodeReviewComments.

  • https://github.com/golang/go/wiki/TestComments.

  • https://go-proverbs.github.io/

  • Avoid init and use explicit initialization functions instead.

  • Avoid new, especially with structs.

  • Document everything, including unexported top-level identifiers, to build a habit of writing documentation.

  • Don't put variable names into any kind of quotes.

  • Don't use naked returns.

  • Don't use underscores in file and package names, unless they're build tags or for tests. This is to prevent accidental build errors with weird tags.

  • Don't write code with more than four (4) levels of indentation. Just like Linus said, plus an additional level for an occasional error check or struct initialization.

  • Eschew external dependencies, including transitive, unless absolutely necessary.

  • No goto.

  • No shadowing, since it can often lead to subtle bugs, especially with errors.

  • Prefer constants to variables where possible. Reduce global variables. Use constant errors instead of errors.New.

  • Put comments above the documented entity, not to the side, to improve readability.

  • Use gofumpt --extra -s.

    TODO(a.garipov): Add to the linters.

  • Use linters.

  • Use named returns to improve readability of function signatures.

  • When a method implements an interface, start the doc comment with the standard template:

    // Foo implements the Fooer interface for *foo.
    func (f *foo) Foo() {
        // …
    }
    
  • Write logs and error messages in lowercase only to make it easier to grep logs and error messages without using the -i flag.

  • Write slices of struct like this:

    ts := []T{{
            Field: Value0,
            // …
    }, {
            Field: Value1,
            // …
    }, {
            Field: Value2,
            // …
    }}
    

Text, Including Comments

  • Text should wrap at eighty (80) columns to be more readable, to use a common standard, and to allow editing or diffing side-by-side without wrapping.

    The only exception are long hyperlinks.

  • Use U.S. English, as it is the most widely used variety of English in the code right now as well as generally.

  • Use double spacing between sentences to make sentence borders more clear.

  • Use the serial comma (a.k.a. Oxford comma) to improve comprehension, decrease ambiguity, and use a common standard.

  • Write todos like this:

    // TODO(usr1): Fix the frobulation issue.
    

    Or, if several people need to look at the code:

    // TODO(usr1, usr2): Fix the frobulation issue.
    

Markdown

  • TODO(a.garipov): Define our Markdown conventions.

YAML

  • TODO(a.garipov): Find a YAML formatter or write our own.

  • All strings, including keys, must be quoted. Reason: the NO-rway Law.

  • Indent with two (2) spaces.

  • No extra indentation in multiline arrays:

    'values':
    - 'value-1'
    - 'value-2'
    - 'value-3'
    
  • Prefer single quotes for string to prevent accidental escaping, unless escaping is required.