<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pmg.proxmox.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Developer_Documentation</id>
	<title>Developer Documentation - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pmg.proxmox.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Developer_Documentation"/>
	<link rel="alternate" type="text/html" href="https://pmg.proxmox.com/mediawiki/index.php?title=Developer_Documentation&amp;action=history"/>
	<updated>2026-04-15T12:58:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://pmg.proxmox.com/mediawiki/index.php?title=Developer_Documentation&amp;diff=97&amp;oldid=prev</id>
		<title>Stoiko Ivanov: update links to https and buster to bullseye</title>
		<link rel="alternate" type="text/html" href="https://pmg.proxmox.com/mediawiki/index.php?title=Developer_Documentation&amp;diff=97&amp;oldid=prev"/>
		<updated>2022-08-04T09:05:43Z</updated>

		<summary type="html">&lt;p&gt;update links to https and buster to bullseye&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:05, 4 August 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 30:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 30:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Add the following to the &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; file:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Add the following to the &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; file:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  deb http://download.proxmox.com/debian/devel/ &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;buster&lt;/del&gt; main&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  deb http://download.proxmox.com/debian/devel/ &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;bullseye&lt;/ins&gt; main&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Checking out a git repository ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Checking out a git repository ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 52:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 52:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The codebase is mostly Perl, with JavaScript for the web-interface.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The codebase is mostly Perl, with JavaScript for the web-interface.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We use the ExtJS framework for the GUI components; its API documentation can be found [&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;http&lt;/del&gt;://docs.sencha.com/extjs/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;6&lt;/del&gt;.0.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1&lt;/del&gt;/index.html here.]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We use the ExtJS framework for the GUI components; its API documentation can be found [&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https&lt;/ins&gt;://docs.sencha.com/extjs/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;7&lt;/ins&gt;.0.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;0&lt;/ins&gt;/index.html here.]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Using git ===&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Using git ===&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 251:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 251:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Software License and Copyright ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Software License and Copyright ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We only include code licensed under GNU Affero General Public License, version 3 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;http&lt;/del&gt;://www.gnu.org/licenses/agpl-3.0.html.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We only include code licensed under GNU Affero General Public License, version 3 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https&lt;/ins&gt;://www.gnu.org/licenses/agpl-3.0.html.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Additionally, we ask contributors to send us a contributor license agreement form by email. This agreement establishes a relationship between us and the contributor, gives details on what it means when the contributor grants permission for their work to be included in a project, and enables us to better maintain these projects.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Additionally, we ask contributors to send us a contributor license agreement form by email. This agreement establishes a relationship between us and the contributor, gives details on what it means when the contributor grants permission for their work to be included in a project, and enables us to better maintain these projects.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 258:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 258:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We&#039;ve tried to keep the agreement as simple and comprehensible as possible. It comes in two flavors:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We&#039;ve tried to keep the agreement as simple and comprehensible as possible. It comes in two flavors:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* one for [&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;http&lt;/del&gt;://www.proxmox.com/downloads/item/proxmox-individual-contributor-license-agreement individual contributors]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* one for [&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https&lt;/ins&gt;://www.proxmox.com/downloads/item/proxmox-individual-contributor-license-agreement individual contributors]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* and one for [&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;http&lt;/del&gt;://www.proxmox.com/downloads/item/proxmox-entity-contributor-assignment-agreement entities contributors] (companies, foundations, or other organizations).&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* and one for [&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https&lt;/ins&gt;://www.proxmox.com/downloads/item/proxmox-entity-contributor-assignment-agreement entities contributors] (companies, foundations, or other organizations).&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are making a contribution that is not your own work (for example, a patch or library written by someone else), please contact office@proxmox.com for guidance on whether any additional steps are needed.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are making a contribution that is not your own work (for example, a patch or library written by someone else), please contact office@proxmox.com for guidance on whether any additional steps are needed.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key pmg_wiki:diff:1.41:old-59:rev-97:wikidiff2=table:1.14.1:bc2a06be --&gt;
&lt;/table&gt;</summary>
		<author><name>Stoiko Ivanov</name></author>
	</entry>
	<entry>
		<id>https://pmg.proxmox.com/mediawiki/index.php?title=Developer_Documentation&amp;diff=59&amp;oldid=prev</id>
		<title>Martin: page created</title>
		<link rel="alternate" type="text/html" href="https://pmg.proxmox.com/mediawiki/index.php?title=Developer_Documentation&amp;diff=59&amp;oldid=prev"/>
		<updated>2020-10-29T10:28:53Z</updated>

		<summary type="html">&lt;p&gt;page created&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Please communicate you plans with us, before starting any development. It is important to have a common view of the problem and corresponding solution, in order to avoid duplicated work and unnecessary efforts.&lt;br /&gt;
