{"payload":{"allShortcutsEnabled":false,"fileTree":{"notes":{"items":[{"name":"logo","path":"notes/logo","contentType":"directory"},{"name":"HACKING.md","path":"notes/HACKING.md","contentType":"file"},{"name":"RELEASE-HOWTO.md","path":"notes/RELEASE-HOWTO.md","contentType":"file"},{"name":"SECURITY.md","path":"notes/SECURITY.md","contentType":"file"},{"name":"TODO","path":"notes/TODO","contentType":"file"},{"name":"authz-dev-TODO","path":"notes/authz-dev-TODO","contentType":"file"},{"name":"root-heirarchy.txt","path":"notes/root-heirarchy.txt","contentType":"file"},{"name":"vclib-enhancements.txt","path":"notes/vclib-enhancements.txt","contentType":"file"}],"totalCount":8},"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"bin","path":"bin","contentType":"directory"},{"name":"conf","path":"conf","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"lib","path":"lib","contentType":"directory"},{"name":"misc","path":"misc","contentType":"directory"},{"name":"notes","path":"notes","contentType":"directory"},{"name":"templates","path":"templates","contentType":"directory"},{"name":"tools","path":"tools","contentType":"directory"},{"name":".flake8","path":".flake8","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"CHANGES","path":"CHANGES","contentType":"file"},{"name":"COMMITTERS","path":"COMMITTERS","contentType":"file"},{"name":"INSTALL","path":"INSTALL","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README","path":"README","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"viewvc-install","path":"viewvc-install","contentType":"file"}],"totalCount":18}},"fileTreeProcessingTime":5.245406999999999,"foldersToFetch":[],"repo":{"id":67821474,"defaultBranch":"master","name":"viewvc","ownerLogin":"viewvc","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2016-09-09T18:09:08.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/22104674?v=4","public":true,"private":false,"isOrgOwned":true},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1707340669.0","canEdit":false,"refType":"branch","currentOid":"de8042e8533410bca219f61782dc433185dfff2a"},"path":"notes/HACKING.md","currentUser":null,"blob":{"rawLines":null,"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/viewvc/viewvc/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"HACKING.md","displayUrl":"https://github.com/viewvc/viewvc/blob/master/notes/HACKING.md?raw=true","headerInfo":{"blobSize":"3.46 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"8187e83","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fviewvc%2Fviewvc%2Fblob%2Fmaster%2Fnotes%2FHACKING.md","isCSV":false,"isRichtext":true,"toc":[{"level":1,"text":"Testing and Reporting","anchor":"testing-and-reporting","htmlText":"Testing and Reporting"},{"level":1,"text":"Coding Style","anchor":"coding-style","htmlText":"Coding Style"},{"level":1,"text":"Security","anchor":"security","htmlText":"Security"},{"level":1,"text":"Adding Features","anchor":"adding-features","htmlText":"Adding Features"},{"level":1,"text":"Hacking on Templates","anchor":"hacking-on-templates","htmlText":"Hacking on Templates"}],"lineInfo":{"truncatedLoc":"83","truncatedSloc":"63"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/viewvc/viewvc/blob/master/notes/HACKING.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/viewvc/viewvc/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/viewvc/viewvc/raw/master/notes/HACKING.md","renderImageOrRaw":false,"richText":"

Testing and Reporting

\n

Testing usability and the installation process on different platforms\nis also a valuable contribution. Please report your results back to\nus developers. Bandwidth is getting cheaper daily, so don't be afraid\n-- in fact, feel encouraged -- to dump as much detail about the\nproblems you are seeing as possible into your bug reports. Here are\nsome things you definitely should try to include:

\n\n

Coding Style

\n

Unlike its predecessor, CvsWeb, ViewVC is written in Python, so it\ndoesn't suffer from the \"unmaintainable code effect\" that hits most\nPerl projects sooner or later:

\n
\"[Perl] combines all the worst aspects of C and Lisp: a\nbillion different sublanguages in one monolithic executable.  It\ncombines the power of C with the readability of\nPostScript.\"  -- Jamie Zawinski\n
\n

Of course, a symphony of insanity can be composed in any language, so\nwe do try to stick to some basic guiding principles. Maintain\nwhatever style is present in the code being modified. New code can\nuse anything sane (which generally\nmeans PEP 8).\nOur only real peeve is if someone writes a function call as:\nsome_func (args) -- that space between the function name and opening\nparenthesis is Huge Badness.

\n

Otherwise... shrug.

\n

Security

\n

Since ViewVC is used on the Internet, security is a major concern. If\nyou need to pass data from the request into an external program,\nplease don't use os.system() or os.popen(). Please use the module\nlib/popen.py that is included in the ViewVC distribution instead.

\n

You might also wish to consult the list of previously reported\nsecurity vulnerabilities to get an idea\nof what kinds of bugs ViewVC has historically had in this area. That\nknowledge could just help you to avoid introducing similar problems\ninto future releases.

\n

Adding Features

\n

If you need a new configuration option think carefully, into which\nsection it belongs. Try to keep the content of cgi/viewvc.conf.dist\nfile and the library module lib/config.py in sync.

\n

Because ViewVC is a Web-based application, people will have ViewVC\nURLs hyperlinked from other sites, embedded in emails, bookmarked in\ntheir browsers, etc. It is very important to ensure that those URLs\ncontinue to retrieve the information they were intended to retrieve\neven if ViewVC is upgraded on the hosting server. In other words, as\nnew features require modifications to the ViewVC URL\nschema, make sure those modifications\npreserve the existing functionality of all ViewVC URLs.

\n

If a new file or module is added, a new line in the installer program\nviewvc-install is required.

\n

Hacking on Templates

\n

The library module ezt.py contains a module docstring which\ndescribes the directives used in the HTML templates used by ViewVC.\nThe templates themselves can be found in the templates subdirectory.\nWe're currently developing a how-to guide for ViewVC template\ncustomization.

\n
","renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Testing and Reporting","kind":"section_1","ident_start":2,"ident_end":23,"extent_start":0,"extent_end":917,"fully_qualified_name":"Testing and Reporting","ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":23}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":23,"utf16_col":0}}},{"name":"Coding Style","kind":"section_1","ident_start":919,"ident_end":931,"extent_start":917,"extent_end":1797,"fully_qualified_name":"Coding Style","ident_utf16":{"start":{"line_number":23,"utf16_col":2},"end":{"line_number":23,"utf16_col":14}},"extent_utf16":{"start":{"line_number":23,"utf16_col":0},"end":{"line_number":45,"utf16_col":0}}},{"name":"Security","kind":"section_1","ident_start":1799,"ident_end":1807,"extent_start":1797,"extent_end":2366,"fully_qualified_name":"Security","ident_utf16":{"start":{"line_number":45,"utf16_col":2},"end":{"line_number":45,"utf16_col":10}},"extent_utf16":{"start":{"line_number":45,"utf16_col":0},"end":{"line_number":58,"utf16_col":0}}},{"name":"Adding Features","kind":"section_1","ident_start":2368,"ident_end":2383,"extent_start":2366,"extent_end":3198,"fully_qualified_name":"Adding Features","ident_utf16":{"start":{"line_number":58,"utf16_col":2},"end":{"line_number":58,"utf16_col":17}},"extent_utf16":{"start":{"line_number":58,"utf16_col":0},"end":{"line_number":76,"utf16_col":0}}},{"name":"Hacking on Templates","kind":"section_1","ident_start":3200,"ident_end":3220,"extent_start":3198,"extent_end":3540,"fully_qualified_name":"Hacking on Templates","ident_utf16":{"start":{"line_number":76,"utf16_col":2},"end":{"line_number":76,"utf16_col":22}},"extent_utf16":{"start":{"line_number":76,"utf16_col":0},"end":{"line_number":83,"utf16_col":0}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/viewvc/viewvc/branches":{"post":"YCoxFXRNCBobjtw-8zvpxIlabitwkIs2M4APsgOc9YHv-ri47m8KJMASkjZEFL13-dPpoDjwzPN6C50t8cG-1A"},"/repos/preferences":{"post":"fahMcDHuoyM6Vao9p99JfsgwOtaYkraiVag--MYwe9xdzmDIA8DqvLkjq0N9mT1OAnjepB6Gv9Q45xrZqduXUg"}}},"title":"viewvc/notes/HACKING.md at master ยท viewvc/viewvc"}