&lt;br /&gt;
Our source code repository is read-only. To contribute code, send it as a patch (git diff) to the pmg-devel mailing list. We will review your patch and apply it (and possible corrections/additions) if the review is successful. Note that we will only include code that meets our quality criteria. &lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
This is the primary communication channel for developers to discuss new features and implementation details. If you are a developer and you want to develop additional features, this is the place to start.&lt;br /&gt;
&lt;br /&gt;
PMG Development List: https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel&lt;br /&gt;
&lt;br /&gt;
Archive: https://lists.proxmox.com/pipermail/pmg-devel/&lt;br /&gt;
&lt;br /&gt;
== Access to Code Repository (git) ==&lt;br /&gt;
&lt;br /&gt;
You can find all of our project repositories at the link below.&lt;br /&gt;
&lt;br /&gt;
https://git.proxmox.com&lt;br /&gt;
&lt;br /&gt;
== Build instructions ==&lt;br /&gt;
&lt;br /&gt;
*TODO*&lt;br /&gt;
&lt;br /&gt;
== Development Package Repository ==&lt;br /&gt;
&lt;br /&gt;
Some packages required for development can only be found in the &amp;#039;&amp;#039;devel&amp;#039;&amp;#039; repository. &lt;br /&gt;
This is a cross-project repository and may be used for all Proxmox projects.&lt;br /&gt;
&lt;br /&gt;
Add the following to the &amp;lt;code&amp;gt;/etc/apt/sources.list&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
  deb http://download.proxmox.com/debian/devel/ buster main&lt;br /&gt;
&lt;br /&gt;
== Checking out a git repository ==&lt;br /&gt;
&lt;br /&gt;
To clone a repository, run &amp;#039;git clone&amp;#039; with the repository name prefixed with the common URL: &amp;lt;nowiki&amp;gt;git://git.proxmox.com/git/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git clone git://git.proxmox.com/git/proxmox-mailgateway.git&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To update an already cloned project to the current version use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git pull&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working on the code ==&lt;br /&gt;
&lt;br /&gt;
=== Coding guidelines ===&lt;br /&gt;
&lt;br /&gt;
The codebase is mostly Perl, with JavaScript for the web-interface.&lt;br /&gt;
&lt;br /&gt;
We use the ExtJS framework for the GUI components; its API documentation can be found [http://docs.sencha.com/extjs/6.0.1/index.html here.]&lt;br /&gt;
&lt;br /&gt;
=== Using git ===&lt;br /&gt;
&lt;br /&gt;
If you are not familiar with git, it&amp;#039;s worth having a look at this interactive tutorial:&lt;br /&gt;
https://try.github.io, and reading the brief introduction chapter from the official git documentation: https://git-scm.com/docs/gittutorial&lt;br /&gt;
to gain basic knowledge on it.&lt;br /&gt;
&lt;br /&gt;
First, configure your &amp;#039;&amp;#039;real&amp;#039;&amp;#039; name and email address for git, if not done already:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git config --global user.name &amp;quot;John Doe&amp;quot;&lt;br /&gt;
$ git config --global user.email john@example.com&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will be used to sign off commits as your work.&lt;br /&gt;
&lt;br /&gt;
We recommend that you start a feature branch before working on the code locally:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git checkout -b my_branch master&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, you can start working on your improvements. You can compare your changes to the current PMG master branch with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git diff master..my_branch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Commits and Commit Messages ====&lt;br /&gt;
&lt;br /&gt;
After making changes, commit them (try to make small, self-contained commits) with a sign-off line included (-s).&lt;br /&gt;
&lt;br /&gt;
* Make sure the line length of the commit&amp;#039;s message is &amp;#039;&amp;#039;&amp;#039;not longer than 70 characters&amp;#039;&amp;#039;&amp;#039;. HTTPS links are an exception and should not be split.&lt;br /&gt;
* If it fixes a bug, start with that information, in the form: &amp;lt;code&amp;gt;fix #1234: summary here&amp;lt;/code&amp;gt;&lt;br /&gt;
* If it implements a feature tracked on Bugzilla, use: &amp;lt;code&amp;gt;close #1234: summary here&amp;lt;/code&amp;gt;, albeit &amp;lt;code&amp;gt;fix #1234:&amp;lt;/code&amp;gt; is commonly used and also fine.&lt;br /&gt;
* Add a tag to the beginning, if an obvious choice exists. For example, if you made a change to the user-configuration  API, a possible tag could be &amp;lt;code&amp;gt;api: user-config: summary here&amp;lt;/code&amp;gt;&lt;br /&gt;
: However, do &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; just paste the changed file, including path and file ending as a tag. This has no use and makes it harder to read.&lt;br /&gt;
&lt;br /&gt;
The following command will take all the changes in tracked files and commit them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git commit -s -a&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
New files won&amp;#039;t get added automatically with this command. To stage new or altered files for a commit, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git add newfile1.pm file2.pm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can always look at what will be committed with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git diff --staged&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preparing Patches ==&lt;br /&gt;
&lt;br /&gt;
{{note| We need a valid [[#Software License and Copyright|CLA]] to include your changes|reminder}}&lt;br /&gt;
&lt;br /&gt;
Since we have several projects in our git repository that use the pmg-devel mailing list,&lt;br /&gt;
we ask you to clarify which repository your patches are meant for,&lt;br /&gt;
by specifying it in the subject prefix, for example, &amp;#039;pmg-api&amp;#039; or &amp;#039;pmg-gui&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Example: Creating the raw patch series for the &amp;lt;tt&amp;gt;pmg-api&amp;lt;/tt&amp;gt; package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# rm -rf my-patches/       # to clean left-overs&lt;br /&gt;
# git format-patch -o my-patches/ --subject-prefix=&amp;quot;PATCH pmg-api&amp;quot; master..my_branch --cover-letter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explain in the cover letter the aim of your patches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
edit my-patches/0000-cover-letter.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sending patches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git send-email --to=pmg-devel@lists.proxmox.com  my-patches/00*.patch&lt;br /&gt;
# rm -rf my-patches/       # to clean left-overs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you wish to write comments for individual patches, you can do that either in&lt;br /&gt;
the cover-letter, or in the patch&amp;#039;s &amp;#039;&amp;#039;commit summary section&amp;#039;&amp;#039; (between the line&lt;br /&gt;
consisting of 3 consecutive dashes ending your commit message and before the&lt;br /&gt;
list of files with their change-counts).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From 12345abcde Mon Sep 12 00:00:00 2001&lt;br /&gt;
From: Git Committer &amp;lt;some email address&amp;gt;&lt;br /&gt;
Date: Fri, 7 Oct 2020 08:30:17 +0200&lt;br /&gt;
Subject: [PATCH pmg-api 1/2] Fix #1013: this and that&lt;br /&gt;
&lt;br /&gt;
Here is your commit message.&lt;br /&gt;
It explains the bugfix and ends after this line.&lt;br /&gt;
&lt;br /&gt;
Signed-off-by: Firstname Lastname &amp;lt;firstname@lastname.email&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
 ***HERE*** you can write your comments.&lt;br /&gt;
 If this is a new version of an old patch, explain your changes here&lt;br /&gt;
&lt;br /&gt;
 src/PMG/Config.pm | 2 +-&lt;br /&gt;
&lt;br /&gt;
diff --git a/src/PMG/Config.pm b/src/PMG/Config.pm&lt;br /&gt;
(...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to send several related patches that contain changes to different repositories, you can first iterate over all involved repositories, save the patches into one directory and then do a single git send-email over all generated patches. For example, lets go to a few repos and format the most recent commit as a patch to /tmp/patchq, then send it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# cd pmg-api; git format-patch -s -o /tmp/patchq -1 &lt;br /&gt;
# cd ../pmg-gui; git format-patch -s -o /tmp/patchq -1  &lt;br /&gt;
# git send-email --compose --to=pmg-devel@lists.proxmox.com /tmp/patchq/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using &amp;quot;start-number&amp;quot; and the likes can improve this further, but this is a good start.&lt;br /&gt;
&lt;br /&gt;
=== Versioned Patches ===&lt;br /&gt;
&lt;br /&gt;
If an updated version of your patch series is called for, it should be sent&lt;br /&gt;
as a new series, rather than as a reply to the old series.&lt;br /&gt;
Always send the entire series, with all patches showing the same version.&lt;br /&gt;
Please mark your versions in the subject prefix, with a small &amp;#039;v&amp;#039;, followed by&lt;br /&gt;
the version number, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git format-patch -o my-patches/ --subject-prefix=&amp;quot;PATCH v2 pmg-api&amp;quot; master..my_branch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please list all the changes to the previous versions in the &amp;#039;&amp;#039;commit summary&lt;br /&gt;
section&amp;#039;&amp;#039; as shown in the above example.&lt;br /&gt;
For patches with no changes to the previous version, you should mention that there were no&lt;br /&gt;
changes in the summary section.&lt;br /&gt;
&lt;br /&gt;
If your series has a cover letter, summarize all changes in it as well.&lt;br /&gt;
&lt;br /&gt;
=== Reviewing patches ===&lt;br /&gt;
&lt;br /&gt;
After reviewing patches which affect a subsystem you maintain, you can notify&lt;br /&gt;
committers that you have reviewed the patch and are OK with the changes, with: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acked-by: name / email address&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Convenience Settings ===&lt;br /&gt;
&lt;br /&gt;
For convenience, you can store the pmg-devel email address and the repository&amp;#039;s&lt;br /&gt;
default subject prefixes in your repository clones&amp;#039; configurations as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git config --local sendemail.to pmg-devel@lists.proxmox.com&lt;br /&gt;
$ git config --local format.subjectprefix &amp;#039;PATCH pmg-gui&amp;#039;&lt;br /&gt;
$ git config --local format.signoff true &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the commands to create and send patches become:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# git format-patch -o my-patches/ master..my_branch&lt;br /&gt;
# git send-email --compose my-patches/00*.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sending Patches ==&lt;br /&gt;
&lt;br /&gt;
Always use &amp;lt;code&amp;gt;git send-email&amp;lt;/code&amp;gt; to send out patches, otherwise the indentation and formatting will get mangled and the patch cannot be applied anymore.&lt;br /&gt;
&lt;br /&gt;
=== Tutorial ===&lt;br /&gt;
&lt;br /&gt;
See https://git-send-email.io/ for an interactive tutorial on setting up &amp;lt;code&amp;gt;git send-email&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Using Authenticated SMTP Server ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git send-email&amp;lt;/code&amp;gt; can be instructed to use a specific SMTP server for sending. The following shows an anonymized config section example:&lt;br /&gt;
&lt;br /&gt;
 [sendemail]&lt;br /&gt;
         smtpencryption = tls&lt;br /&gt;
         smtpserver = webmail.example.com&lt;br /&gt;
         smtpserverport = 587&lt;br /&gt;
         smtpuser = j.smith@example.com&lt;br /&gt;
         smtpsslcertpath =&lt;br /&gt;
         confirm = always&lt;br /&gt;
&lt;br /&gt;
Add this to your global user &amp;lt;code&amp;gt;~/.gitconfig&amp;lt;/code&amp;gt; or to the per project &amp;lt;code&amp;gt;.git/config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;git send-email&amp;lt;/code&amp;gt; will then use these settings by default and ask you once for the password when sending.&lt;br /&gt;
&lt;br /&gt;
== Bugtracker (Bugzilla) ==&lt;br /&gt;
&lt;br /&gt;
We use Bugzilla to track bugs and feature requests for our products.&lt;br /&gt;
&lt;br /&gt;
https://bugzilla.proxmox.com&lt;br /&gt;
&lt;br /&gt;
== Software License and Copyright ==&lt;br /&gt;
&lt;br /&gt;
We only include code licensed under GNU Affero General Public License, version 3 http://www.gnu.org/licenses/agpl-3.0.html.&lt;br /&gt;
&lt;br /&gt;
Additionally, we ask contributors to send us a contributor license agreement form by email. This agreement establishes a relationship between us and the contributor, gives details on what it means when the contributor grants permission for their work to be included in a project, and enables us to better maintain these projects.&lt;br /&gt;
&lt;br /&gt;
With the contributor agreement chosen by Proxmox, the [http://www.harmonyagreements.org Harmony CLA], the contributor gives Proxmox a license to use their contributions. The contributor continues to own the copyright in the contribution, with full rights to re-use, re-distribute, and continue modifying the contributed code, allowing them to also share that contribution with other projects.&lt;br /&gt;
&lt;br /&gt;
We&amp;#039;ve tried to keep the agreement as simple and comprehensible as possible. It comes in two flavors:&lt;br /&gt;
* one for [http://www.proxmox.com/downloads/item/proxmox-individual-contributor-license-agreement individual contributors]&lt;br /&gt;
* and one for [http://www.proxmox.com/downloads/item/proxmox-entity-contributor-assignment-agreement entities contributors] (companies, foundations, or other organizations).&lt;br /&gt;
&lt;br /&gt;
If you are making a contribution that is not your own work (for example, a patch or library written by someone else), please contact office@proxmox.com for guidance on whether any additional steps are needed.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [https://git-scm.com/documentation Git Documentation]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>