diff options
author | Nicolas Vigier <boklm@mageia.org> | 2013-04-14 13:46:12 +0000 |
---|---|---|
committer | Nicolas Vigier <boklm@mageia.org> | 2013-04-14 13:46:12 +0000 |
commit | 1be510f9529cb082f802408b472a77d074b394c0 (patch) | |
tree | b175f9d5fcb107576dabc768e7bd04d4a3e491a0 /zarb-ml/mageia-sysadm/attachments/20110105 | |
parent | fa5098cf210b23ab4f419913e28af7b1b07dafb2 (diff) | |
download | archives-master.tar archives-master.tar.gz archives-master.tar.bz2 archives-master.tar.xz archives-master.zip |
Diffstat (limited to 'zarb-ml/mageia-sysadm/attachments/20110105')
30 files changed, 41530 insertions, 0 deletions
diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/07855687/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/07855687/attachment-0001.html new file mode 100644 index 000000000..5b2f8a432 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/07855687/attachment-0001.html @@ -0,0 +1,82 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[654] Add ssh key for pterjan.</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>654</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 14:41:16 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>Add ssh key for pterjan. +He will be helping in the setup of the buildsystem (youri, iurt, ...)</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmanifestscommonpp">puppet/manifests/common.pp</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmanifestscommonpp">Modified: puppet/manifests/common.pp</a> +=================================================================== +--- puppet/manifests/common.pp 2011-01-05 00:59:39 UTC (rev 653) ++++ puppet/manifests/common.pp 2011-01-05 13:41:16 UTC (rev 654) +@@ -73,6 +73,12 @@ + key => "AAAAB3NzaC1kc3MAAACBAMFaCUsen6ZYH8hsjGK0tlaguduw4YT2KD3TaDEK24ltKzvQ+NDiPRms1zPhTpRL0p0U5QVdIMxm/asAtuiMLMxdmU+Crry6s110mKKY2930ZEk6N4YJ4DbqSiYe2JBmpJVIEJ6Betgn7yZRR2mRM7j134PddAl8BGG+RUvzib7JAAAAFQDzu/G2R+6oe3vjIbbFpOTyR3PAbwAAAIEAmqXAGybY9CVgGChSztPEdvaZ1xOVGJtmxmlWvitWGpu8m5JBf57VhzdpT4Fsf4fiVZ7NWiwPm1DzqNX7xCH7IPLPK0jQSd937xG9Un584CguNB76aEQXv0Yl5VjOrC3DggIEfZ1KLV7GcpOukw0RerxKz99rYAThp6+qzBIrv38AAACBAKhXi7uNlajescWFjiCZ3fpnxdyGAgtKzvlz60mGKwwNyaQCVmPSmYeBI2tg1qk+0I5K6LZUxWkdhuE1UfvAbIrEdwyD8p53dPg1J9DpdQ1KqApeKqLxO02KJtfomuy3cRQXmdfOTovYN7zAu1NCp51uUNTzhIpDHx0MZ6bsWSFv", + user => "root" + } ++ ++ ssh_authorized_key { "ssh key pterjan": ++ type => "ssh-rsa", ++ key => "AAAAB3NzaC1yc2EAAAABIwAAAQEAspyZMl5zAkk5SL45zFvtJF7UhXTRb0bEaZ3nuCC1Ql5wM3GWuftqd5zLH88dCu7ZO/BVh213LZTq/UHb6lI7kWalygk53qtdEx2cywjWFOW23Rg6xybatCEZ2/ZrpGZoBGnu63otAp4h2Nnj/VkOio3pGwD8vavmZ4xPrcECPAwtMPJsYf44Ptu2JdXizi4iY8I0/HKitQ113I4NbDcAiMKbTXSbOfqC+ldcgW3+9xShx/kuMFTKeJOy4LI4GR6gykzkV6+vfnalp24x/SIEjuohBarCRQKo4megHqZOzdMYAHqq0QuNubXURNb0Mvz1sE7Y8AFIxwSfXdQGi5hcQQ==", ++ user => "root" ++ } + } + + class urpmi_update { + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/07855687/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/07855687/attachment.html new file mode 100644 index 000000000..5b2f8a432 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/07855687/attachment.html @@ -0,0 +1,82 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[654] Add ssh key for pterjan.</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>654</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 14:41:16 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>Add ssh key for pterjan. +He will be helping in the setup of the buildsystem (youri, iurt, ...)</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmanifestscommonpp">puppet/manifests/common.pp</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmanifestscommonpp">Modified: puppet/manifests/common.pp</a> +=================================================================== +--- puppet/manifests/common.pp 2011-01-05 00:59:39 UTC (rev 653) ++++ puppet/manifests/common.pp 2011-01-05 13:41:16 UTC (rev 654) +@@ -73,6 +73,12 @@ + key => "AAAAB3NzaC1kc3MAAACBAMFaCUsen6ZYH8hsjGK0tlaguduw4YT2KD3TaDEK24ltKzvQ+NDiPRms1zPhTpRL0p0U5QVdIMxm/asAtuiMLMxdmU+Crry6s110mKKY2930ZEk6N4YJ4DbqSiYe2JBmpJVIEJ6Betgn7yZRR2mRM7j134PddAl8BGG+RUvzib7JAAAAFQDzu/G2R+6oe3vjIbbFpOTyR3PAbwAAAIEAmqXAGybY9CVgGChSztPEdvaZ1xOVGJtmxmlWvitWGpu8m5JBf57VhzdpT4Fsf4fiVZ7NWiwPm1DzqNX7xCH7IPLPK0jQSd937xG9Un584CguNB76aEQXv0Yl5VjOrC3DggIEfZ1KLV7GcpOukw0RerxKz99rYAThp6+qzBIrv38AAACBAKhXi7uNlajescWFjiCZ3fpnxdyGAgtKzvlz60mGKwwNyaQCVmPSmYeBI2tg1qk+0I5K6LZUxWkdhuE1UfvAbIrEdwyD8p53dPg1J9DpdQ1KqApeKqLxO02KJtfomuy3cRQXmdfOTovYN7zAu1NCp51uUNTzhIpDHx0MZ6bsWSFv", + user => "root" + } ++ ++ ssh_authorized_key { "ssh key pterjan": ++ type => "ssh-rsa", ++ key => "AAAAB3NzaC1yc2EAAAABIwAAAQEAspyZMl5zAkk5SL45zFvtJF7UhXTRb0bEaZ3nuCC1Ql5wM3GWuftqd5zLH88dCu7ZO/BVh213LZTq/UHb6lI7kWalygk53qtdEx2cywjWFOW23Rg6xybatCEZ2/ZrpGZoBGnu63otAp4h2Nnj/VkOio3pGwD8vavmZ4xPrcECPAwtMPJsYf44Ptu2JdXizi4iY8I0/HKitQ113I4NbDcAiMKbTXSbOfqC+ldcgW3+9xShx/kuMFTKeJOy4LI4GR6gykzkV6+vfnalp24x/SIEjuohBarCRQKo4megHqZOzdMYAHqq0QuNubXURNb0Mvz1sE7Y8AFIxwSfXdQGi5hcQQ==", ++ user => "root" ++ } + } + + class urpmi_update { + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/157b5a6b/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/157b5a6b/attachment-0001.html new file mode 100644 index 000000000..fe00d542c --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/157b5a6b/attachment-0001.html @@ -0,0 +1,76 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[658] - also add identity trunk, while I am on it</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>658</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:09:53 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- also add identity trunk, while I am on it</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulesbindtemplateszonesmageiaorgzone">puppet/modules/bind/templates/zones/mageia.org.zone</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulesbindtemplateszonesmageiaorgzone">Modified: puppet/modules/bind/templates/zones/mageia.org.zone</a> +=================================================================== +--- puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:52 UTC (rev 657) ++++ puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:53 UTC (rev 658) +@@ -77,6 +77,7 @@ + ldap IN CNAME valstar + + identity IN CNAME alamut ++identity-trunk IN CNAME alamut + mirrors IN CNAME alamut + epoll IN CNAME alamut + pgsql IN CNAME alamut + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/157b5a6b/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/157b5a6b/attachment.html new file mode 100644 index 000000000..fe00d542c --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/157b5a6b/attachment.html @@ -0,0 +1,76 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[658] - also add identity trunk, while I am on it</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>658</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:09:53 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- also add identity trunk, while I am on it</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulesbindtemplateszonesmageiaorgzone">puppet/modules/bind/templates/zones/mageia.org.zone</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulesbindtemplateszonesmageiaorgzone">Modified: puppet/modules/bind/templates/zones/mageia.org.zone</a> +=================================================================== +--- puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:52 UTC (rev 657) ++++ puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:53 UTC (rev 658) +@@ -77,6 +77,7 @@ + ldap IN CNAME valstar + + identity IN CNAME alamut ++identity-trunk IN CNAME alamut + mirrors IN CNAME alamut + epoll IN CNAME alamut + pgsql IN CNAME alamut + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/2168be7c/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/2168be7c/attachment-0001.html new file mode 100644 index 000000000..552abf6bf --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/2168be7c/attachment-0001.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[213] - revert commit 196.</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>213</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 21:13:05 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- revert commit 196. The button is near the form because it is related to the +form, while the link are not. ( ie, we use spatial proximity as a affordance )</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#identityCatDaptrunkrootindextt">identity/CatDap/trunk/root/index.tt</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="identityCatDaptrunkrootindextt">Modified: identity/CatDap/trunk/root/index.tt</a> +=================================================================== +--- identity/CatDap/trunk/root/index.tt 2011-01-05 15:32:57 UTC (rev 212) ++++ identity/CatDap/trunk/root/index.tt 2011-01-05 20:13:05 UTC (rev 213) +@@ -10,13 +10,13 @@ + <label for="password_">[% l('Password : ') %]</label> + <input id="password_" type="password" name="password" /> + <br /> ++ <button type="submit" value="[% l('Login') %]" >[% l('Login') %]</button> + </div> + <div id="login_form_line"> + <span><a href="/register">[% l('Register') %]</a> | + @todo [% l('Forgotten password?') %] + <!--<a href="/forgot_password">[% l('Forgotten password?') %]</a> --> + </span> +- <button type="submit" value="[% l('Login') %]" >[% l('Login') %]</button> + </div> + </form> + </div> + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/2168be7c/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/2168be7c/attachment.html new file mode 100644 index 000000000..552abf6bf --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/2168be7c/attachment.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[213] - revert commit 196.</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>213</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 21:13:05 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- revert commit 196. The button is near the form because it is related to the +form, while the link are not. ( ie, we use spatial proximity as a affordance )</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#identityCatDaptrunkrootindextt">identity/CatDap/trunk/root/index.tt</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="identityCatDaptrunkrootindextt">Modified: identity/CatDap/trunk/root/index.tt</a> +=================================================================== +--- identity/CatDap/trunk/root/index.tt 2011-01-05 15:32:57 UTC (rev 212) ++++ identity/CatDap/trunk/root/index.tt 2011-01-05 20:13:05 UTC (rev 213) +@@ -10,13 +10,13 @@ + <label for="password_">[% l('Password : ') %]</label> + <input id="password_" type="password" name="password" /> + <br /> ++ <button type="submit" value="[% l('Login') %]" >[% l('Login') %]</button> + </div> + <div id="login_form_line"> + <span><a href="/register">[% l('Register') %]</a> | + @todo [% l('Forgotten password?') %] + <!--<a href="/forgot_password">[% l('Forgotten password?') %]</a> --> + </span> +- <button type="submit" value="[% l('Login') %]" >[% l('Login') %]</button> + </div> + </form> + </div> + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/2b91b15e/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/2b91b15e/attachment-0001.html new file mode 100644 index 000000000..ca22eaf1b --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/2b91b15e/attachment-0001.html @@ -0,0 +1,6045 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[209] add mandriva version of youri-submit, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/submit/trunk at revision 271600</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>209</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 14:19:06 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add mandriva version of youri-submit, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/submit/trunk at revision 271600</pre> + +<h3>Added Paths</h3> +<ul> +<li>build_system/mdv-youri-submit/</li> +<li>build_system/mdv-youri-submit/branches/</li> +<li>build_system/mdv-youri-submit/tags/</li> +<li>build_system/mdv-youri-submit/trunk/</li> +<li><a href="#build_systemmdvyourisubmittrunkChangeLog">build_system/mdv-youri-submit/trunk/ChangeLog</a></li> +<li><a href="#build_systemmdvyourisubmittrunkMANIFESTSKIP">build_system/mdv-youri-submit/trunk/MANIFEST.SKIP</a></li> +<li><a href="#build_systemmdvyourisubmittrunkMakefilePL">build_system/mdv-youri-submit/trunk/Makefile.PL</a></li> +<li><a href="#build_systemmdvyourisubmittrunkREADME">build_system/mdv-youri-submit/trunk/README</a></li> +<li><a href="#build_systemmdvyourisubmittrunkTODO">build_system/mdv-youri-submit/trunk/TODO</a></li> +<li>build_system/mdv-youri-submit/trunk/bin/</li> +<li><a href="#build_systemmdvyourisubmittrunkbinyouricheckin">build_system/mdv-youri-submit/trunk/bin/youri-check.in</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmit">build_system/mdv-youri-submit/trunk/bin/youri-submit</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmitproxyin">build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmitrestrictedin">build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmitin">build_system/mdv-youri-submit/trunk/bin/youri-submit.in</a></li> +<li>build_system/mdv-youri-submit/trunk/etc/</li> +<li>build_system/mdv-youri-submit/trunk/etc/bash_completion.d/</li> +<li><a href="#build_systemmdvyourisubmittrunketcbash_completiondyourisubmit">build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit</a></li> +<li><a href="#build_systemmdvyourisubmittrunketcsubmitconf">build_system/mdv-youri-submit/trunk/etc/submit.conf</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/</li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/</li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/</li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionArchivepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionBugzillapm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionCVSpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionCleanpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionDkmsModuleInfopm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionInstallpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionLinkpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionMailpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionMarkreleasepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionRSSpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionRpminfopm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionSendpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionSendcachepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionSignpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionUnpackpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionUpdateMdvDbpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckACLpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckHistorypm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckHostpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckPrecedencepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckQueue_recencypm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckRecencypm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckRpmlintpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckSVNpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckSectionpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckSourcepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckTagpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckTypepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckVersionpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPluginpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostCleanRpmsratepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostGendistribpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostGenhdlist2pm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPreRsyncpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPrepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectArchivepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectCleanpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectInstallpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectMailpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/t/</li> +<li><a href="#build_systemmdvyourisubmittrunkt00distributiont">build_system/mdv-youri-submit/trunk/t/00distribution.t</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemmdvyourisubmittrunkChangeLog">Added: build_system/mdv-youri-submit/trunk/ChangeLog</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/ChangeLog (rev 0) ++++ build_system/mdv-youri-submit/trunk/ChangeLog 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,606 @@ ++2008-02-19 07:50 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: fix "grep_files" handling ++ ++2008-02-12 09:42 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: do not make rpmlint errors ++ fatal anymore (asked by fcrozat) ++ ++2008-02-08 17:49 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: remove results occurences and ++ update doc ++ ++2008-02-08 17:48 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: make all rpmlint errors fatal ++ ++2008-02-08 17:44 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: removed unneeded parentheses ++ ++2008-02-08 17:44 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: make clear ++ repository/target/define are unused ++ ++2008-02-08 17:43 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: use scalar for fd ++ ++2008-01-31 16:35 pixel ++ ++ * lib/Youri/Submit/Action/Link.pm: also call ->set_arch_changed ++ when linking a noarch file to another arch ++ (this still doesn't explain media/media_info/MD5SUM not being ++ remade, but it ++ can help...) ++ ++2007-12-21 14:37 blino ++ ++ * bin/youri-submit.in: merge youri-submit into youri-submit.in ++ ++2007-12-19 13:43 blino ++ ++ * lib/Youri/Submit/Action/Archive.pm: only log main/updates ++ modifications, not contrib/updates or non-free/updates which are ++ legal ++ ++2007-12-19 13:37 blino ++ ++ * lib/Youri/Submit/Action/Archive.pm: add spuk's debug code for bug ++ 34999 ++ ++2007-12-17 19:45 blino ++ ++ * bin/youri-submit: add an "allow_omitting_packages" global option, ++ to be able to run youri even if no packages are specified on the ++ command line (useful if packages are fetched in pre action) ++ ++2007-12-17 19:34 blino ++ ++ * bin/youri-submit: improve error messages for pres/posts actions ++ (patch from raoh's copy, probably from warly) ++ ++2007-12-17 19:33 blino ++ ++ * bin/youri-submit: fix typo about posts actions (patch from raoh's ++ copy, probably from warly) ++ ++2007-12-13 15:01 pixel ++ ++ * lib/Youri/Submit/Check/Version.pm: - empty {authorized_users} ++ doesn't imply every one is allowed to bypass freeze check! ++ - {authorized_users} should be checked more strictly ++ ++2007-12-07 18:26 spuk ++ ++ * lib/Youri/Submit/Action/Sendcache.pm: - make Sendcache send debug ++ packages only if explicitly told to, to save space ++ ++2007-11-30 19:29 spuk ++ ++ * lib/Youri/Submit/Action/UpdateMdvDb.pm: Youri action to update ++ the Mandriva maintainers database. ++ ++2007-10-04 20:07 blino ++ ++ * lib/Youri/Submit/Check/Host.pm: make host reject message more ++ explicit by print arch (useful when VMware-player for x86_64 ++ actually uses i386 as rpm arch...) ++ ++2007-09-26 11:21 blino ++ ++ * lib/Youri/Submit/Action/Install.pm: improve log message ++ ++2007-09-26 11:19 blino ++ ++ * lib/Youri/Submit/Action/Install.pm: fix installed filename (oops) ++ ++2007-09-26 09:58 blino ++ ++ * lib/Youri/Submit/Action/Install.pm: throw exception on failure, ++ not to delete files that can be copied because of lack of space ++ (upstream commit 1398) ++ ++2007-09-25 10:49 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: allow to unpack only some ++ files (for release-notes.txt in mandriva-release-common) ++ ++2007-09-22 13:11 blino ++ ++ * lib/Youri/Submit/Check/Version.pm: allow authorized users to ++ upload everything even during full freeze ++ ++2007-08-31 12:51 pixel ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: handle new rpmlint format ++ (not useful at the moment since we still use old rpmlint, but may ++ be useful in ++ the future) ++ ++2007-08-31 10:03 blino ++ ++ * lib/Youri/Submit/Action/DkmsModuleInfo.pm: adapt to new ++ SOURCEPACKAGE value in prebuilt dkms kernel ++ ++2007-08-29 13:21 blino ++ ++ * lib/Youri/Submit/Action/DkmsModuleInfo.pm: initial ++ Youri::Submit::Action::DkmsModuleInfo module ++ ++2007-08-07 12:50 pixel ++ ++ * lib/Youri/Submit/Action/Link.pm: we need the same workaround as ++ done in Action::Install ++ ++2007-07-16 09:27 blino ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: remove unused variable ++ ++2007-07-08 02:44 spuk ++ ++ * lib/Youri/Submit/Check/Recency.pm: - check for newer/current ++ revisions in default section when submitted to another section ++ (bug #30635) ++ ++2007-07-02 09:17 pixel ++ ++ * lib/Youri/Submit/Action/CVS.pm: drop mdv specific stuff (mdv ++ doesn't use this action anymore) ++ ++2007-06-28 07:40 pixel ++ ++ * lib/Youri/Submit/Action/Link.pm: do update hdlist for every arch ++ after linking noarch packages (#31638) ++ ++2007-06-28 07:37 pixel ++ ++ * lib/Youri/Submit/Action/Install.pm: simplify ($arch is not used ++ by ->set_install_dir_changed) ++ ++2007-06-23 13:54 pixel ++ ++ * lib/Youri/Submit/Action/Mail.pm, lib/Youri/Submit/Reject/Mail.pm: ++ keep raw changelogs to avoid changing the format (backport) ++ ++2007-06-23 08:10 spuk ++ ++ * lib/Youri/Submit/Check/Recency.pm: - check for newer and same ++ existing revisions in a single pass ++ - use proper get_revisions() instead of get_install_file() hack, ++ as the ++ latter will use the current file name, and thus will fail to ++ check for an ++ existing package revision when submitting, because submitted ++ SRPMs have a ++ different name ("@rev:foobar-...") than what goes into the ++ repository ++ ++2007-06-22 13:51 pixel ++ ++ * lib/Youri/Submit/Post/CleanRpmsrate.pm: ensure we don't do ++ anything if nothing changed ++ ++2007-06-22 13:41 pixel ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: more atomic generation of ++ MD5SUM ++ ++2007-06-22 13:35 pixel ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: - need to redo global ++ MD5SUM. This MD5SUM is mostly obsolete, but is still needed up to ++ 2007.1 ++ (and needed even on cooker for existing urpmi.cfg) ++ - don't use --blind. hopefully not needed ++ ++2007-06-22 06:45 pixel ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: call genhdlist2 with (new) ++ option --allow-empty-media ++ ++2007-06-21 10:13 blino ++ ++ * lib/Youri/Submit/Post/CleanRpmsrate.pm: uniquify arch list ++ ++2007-06-21 08:16 pixel ++ ++ * lib/Youri/Submit/Action/Install.pm, ++ lib/Youri/Submit/Post/Genhdlist2.pm: new action Genhdlist2 ++ ++2007-06-14 18:23 mrl ++ ++ * lib/Youri/Submit/Action/Sendcache.pm: - As this action is unique, ++ avoid too much flexibility and simplify the code. ++ - Use . for hidding temporary files instead of .new suffix. ++ ++2007-06-13 18:36 mrl ++ ++ * lib/Youri/Submit/Action/Sendcache.pm: - Adapted for working with ++ iurt cache. ++ ++2007-06-13 01:48 spuk ++ ++ * lib/Youri/Submit/Action/Link.pm: no such 'cd' function, 'chdir' ++ it is... ++ ++2007-05-08 06:22 spuk ++ ++ * lib/Youri/Submit/Reject/Mail.pm: fixing the Big SVN Breakage: ++ reverting last commit, restoring state as of latest working ++ checkout in ken ++ ++2007-05-08 06:06 spuk ++ ++ * lib/Youri/Submit/Post/Gendistrib.pm: fixing the Big SVN Breakage: ++ restoring state as of working checkout in ken ++ ++2007-05-08 06:00 spuk ++ ++ * lib/Youri/Submit/Action/Scp.pm: fixing the Big SVN Breakage: ++ Scp.pm was changed into Send.pm ++ ++2007-05-05 06:16 spuk ++ ++ * lib/Youri/Submit/Check/Section.pm: Check if package submission ++ was for the correct section. ++ ++2007-03-24 11:36 spuk ++ ++ * lib/Youri/Submit/Action/Archive.pm: - moved hack for verbosity to ++ start of code, with a remark ++ - removed double $path from debug string ++ ++2007-03-15 12:36 mrl ++ ++ * lib/Youri/Submit/Check/Version.pm: - Fixed version_freeze mode: ++ do not allow any upload with a different version ++ from what is already present on the repository. ++ - Added an ACL control for maintainers allowed to bypass this ++ restriction as option ++ authorized_users. ++ ++2007-03-15 12:32 mrl ++ ++ * lib/Youri/Submit/Check/Version.pm: - Improved indentation. ++ - Added some comments regarding possible bugs in freeze modes. ++ ++2005-05-24 14:40 Sawyer ++ ++ * lib/Youri/Submit/Reject/Mail.pm: LOST ++ ++2007-03-10 07:49 spuk ++ ++ * lib/Youri/Submit/Action/Archive.pm: The extra '/' was causing the ++ string to not be matched by the regexp below ++ for getting $rep_section and $rep_main_section, in the end making ++ the SRPMs ++ of all other subsections be removed when a newer package was ++ uploaded for any ++ subsection. (#28719) ++ ++2007-02-26 10:56 blino ++ ++ * lib/Youri/Submit/Post/CleanRpmsrate.pm: initial ++ Post::CleanRpmsrate module ++ ++2007-02-14 12:10 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: match rpmlint errors that have ++ no value (such as non-xdg-migrated-menu, the only one we ++ currently use...) ++ ++2007-02-09 22:11 blino ++ ++ * bin/youri-submit: get -> get_arg ++ ++2007-02-09 22:09 blino ++ ++ * bin/youri-submit: merge changes from ken/kenobi ++ ++2007-02-09 22:09 blino ++ ++ * bin/youri-submit: create youri-submit from youri-submit.in ++ ++2007-02-09 19:39 blino ++ ++ * lib/Youri/Submit/Check/ACL.pm: add section in acl error message ++ ++2007-02-09 19:34 blino ++ ++ * lib/Youri/Submit/Reject/Mail.pm: do not use packager adress as ++ from, it may be invalid (non-free packages) or not subscribed to ++ maintainers ++ ++2007-02-09 18:51 blino ++ ++ * lib/Youri/Submit/Reject/Mail.pm: fix changelog in reject mail ++ ++2007-02-09 18:50 blino ++ ++ * lib/Youri/Submit/Reject/Mail.pm: fix reject mail ++ ++2007-02-08 17:28 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: also give directories to "cpio ++ -pdu" to ensure directories are created with same rights ++ ++2007-02-08 14:09 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: This action plugin unpack ++ package files somewhere. ++ When unpack_inside_distribution_root is set, dest_directory is ++ relative to the distribution root. ++ When the package is a noarch, the wanted files are unpacked in ++ distribution root of each archs. ++ ++ eg: ++ unpack_installer_images: ++ class: Youri::Submit::Action::Unpack ++ options: ++ name: drakx-installer-images ++ source_subdir: /usr/lib*/drakx-installer-images ++ dest_directory: . ++ unpack_inside_distribution_root: 1 ++ ++2007-01-30 10:02 pixel ++ ++ * lib/Youri/Submit/Check/ACL.pm, lib/Youri/Submit/Check/Host.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/SVN.pm, ++ lib/Youri/Submit/Check/Source.pm, lib/Youri/Submit/Check/Type.pm, ++ lib/Youri/Submit/Check/Version.pm, lib/Youri/Submit/Pre/Rsync.pm, ++ lib/Youri/Submit/Reject/Archive.pm, ++ lib/Youri/Submit/Reject/Clean.pm, ++ lib/Youri/Submit/Reject/Install.pm, ++ lib/Youri/Submit/Reject/Mail.pm: fix $Id$ expansion ++ ++2007-01-30 10:01 pixel ++ ++ * lib/Youri/Submit/Plugin.pm, lib/Youri/Submit/Post.pm, ++ lib/Youri/Submit/Pre.pm, lib/Youri/Submit/Reject.pm: fix pod and ++ $Id$ expansion ++ ++2007-01-30 10:00 pixel ++ ++ * lib/Youri/Submit/Post.pm: fix pod ++ ++2007-01-30 09:59 pixel ++ ++ * lib/Youri/Submit/Action/Send.pm: fix pod ++ ++2007-01-30 09:58 pixel ++ ++ * lib/Youri/Submit/Action/Markrelease.pm, ++ lib/Youri/Submit/Action/Scp.pm: fix pod ++ ++2007-01-30 09:49 pixel ++ ++ * lib/Youri/Submit/Action/Clean.pm, ++ lib/Youri/Submit/Action/Link.pm, ++ lib/Youri/Submit/Action/Markrelease.pm, ++ lib/Youri/Submit/Action/Rpminfo.pm, ++ lib/Youri/Submit/Action/Scp.pm, lib/Youri/Submit/Action/Send.pm: ++ fix $Id$ expansion ++ ++2007-01-26 11:25 blino ++ ++ * lib/Youri/Submit/Check/ACL.pm: really match section in ACL ++ ++2007-01-26 11:24 blino ++ ++ * lib/Youri/Submit/Check/ACL.pm: fix arch ACL matching (and thus ++ allow ACLs to match again) ++ ++2006-12-24 10:31 mandrake ++ ++ * lib/Youri/Submit/Post.pm, lib/Youri/Submit/Pre.pm, ++ lib/Youri/Submit/Reject.pm: Removing previous pristine/ ++ directory. ++ ++2006-12-24 03:15 mandrake ++ ++ * lib/Youri/Submit/Action.pm: %repsys markrelease ++ version: 1.0 ++ release: 0.20061223.3mdv2007.1 ++ revision: 101968 ++ ++ Copying 1.0-0.20061223.3mdv2007.1 to releases/ directory. ++ ++2006-10-16 16:05 warly ++ ++ * lib/Youri/Submit/Check.pm: merging dev with upstream ++ ++2006-11-14 22:01 mrl ++ ++ * lib/Youri/Submit/Action/Rpminfo.pm: - Renamed package name tag. ++ ++2006-11-14 16:38 mrl ++ ++ * lib/Youri/Submit/Action/RpmInfo.pm, ++ lib/Youri/Submit/Action/Rpminfo.pm: - Renamed, due to some ++ enforcement (cfengine?). ++ ++2006-11-14 13:23 mrl ++ ++ * lib/Youri/Submit/Action/RpmInfo.pm: - Added package summary to ++ .info files. ++ ++2006-11-13 12:40 mrl ++ ++ * lib/Youri/Submit/Action/RpmInfo.pm: - First version of web ++ interface. ++ ++2006-10-31 11:40 mandrake ++ ++ * lib/Youri/Submit/Action/Archive.pm: unlink file in Archive for ++ the moment (should be done in clean but the code to detect which ++ packages is obsoleted has to be moved ++ ++2006-10-26 11:26 mandrake ++ ++ * lib/Youri/Submit/Action/CVS.pm: we perform CVS commit ++ asynchronously ++ ++2006-10-26 11:21 mandrake ++ ++ * lib/Youri/Submit/Action/Install.pm: rename the rpm to remove the ++ prefix ++ ++2006-10-26 11:18 mandrake ++ ++ * lib/Youri/Submit/Action/Mail.pm: fix double . ++ ++2006-10-26 11:16 mandrake ++ ++ * lib/Youri/Submit/Post/Gendistrib.pm: add gendistrib command ++ directly into gendistrib module ++ ++2006-10-26 11:14 mandrake ++ ++ * lib/Youri/Submit/Pre/Rsync.pm: return correct packages table for ++ groups ++ ++2006-10-26 11:10 mandrake ++ ++ * lib/Youri/Submit/Reject/Install.pm: get_reject_path seems to be ++ the new name ++ ++2006-10-26 11:07 mandrake ++ ++ * lib/Youri/Submit/Reject/Mail.pm: $last_change is sometime empty ++ ++2006-10-24 11:07 warly ++ ++ * bin/youri-submit.in: exit with an error code if an error occured ++ in one group; s/Upload/Submit/; use new structure name from ++ upstream ++ ++2006-10-23 11:48 warly ++ ++ * lib/Youri/Submit/Check/ACL.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/SVN.pm, ++ lib/Youri/Submit/Check/Source.pm, ++ lib/Youri/Submit/Check/Version.pm: must return an empty value ++ ++2006-10-18 12:46 warly ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: remove debug code ++ ++2006-10-17 16:10 warly ++ ++ * lib/Youri/Submit/Check/ACL.pm: now checks must return the error ++ message ++ ++2006-10-17 16:04 warly ++ ++ * lib/Youri/Submit/Check/ACL.pm, lib/Youri/Submit/Check/Host.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/SVN.pm, ++ lib/Youri/Submit/Check/Source.pm, ++ lib/Youri/Submit/Check/Version.pm: now checks must return the ++ error message ++ ++2006-10-17 15:16 warly ++ ++ * lib/Youri/Submit/Action/Clean.pm, ++ lib/Youri/Submit/Action/Link.pm, lib/Youri/Submit/Check/ACL.pm, ++ lib/Youri/Submit/Check/Host.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/SVN.pm, lib/Youri/Submit/Check/Source.pm, ++ lib/Youri/Submit/Check/Type.pm, ++ lib/Youri/Submit/Check/Version.pm, lib/Youri/Submit/Post.pm, ++ lib/Youri/Submit/Pre.pm, lib/Youri/Submit/Reject.pm: ++ s/Upload/Submit/g ++ ++2006-10-17 13:53 warly ++ ++ * ., ChangeLog, MANIFEST.SKIP, Makefile.PL, README, TODO, ++ bin/youri-submit-proxy.in, bin/youri-submit-restricted.in, ++ bin/youri-submit.in, etc, etc/bash_completion.d, ++ etc/bash_completion.d/youri-submit, etc/submit.conf, ++ lib/Youri/Submit/Plugin.pm, t, t/00distribution.t: merge with ++ upstream ++ ++2006-10-16 16:27 warly ++ ++ * lib/Youri/Submit/Post/Gendistrib.pm, ++ lib/Youri/Submit/Pre/Rsync.pm, ++ lib/Youri/Submit/Reject/Archive.pm, ++ lib/Youri/Submit/Reject/Clean.pm, ++ lib/Youri/Submit/Reject/Install.pm, ++ lib/Youri/Submit/Reject/Mail.pm: Now the module is Submit and not ++ Upload ++ ++2006-10-16 16:26 warly ++ ++ * lib/Youri/Submit/Check, lib/Youri/Submit/Check/History.pm, ++ lib/Youri/Submit/Check/Precedence.pm, ++ lib/Youri/Submit/Check/Recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/Tag.pm, ++ lib/Youri/Submit/Check/Type.pm: merging dev with upstream ++ ++2006-10-16 16:15 warly ++ ++ * lib/Youri/Submit/Post.pm, lib/Youri/Submit/Pre.pm, ++ lib/Youri/Submit/Reject.pm: now plugins are complete abstract ++ classes ++ ++2006-10-16 16:08 warly ++ ++ * lib/Youri/Submit/Action.pm: merging dev with upstream ++ ++2006-10-16 16:05 warly ++ ++ * lib/Youri/Submit/Check.pm: merging dev with upstream ++ ++2006-10-16 13:03 warly ++ ++ * lib/Youri/Submit/Action/Markrelease.pm, ++ lib/Youri/Submit/Action/Scp.pm, lib/Youri/Submit/Action/Send.pm: ++ Now the Module is Submit ++ ++2006-10-16 12:57 warly ++ ++ * lib/Youri/Submit/Action, lib/Youri/Submit/Action/Archive.pm, ++ lib/Youri/Submit/Action/Bugzilla.pm, ++ lib/Youri/Submit/Action/CVS.pm, lib/Youri/Submit/Action/Clean.pm, ++ lib/Youri/Submit/Action/Install.pm, ++ lib/Youri/Submit/Action/Link.pm, lib/Youri/Submit/Action/Mail.pm, ++ lib/Youri/Submit/Action/RSS.pm, lib/Youri/Submit/Action/Sign.pm: ++ merging dev with upstream ++ ++2006-10-16 11:33 warly ++ ++ * bin/youri-check.in: add new youri subsections (from upstream) ++ ++2006-10-16 11:30 warly ++ ++ * lib/Youri/Submit: add new youri subsections (from upstream) ++ ++2006-10-16 11:30 warly ++ ++ * lib/Youri: add new youri subsections (from upstream) ++ ++2006-10-16 11:30 warly ++ ++ * lib: add new youri subsections (from upstream) ++ ++2006-10-16 11:22 warly ++ ++ * bin/youri-submit.in: add new youri subsections (from upstream) ++ ++2006-10-16 11:18 warly ++ ++ * bin: add new youri subsections (from upstream) ++ ++2006-10-16 11:18 warly ++ ++ * .: add new youri subsections (from upstream) ++ ++2006-04-23 Guillaume Rousse <guillomovitch@zarb.org> 0.9 ++ * initial release + +<a id="build_systemmdvyourisubmittrunkMANIFESTSKIP">Added: build_system/mdv-youri-submit/trunk/MANIFEST.SKIP</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/MANIFEST.SKIP (rev 0) ++++ build_system/mdv-youri-submit/trunk/MANIFEST.SKIP 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,11 @@ ++\.tar\.gz$ ++\.SKIP$ ++~$ ++^pm_to_blib$ ++^Makefile$ ++^Makefile\.old$ ++^bin/youri-submit$ ++^bin/youri-submit-restricted$ ++^bin/youri-submit-proxy$ ++.svn ++blib + +<a id="build_systemmdvyourisubmittrunkMakefilePL">Added: build_system/mdv-youri-submit/trunk/Makefile.PL</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/Makefile.PL (rev 0) ++++ build_system/mdv-youri-submit/trunk/Makefile.PL 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,97 @@ ++# $Id: Makefile.PL 1723 2006-10-17 13:53:27Z warly $ ++use ExtUtils::MakeMaker; ++use Config; ++ ++WriteMakefile( ++ NAME => 'youri-submit', ++ VERSION => 0.9, ++ AUTHOR => 'Youri project <youri@zarb.org>', ++ EXE_FILES => [ ++ 'bin/youri-submit', ++ 'bin/youri-submit-restricted', ++ 'bin/youri-submit-proxy' ++ ], ++ PREREQ_PM => { ++ 'Youri::Config' => 0, ++ 'Youri::Utils' => 0, ++ 'Pod::Simple::HTMLBatch' => 0 ++ }, ++ PREFIX => '/usr/local', ++ INSTALLPRIVLIB => $Config{installprivlib}, ++ INSTALLSITELIB => $Config{installsitelib}, ++ INSTALLVENDORLIB => $Config{installvendorlib}, ++ INSTALLMAN3DIR => $Config{installman3dir}, ++ INSTALLSITEMAN3DIR => $Config{installsiteman3dir}, ++ INSTALLVENDORMAN3DIR => $Config{installvendorman3dir}, ++ INSTALLSCRIPT => '$(PREFIX)/bin', ++ INSTALLSITESCRIPT => '$(PREFIX)/bin', ++ INSTALLVENDORSCRIPT => '$(PREFIX)/bin', ++ INSTALLMAN1DIR => '$(PREFIX)/share/man/man1', ++ INSTALLSITEMAN1DIR => '$(PREFIX)/share/man/man1', ++ INSTALLVENDORMAN1DIR => '$(PREFIX)/share/man/man1', ++); ++ ++package MY; ++ ++sub post_constants { ++ my ($self) = @_; ++ my $sysconfdir = $self->{ARGS}->{SYSCONFDIR} || '$(PREFIX)/etc'; ++ return <<EOF; ++SYSCONFDIR = $sysconfdir ++EOF ++} ++ ++sub top_targets { ++ my ($self) = @_; ++ my $top_targets = $self->SUPER::top_targets(@_); ++ $top_targets =~ s/all :: pure_all manifypods/all :: pure_all manifypods htmlifypods/; ++ $top_targets .= <<'EOF'; ++htmlifypods : $(TO_INST_PM) ++ if [ ! -d blib/html ]; then mkdir blib/html; fi ++ perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go lib blib/html ++ pod2html < bin/youri-submit > blib/html/youri-submit.html ++ pod2html < bin/youri-submit-restricted > blib/html/youri-submit-restricted.html ++ pod2html < bin/youri-submit-proxy > blib/html/youri-submit-proxy.html ++EOF ++ return $top_targets; ++} ++ ++sub install { ++ my ($self) = @_; ++ my $install = $self->SUPER::install(@_); ++ $install =~ s/install :: all pure_install doc_install/install :: all pure_install doc_install config_install completion_install/; ++ $install .= <<'EOF'; ++config_install : ++ install -d -m 755 $(DESTDIR)$(SYSCONFDIR)/youri ++ install -m 644 etc/submit.conf $(DESTDIR)$(SYSCONFDIR)/youri ++ ++completion_install : ++ install -d -m 755 $(DESTDIR)$(SYSCONFDIR)/bash_completion.d ++ install -m 644 etc/bash_completion.d/youri-submit $(DESTDIR)$(SYSCONFDIR)/bash_completion.d ++EOF ++ return $install; ++} ++ ++sub installbin { ++ my ($self) = @_; ++ my $installbin = $self->SUPER::installbin(@_); ++ $installbin .= <<'EOF'; ++bin/youri-submit : bin/youri-submit.in Makefile ++ perl -p \ ++ -e 's|\@sysconfdir\@|$(SYSCONFDIR)|;' \ ++ < $< > $@ ++ ++bin/youri-submit-restricted : bin/youri-submit-restricted.in Makefile ++ perl -p \ ++ -e 's|\@sysconfdir\@|$(SYSCONFDIR)|;' \ ++ -e 's|\@bindir\@|$(PREFIX)/bin|;' \ ++ < $< > $@ ++ ++bin/youri-submit-proxy : bin/youri-submit-proxy.in Makefile ++ perl -p \ ++ -e 's|\@sysconfdir\@|$(SYSCONFDIR)|;' \ ++ -e 's|\@bindir\@|$(PREFIX)/bin|;' \ ++ < $< > $@ ++EOF ++ return $installbin; ++} + +<a id="build_systemmdvyourisubmittrunkREADME">Added: build_system/mdv-youri-submit/trunk/README</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/README (rev 0) ++++ build_system/mdv-youri-submit/trunk/README 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,45 @@ ++YOURI project ++------------- ++ ++YOURI stands for "Youri Offers an Upload & Repository Infrastucture". It aims ++to build tools making management of a coherent set of packages easier. ++ ++Description ++----------- ++Managing a package repository involves many tasks, such as keeping packages ++tree tidy, generating packages indexes, synchronising bug report system, ++running coherency checks, checking for available updates, etc... ++ ++Instead of a gazillion project-specific scripts, we aim to provide a generic package-format independant framework, so as to build coherent and robust tools. ++ ++Components ++---------- ++Available software in this release ++- youri-check allows to check packages ++- youri-upload allows to upload packages ++ ++Installation ++------------ ++To install, just use: ++perl Makefile.PL ++make ++make test ++ ++All standard MakeMaker variables are usable, with the addition of SYSCONFDIR to ++specify configuration files destination. ++ ++Copyright and License ++--------------------- ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under ++the same terms as Perl itself. ++ ++Authors ++------- ++Guillaume Rousse <guillomovitch@zarb.org>, ++Pascal Terjan <pterjan@zarb.org> ++Damien Krotkine <dams@zarb.org> ++Olivier Thauvin <nanardon@zarb.org> ++Ville Skytt\xE4 <ville.skytta@iki.fi> ++ + +<a id="build_systemmdvyourisubmittrunkTODO">Added: build_system/mdv-youri-submit/trunk/TODO</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/TODO (rev 0) ++++ build_system/mdv-youri-submit/trunk/TODO 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,6 @@ ++1.0 Goals ++========= ++ ++- svn support ++- automatic bugzilla ticket closing on upload ++- more customizable (template based ?) mail notification + +<a id="build_systemmdvyourisubmittrunkbinyouricheckin">Added: build_system/mdv-youri-submit/trunk/bin/youri-check.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-check.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-check.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,395 @@ ++#!/usr/bin/perl ++# $Id: youri-check.in 1699 2006-10-16 11:33:58Z warly $ ++ ++=head1 NAME ++ ++youri-check - package check agent ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 SYNOPSIS ++ ++youri-check [options] <mode> ++ ++Options: ++ ++ --config <file> use file <file> as config file ++ --skip-media <media> skip media <media> ++ --skip-plugin <plugin> skip plugin <plugin> ++ --parallel parallel run ++ --verbose verbose run ++ --test test run ++ --help print this help message ++ ++=head1 DESCRIPTION ++ ++B<youri-check> allows to check packages in a repository. ++ ++In input mode, all medias defined in configuration are passed to a list of ++input plugins, each of them storing their result in a persistent resultset. In ++output mode, this resultset is passed to a list of output plugins, each of them ++producing arbitrary effects. ++ ++=head1 OPTIONS ++ ++=over ++ ++=item B<--config> <file> ++ ++Use given file as configuration, instead of normal one. ++ ++=item B<--skip-media> <media> ++ ++Skip media with given identity. ++ ++=item B<--skip-plugin> <plugin> ++ ++Skip plugin with given identity. ++ ++=item B<--parallel> ++ ++Run all plugins parallelously ++ ++=item B<--verbose> ++ ++Produce more verbose output (can be used more than once) ++ ++=item B<--test> ++ ++Don't perform any modification. ++ ++=item B<--help> ++ ++Print a brief help message and exits. ++ ++=back ++ ++=head1 CONFIGURATION ++ ++Configuration is read from the first file found among: ++ ++=over ++ ++=item * the one specified by B<--config> option on command-line ++ ++=item * $HOME/.youri/check.conf ++ ++=item * @sysconfdir@/youri/check.conf ++ ++=back ++ ++All additional configuration files specified by B<includes> directive are then ++processed. Then command line options. Any directive overrides prior definition. ++ ++=over ++ ++=item B<includes> I<files> ++ ++Uses space-separated list I<files> as a list of additional configuration files. ++ ++=item B<resolver> I<id> ++ ++Declare a maintainer resolver object with identity I<id>. ++ ++=item B<preferences> I<id> ++ ++Declare a maintainer preferences object with identity I<id>. ++ ++=item B<resultset> I<id> ++ ++Declare a resultset object with identity I<id>. ++ ++=item B<medias> I<ids> ++ ++Declares a list of media objects with identity taken in space-separated list ++I<ids>. ++ ++=item B<inputs> I<ids> ++ ++Declares a list of input plugin objects with identity taken in space-separated ++list I<ids>. ++ ++=item B<outputs> I<ids> ++ ++Declares a list of output plugin objects with identity taken in space-separated ++list I<ids>. ++ ++=back ++ ++Each object declared in configuration must be fully defined later, using a ++configuration section, starting with bracketed object identity, followed by at ++least a class directive, then any number of additional object-specific ++directives. ++ ++Example: ++ ++ objects = foo ++ ++ [foo] ++ class = Foo::Bar ++ key1 = value1 ++ key2 = value2 ++ ++=head1 SEE ALSO ++ ++Youri::Config, for configuration file format. ++ ++Each used plugin man page, for available options. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++use Youri::Config; ++use Youri::Utils; ++use Pod::Usage; ++use Net::Config qw/%NetConfig/; ++use DateTime; ++ ++my $config = Youri::Config->new( ++ command_spec => [ ++ 'config=s', ++ 'skip-plugin=s@', ++ 'skip-media=s@', ++ 'parallel!', ++ 'help|h!', ++ 'test|t!', ++ 'verbose|v!' ++ ], ++ file_spec => [ ++ 'includes=s', ++ 'resolver=s', ++ 'preferences=s', ++ 'resultset=s', ++ 'medias=s', ++ 'inputs=s', ++ 'outputs=s' ++ ], ++ directories => [ '@sysconfdir@', "$ENV{HOME}/.youri" ], ++ file_name => 'check.conf', ++ caller => $0, ++); ++ ++pod2usage( ++ -verbose => 0, ++ -message => "No mode specified, aborting\n" ++) unless @ARGV; ++ ++my $mode = $ARGV[0]; ++ ++# convenient global flags ++my $test = $config->get('test'); ++my $verbose = $config->get('verbose'); ++ ++# libnet configuration ++my %netconfig = $config->get_section('netconfig'); ++$NetConfig{$_} = $netconfig{$_} foreach keys %netconfig; ++ ++# resultset creation ++my $resultset_id = $config->get('resultset'); ++die "No resultset defined" unless $resultset_id; ++ ++report("Creating resultset $resultset_id"); ++my $resultset = create_instance( ++ 'Youri::Check::Resultset', ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ $config->get_section($resultset_id) ++); ++ ++my $children; ++ ++my %skip_plugins = map { $_ => 1 } @{$config->get('skip-plugin')}; ++ ++if ($mode eq 'input') { ++ ++ # additional objects ++ ++ my $resolver; ++ my $resolver_id = $config->get('resolver'); ++ if ($resolver_id) { ++ report("Creating maintainer resolver $resolver_id"); ++ eval { ++ $resolver = create_instance( ++ 'Youri::Check::Maintainer::Resolver', ++ test => $test, ++ verbose => $verbose > 1 ? $verbose - 2 : 0, ++ $config->get_section($resolver_id) ++ ); ++ }; ++ print STDERR "Failed to create maintainer resolver $resolver_id: $@\n" if $@; ++ } ++ ++ my $preferences; ++ my $preferences_id = $config->get('preferences'); ++ if ($preferences_id) { ++ report("Creating maintainer preferences $preferences_id"); ++ eval { ++ $preferences = create_instance( ++ 'Youri::Check::Maintainer::Preferences', ++ test => $test, ++ verbose => $verbose > 1 ? $verbose - 2 : 0, ++ $config->get_section($preferences_id) ++ ); ++ }; ++ print STDERR "Failed to create maintainer preferences $preferences_id: $@\n" if $@; ++ } ++ ++ my @medias; ++ my %skip_medias = map { $_ => 1 } @{$config->get('skip-media')}; ++ foreach my $id (split(/\s+/, $config->get('medias'))) { ++ next if $skip_medias{$id}; ++ report("Creating media $id"); ++ eval { ++ push( ++ @medias, ++ create_instance( ++ 'Youri::Media', ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ $config->get_section($id) ++ ) ++ ); ++ }; ++ print STDERR "Failed to create media $id: $@\n" if $@; ++ } ++ ++ # prepare resultset ++ $resultset->reset(); ++ $resultset->set_resolver($resolver); ++ ++ ++ foreach my $id (split(/\s+/, $config->get('inputs'))) { ++ next if $skip_plugins{$id}; ++ report("Creating input $id"); ++ my $input; ++ eval { ++ $input = create_instance( ++ 'Youri::Check::Input', ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ resolver => $resolver, ++ preferences => $preferences, ++ $config->get_section($id) ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create input $id: $@\n"; ++ } else { ++ if ($config->get('parallel')) { ++ # fork ++ my $pid = fork; ++ die "Can't fork: $!" unless defined $pid; ++ if ($pid) { ++ # parent process ++ $children++; ++ next; ++ } ++ } ++ eval { ++ $input->prepare(@medias); ++ }; ++ if ($@) { ++ print STDERR "Failed to prepare input $id: $@\n"; ++ } else { ++ # clone resultset in child process ++ $resultset = $config->get('parallel') ? ++ $resultset->clone() : ++ $resultset; ++ ++ foreach my $media (@medias) { ++ next if $media->skip_input($id); ++ my $media_id = $media->get_id(); ++ report("running input $id on media $media_id"); ++ eval { ++ $input->run($media, $resultset); ++ }; ++ if ($@) { ++ print STDERR "Failed to run input $id on media $media_id: $@\n"; ++ } ++ } ++ } ++ if ($config->get('parallel')) { ++ # child process ++ exit; ++ } ++ } ++ } ++ ++} elsif ($mode eq 'output') { ++ ++ foreach my $id (split(/\s+/, $config->get('outputs'))) { ++ next if $skip_plugins{$id}; ++ report("Creating output $id"); ++ my $output; ++ eval { ++ $output = create_instance( ++ 'Youri::Check::Output', ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ config => $config, ++ $config->get_section($id) ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create output $id: $@\n"; ++ } else { ++ if ($config->get('parallel')) { ++ # fork ++ my $pid = fork; ++ die "Can't fork: $!" unless defined $pid; ++ if ($pid) { ++ # parent process ++ $children++; ++ next; ++ } ++ } ++ ++ # clone resultset in child process ++ $resultset = $config->get('parallel') ? ++ $resultset->clone() : ++ $resultset; ++ ++ report("running output $id"); ++ eval { ++ $output->run($resultset); ++ }; ++ if ($@) { ++ print STDERR "Failed to run output $id: $@\n"; ++ } ++ ++ if ($config->get('parallel')) { ++ # child process ++ exit; ++ } ++ } ++ } ++} else { ++ die "Invalid mode $mode"; ++} ++ ++# wait for all forked processus termination ++while ($children) { ++ wait; ++ $children--; ++} ++ ++sub report { ++ my ($message) = @_; ++ print DateTime->now()->strftime('[%H:%M:%S] ') ++ if $verbose > 1; ++ print "$message\n" ++ if $verbose > 0; ++} + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-check.in +___________________________________________________________________ +<a id="svnexecutable">Added: svn:executable</a> + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmit">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,534 @@ ++#!/usr/bin/perl ++# $Id: youri-submit 232579 2007-12-17 19:45:47Z blino $ ++ ++=head1 NAME ++ ++youri-submit - package submission tool ++ ++=head1 VERSION ++ ++Version 2.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit [options] <target> <files> ++ ++youri-submit --list <category> [target] ++ ++youri-submit --help [category] [item] ++ ++Options: ++ ++ --config <file> use file <file> as config file ++ --skip-pre <pre> skip pre <pre> ++ --skip-check <check> skip check <check> ++ --skip-action <action> skip action <action> ++ --skip-post <post> skip post <post> ++ --skip-reject <reject> skip reject <reject> ++ --define <key>=<value> pass additional values ++ --clean delete package after success ++ --verbose verbose run ++ --test test run ++ --list <category> list items from given category ++ --help [category] display contextual help ++ ++=head1 DESCRIPTION ++ ++B<youri-submit> allows to submit packages to a repository. ++ ++All packages given on command lines are passed to a list of check plugins, ++depending on given upload target. If none of them fails, all packages are ++passed to a list of action plugins, depending also on given upload target. ++ ++=head1 OPTIONS ++ ++=over ++ ++=item B<--config> I<file> ++ ++Use given file as configuration, instead of normal one. ++ ++=item B<--skip-pre> I<id> ++ ++Skip pre transaction plugin with given identity ++ ++=item B<--skip-check> I<id> ++ ++Skip check plugin with given identity. ++ ++=item B<--skip-action> I<id> ++ ++Skip action plugin with given identity. ++ ++=item B<--skip-post> I<id> ++ ++Skip post transaction plugin with given identity. ++ ++=item B<--skip-reject> I<id> ++ ++Skip reject action plugin with given identity. ++ ++=item B<--define> <key>=<value> ++ ++Define additional parameters, to be used by plugins. ++ ++=item B<--clean> ++ ++Delete submited packages upon successfull submission. ++ ++=item B<--verbose> ++ ++Produce more verbose output (can be used more than once) ++ ++=item B<--test> ++ ++Don't perform any modification. ++ ++=item B<--list> I<category> ++ ++List available items from given category and exits. Category must be either ++B<targets>, B<actions> or B<checks>. A target is needed for the two last ones. ++ ++=item B<--help> I<category> ++ ++Display help for given category and exits. Category must be either ++B<repository>, B<action> or B<check>. An item is needed for the two last ones. ++If no category given, display standard help. ++ ++=back ++ ++=head1 CONFIGURATION ++ ++Configuration is read from the first file found among: ++ ++=over ++ ++=item * the one specified by B<--config> option on command-line ++ ++=item * $HOME/.youri/submit.conf ++ ++=item * /usr/local/etc/youri/submit.conf ++ ++=back ++ ++The configuration file should be a YAML-format files, with the following ++mandatory top-level directives: ++ ++=over ++ ++=item B<repository> ++ ++The definition of repository plugin to be used. ++ ++=item B<targets> ++ ++The list of available submission targets, each one being composed from the ++following keys: ++ ++=over ++ ++=item B<checks> ++ ++The list of check plugins to use for this target. ++ ++=item B<actions> ++ ++The list of action plugins to use for this target. ++ ++=back ++ ++=item B<checks> ++ ++The list of check plugin definitions, indexed by their identity. ++ ++=item B<actions> ++ ++The list of action plugin definitions, indexed by their identity. ++ ++=back ++ ++=head1 SEE ALSO ++ ++Youri::Config, for additional details about configuration file format. ++ ++Each used plugin man page, for available options. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++use Youri::Config; ++use Youri::Utils; ++use Pod::Usage; ++ ++my $config = Youri::Config->new( ++ args => { ++ 'skip-check' => '=s@', ++ 'skip-action' => '=s@', ++ 'define' => '=s%', ++ 'verbose' => '|v!', ++ 'clean' => '!', ++ 'test' => '|t!', ++ 'list' => '|l!', ++ 'config' => '=s', ++ 'skip-prei' => '=s@', ++ 'skip-post' => '=s@', ++ 'skip-reject' => '=s@', ++ }, ++ directories => [ "$ENV{HOME}/.youri", '/usr/local/etc/youri' ], ++ file => 'submit.conf', ++); ++ ++if ($config->get_arg('list')) { ++ my $category = $ARGV[0]; ++ pod2usage(-verbose => 0, -message => "No category specified, aborting\n") ++ unless $category; ++ if ($category eq 'targets') { ++ print join(' ', keys %{$config->get_param('targets')}); ++ } elsif ($category eq 'checks' || $category eq 'actions') { ++ my $target = $ARGV[1]; ++ pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless $target; ++ if ($category eq 'checks') { ++ my $checks = $config->get_param('targets')->{$target}->{checks}; ++ print join(' ', @{$checks}) if $checks; ++ } else { ++ my $actions = $config->get_param('targets')->{$target}->{actions}; ++ print join(' ', @{$actions}) if $actions; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ print "\n"; ++ exit 0; ++} ++ ++if ($config->get_arg('help')) { ++ my $category = $ARGV[0]; ++ my ($item, $section); ++ if ($category eq 'repository') { ++ $section = $config->get_param('repository'); ++ pod2usage( ++ -verbose => 0, ++ -message => "No repository defined, aborting\n" ++ ) unless $section; ++ } elsif ($category eq 'check' || $category eq 'action') { ++ $item = $ARGV[1]; ++ pod2usage( ++ -verbose => 0, ++ -message => "No item specified, aborting\n" ++ ) unless $item; ++ if ($category eq 'check') { ++ $section = $config->get_param('checks')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such check $item defined, aborting\n" ++ ) unless $section; ++ } else { ++ $section = $config->get_param('actions')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such action $item defined, aborting\n" ++ ) unless $section; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ my $file = $section->{class} . '.pm'; ++ $file =~ s/::/\//g; ++ pod2usage( ++ -verbose => 99, ++ -sections => 'NAME|DESCRIPTION', ++ -input => $file, ++ -pathlist => \@INC ++ ); ++} ++ ++ ++pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless @ARGV > 0; ++pod2usage(-verbose => 0, -message => "No packages specified, aborting\n") ++ unless @ARGV > 1 || $config->get_param('allow_omitting_packages'); ++ ++# convenient global flags ++my $test = $config->get_arg('test'); ++my $verbose = $config->get_arg('verbose'); ++ ++# check target ++my $target = shift @ARGV; ++my $target_conf = $config->get_param('targets')->{$target}; ++ ++# create repository ++my $repository; ++my $repository_conf = $config->get_param('repository'); ++die "No repository declared" unless $repository_conf; ++print "Creating repository\n" if $verbose; ++eval { ++ $repository = create_instance( ++ 'Youri::Repository', ++ $repository_conf, ++ { ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ targets => [ keys %{$config->get_param('targets')} ], ++ } ++ ); ++}; ++die "Failed to create repository: $@\n" if $@; ++ ++# perfrom pre action ++my @errors; ++my $pre_packages = []; ++my $skip_pres = $config->get_arg('skip-pre'); ++my %skip_pres = $skip_pres ? map { $_ => 1 } @{$skip_pres} : (); ++foreach my $id (@{$target_conf->{pres}}) { ++ next if $skip_pres{$id}; ++ print "Creating pre $id\n" if $verbose; ++ my $pre; ++ my $pre_conf = $config->get_param('pres')->{$id}; ++ ++ if (!$pre_conf) { ++ print STDERR "No such pre $id, skipping\n"; ++ next; ++ } ++ eval { ++ $pre = create_instance( ++ 'Youri::Submit::Pre', ++ $pre_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create pre $id: $@\n"; ++ } else { ++ print "running pre $id\n" if $verbose; ++ my @err = $pre->run( ++ $pre_packages, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@errors, @err) if $err[0]; ++ } ++} ++ ++if (@errors) { ++ print "Pre-submission errors, aborting:\n"; ++ foreach my $error (@errors) { ++ print " - $error\n"; ++ } ++ exit(1) ++} ++ ++# create packages group ++my $group_error; ++my @packages_group; ++foreach my $group ([ map { { section => "", file => $_ } } @ARGV ], @$pre_packages) { ++ my @packages; ++ foreach my $opt (@$group) { ++ print "Preparing upload for $opt->{file} in $opt->{section}\n" if $verbose; ++ $repository->{packages}{$opt->{file}}{section} = $opt->{section}; ++ push( ++ @packages, ++ create_instance( ++ 'Youri::Package', ++ { ++ class => $repository->get_package_class(), ++ }, ++ { ++ file => $opt->{file}, ++ %$opt ++ }, ++ ) ++ ); ++ } ++ @packages or next; ++ ++# check all packages pass all tests ++ my %errors; ++ my $skip_check = $config->get_arg('skip-check'); ++ my %skip_check = $skip_check ? map { $_ => 1 } @{$skip_check} : (); ++ my @error; ++ foreach my $id (@{$target_conf->{checks}}) { ++ next if $skip_check{$id}; ++ print "Creating check $id\n" if $verbose; ++ my $check; ++ my $check_conf = $config->get_param('checks')->{$id}; ++ ++ if (!$check_conf) { ++ print STDERR "No such check $id, skipping\n"; ++ next; ++ } ++ eval { ++ $check = create_instance( ++ 'Youri::Submit::Check', ++ $check_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create check $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running check $id on package $package\n" if $verbose; ++ my @errors = $check->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@{$errors{$package}}, @errors) if $errors[0]; ++ } ++ } ++ } ++ if (%errors) { ++ print "Submission errors, aborting:\n"; ++ foreach my $package (keys %errors) { ++ print "- $package:\n"; ++ foreach my $error (@{$errors{$package}}) { ++ print " - $error\n"; ++ } ++ } ++ # reject the packages ++ my $skip_rejects = $config->get_arg('skip-reject'); ++ my %skip_rejects = $skip_rejects ? map { $_ => 1 } @{$skip_rejects} : (); ++ foreach my $id (@{$target_conf->{rejects}}) { ++ next if $skip_rejects{$id}; ++ print "Creating reject $id\n" if $verbose; ++ my $reject; ++ my $reject_conf = $config->get_param('rejects')->{$id}; ++ ++ if (!$reject_conf) { ++ print STDERR "No such reject $id, skipping\n"; ++ next; ++ } ++ eval { ++ $reject = create_instance( ++ 'Youri::Submit::Reject', ++ $reject_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create reject $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running reject $id on package $package\n" if $verbose; ++ eval { ++ $reject->run($package, \%errors, $repository, $target, $config->get_arg('define')); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ $group_error = 1; ++ next ++ } ++ ++# proceed further ++ my $skip_action = $config->get_arg('skip-action'); ++ my %skip_action = $skip_action ? map { $_ => 1 } @{$skip_action} : (); ++ foreach my $id (@{$target_conf->{actions}}) { ++ next if $skip_action{$id}; ++ print "Creating action $id\n" if $verbose; ++ my $action; ++ my $action_conf = $config->get_param('actions')->{$id}; ++ ++ if (!$action_conf) { ++ print STDERR "No such action $id, skipping\n"; ++ next; ++ } ++ eval { ++ $action = create_instance( ++ 'Youri::Submit::Action', ++ $action_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create action $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running action $id on package $package\n" if $verbose; ++ eval { ++ $action->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ ++ if ($config->get_arg('clean')) { ++ foreach my $package (@packages) { ++ print "cleaning file $package\n" if $verbose; ++ unlink $package->as_file(); ++ } ++ } ++} ++ ++# perfrom post action ++my $skip_post = $config->get_arg('skip-post'); ++my %skip_post = $skip_post ? map { $_ => 1 } @{$skip_post} : (); ++foreach my $id (@{$target_conf->{posts}}) { ++ next if $skip_post{$id}; ++ print "Creating post $id\n" if $verbose; ++ my $post; ++ my $post_conf = $config->get_param('posts')->{$id}; ++ ++ if (!$post_conf) { ++ print STDERR "No such post $id, skipping\n"; ++ next; ++ } ++ eval { ++ $post = create_instance( ++ 'Youri::Submit::Post', ++ $post_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create post $id: $@\n"; ++ } else { ++ print "running post $id\n" if $verbose; ++ my @err = $post->run($repository, $target, $config->get_arg('define')); ++ print STDERR "Error $id: @err\n" if @err ++ } ++} ++ ++exit(1) if $group_error; + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmitproxyin">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,77 @@ ++#!/usr/bin/perl ++ ++=head1 NAME ++ ++youri-submit-proxy - proxy wrapper over youri-submit-restricted ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit-proxy [options] <target> <files> ++ ++=head1 DESCRIPTION ++ ++youri-submit-proxy is a proxy wrapper over youri-submit-restricted, intended to ++be used in collaborative work to change uid before calling it through sudo. ++ ++=head1 SEE ALSO ++ ++youri-submit-restricted(1), youri-submit(1) ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++use Fcntl ':mode'; ++use File::Basename; ++ ++my ($uid, $gid); ++if (-l $0) { ++ # this is a symlink, get uid and gid from it ++ ($uid, $gid) = (lstat($0))[4, 5]; ++} else { ++ ($uid, $gid) = (stat($0))[4, 5]; ++} ++my $user = getpwuid($uid) or die "unknown uid $uid"; ++my $prog = '@bindir@/youri-submit-restricted'; ++ ++my %dirs; ++my @options; ++foreach my $arg (@ARGV) { ++ if (-f $arg) { ++ # push parent dir in list ++ my $parent = dirname($arg); ++ $dirs{$parent}++; ++ } ++ push(@options, $arg); ++} ++ ++foreach my $dir (keys %dirs) { ++ # save original perms and gid ++ my ($orig_mode, $orig_gid) = (stat($dir))[2,5]; ++ $dirs{$dir} = { ++ mode => $orig_mode, ++ gid => $orig_gid ++ }; ++ # ensure correct perms and gid ++ chown -1, $gid, $dir; ++ chmod $orig_mode|S_IRGRP|S_IWGRP, $dir; ++} ++ ++# call wrapped program ++system('sudo', '-H', '-u', $user, $prog, @options); ++ ++foreach my $dir (keys %dirs) { ++ # restore original perms and gid ++ chown -1, $dirs{$dir}->{gid}, $dir; ++ chmod $dirs{$dir}->{mode}, $dir; ++} + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmitrestrictedin">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,64 @@ ++#!/usr/bin/perl -T ++ ++=head1 NAME ++ ++youri-submit-restricted - filtering wrapper over youri-submit ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit-restricted [options] <target> <files> ++ ++=head1 DESCRIPTION ++ ++youri-submit-restricted is just a filtering wrapper over youri-submit, intended ++to be used in collaborative work to sanitize environment and options before ++calling it. ++ ++=head1 SEE ALSO ++ ++youri-submit(1) ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++my $prog = '@bindir@/youri-submit'; ++my @prohibited_options = qw/--config --skip-check --skip-action/; ++my %prohibited_options = map { $_ => 1 } @prohibited_options; ++my @prohibited_envvars = qw/ ++ ENV BASH_ENV IFS CDPATH ++ PERLLIB PERL5LIB PERL5OPT PERLIO ++ PERLIO_DEBUG PERL5DB PERL_ENCODING ++ PERL_HASH_SEED PERL_SIGNALS PERL_UNICODE ++/; ++ ++my @options; ++while (my $arg = shift @ARGV) { ++ if ($prohibited_options{$arg}) { ++ # drop prohibited options ++ print STDERR "prohibited option $arg, skipping\n"; ++ shift @ARGV; ++ } else { ++ # untaint everything else ++ $arg =~ /(.*)/; ++ push(@options, $1); ++ } ++} ++ ++# secure ENV ++$ENV{PATH} = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"; ++delete $ENV{$_} foreach @prohibited_envvars; ++ ++# call wrapped program ++system($prog, @options); + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmitin">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,534 @@ ++#!/usr/bin/perl ++# $Id: youri-submit.in 232668 2007-12-21 14:37:04Z blino $ ++ ++=head1 NAME ++ ++youri-submit - package submission tool ++ ++=head1 VERSION ++ ++Version 2.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit [options] <target> <files> ++ ++youri-submit --list <category> [target] ++ ++youri-submit --help [category] [item] ++ ++Options: ++ ++ --config <file> use file <file> as config file ++ --skip-pre <pre> skip pre <pre> ++ --skip-check <check> skip check <check> ++ --skip-action <action> skip action <action> ++ --skip-post <post> skip post <post> ++ --skip-reject <reject> skip reject <reject> ++ --define <key>=<value> pass additional values ++ --clean delete package after success ++ --verbose verbose run ++ --test test run ++ --list <category> list items from given category ++ --help [category] display contextual help ++ ++=head1 DESCRIPTION ++ ++B<youri-submit> allows to submit packages to a repository. ++ ++All packages given on command lines are passed to a list of check plugins, ++depending on given upload target. If none of them fails, all packages are ++passed to a list of action plugins, depending also on given upload target. ++ ++=head1 OPTIONS ++ ++=over ++ ++=item B<--config> I<file> ++ ++Use given file as configuration, instead of normal one. ++ ++=item B<--skip-pre> I<id> ++ ++Skip pre transaction plugin with given identity ++ ++=item B<--skip-check> I<id> ++ ++Skip check plugin with given identity. ++ ++=item B<--skip-action> I<id> ++ ++Skip action plugin with given identity. ++ ++=item B<--skip-post> I<id> ++ ++Skip post transaction plugin with given identity. ++ ++=item B<--skip-reject> I<id> ++ ++Skip reject action plugin with given identity. ++ ++=item B<--define> <key>=<value> ++ ++Define additional parameters, to be used by plugins. ++ ++=item B<--clean> ++ ++Delete submited packages upon successfull submission. ++ ++=item B<--verbose> ++ ++Produce more verbose output (can be used more than once) ++ ++=item B<--test> ++ ++Don't perform any modification. ++ ++=item B<--list> I<category> ++ ++List available items from given category and exits. Category must be either ++B<targets>, B<actions> or B<checks>. A target is needed for the two last ones. ++ ++=item B<--help> I<category> ++ ++Display help for given category and exits. Category must be either ++B<repository>, B<action> or B<check>. An item is needed for the two last ones. ++If no category given, display standard help. ++ ++=back ++ ++=head1 CONFIGURATION ++ ++Configuration is read from the first file found among: ++ ++=over ++ ++=item * the one specified by B<--config> option on command-line ++ ++=item * $HOME/.youri/submit.conf ++ ++=item * /usr/local/etc/youri/submit.conf ++ ++=back ++ ++The configuration file should be a YAML-format files, with the following ++mandatory top-level directives: ++ ++=over ++ ++=item B<repository> ++ ++The definition of repository plugin to be used. ++ ++=item B<targets> ++ ++The list of available submission targets, each one being composed from the ++following keys: ++ ++=over ++ ++=item B<checks> ++ ++The list of check plugins to use for this target. ++ ++=item B<actions> ++ ++The list of action plugins to use for this target. ++ ++=back ++ ++=item B<checks> ++ ++The list of check plugin definitions, indexed by their identity. ++ ++=item B<actions> ++ ++The list of action plugin definitions, indexed by their identity. ++ ++=back ++ ++=head1 SEE ALSO ++ ++Youri::Config, for additional details about configuration file format. ++ ++Each used plugin man page, for available options. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++use Youri::Config; ++use Youri::Utils; ++use Pod::Usage; ++ ++my $config = Youri::Config->new( ++ args => { ++ 'skip-check' => '=s@', ++ 'skip-action' => '=s@', ++ 'define' => '=s%', ++ 'verbose' => '|v!', ++ 'clean' => '!', ++ 'test' => '|t!', ++ 'list' => '|l!', ++ 'config' => '=s', ++ 'skip-prei' => '=s@', ++ 'skip-post' => '=s@', ++ 'skip-reject' => '=s@', ++ }, ++ directories => [ "$ENV{HOME}/.youri", '@sysconfdir@/youri' ], ++ file => 'submit.conf', ++); ++ ++if ($config->get_arg('list')) { ++ my $category = $ARGV[0]; ++ pod2usage(-verbose => 0, -message => "No category specified, aborting\n") ++ unless $category; ++ if ($category eq 'targets') { ++ print join(' ', keys %{$config->get_param('targets')}); ++ } elsif ($category eq 'checks' || $category eq 'actions') { ++ my $target = $ARGV[1]; ++ pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless $target; ++ if ($category eq 'checks') { ++ my $checks = $config->get_param('targets')->{$target}->{checks}; ++ print join(' ', @{$checks}) if $checks; ++ } else { ++ my $actions = $config->get_param('targets')->{$target}->{actions}; ++ print join(' ', @{$actions}) if $actions; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ print "\n"; ++ exit 0; ++} ++ ++if ($config->get_arg('help')) { ++ my $category = $ARGV[0]; ++ my ($item, $section); ++ if ($category eq 'repository') { ++ $section = $config->get_param('repository'); ++ pod2usage( ++ -verbose => 0, ++ -message => "No repository defined, aborting\n" ++ ) unless $section; ++ } elsif ($category eq 'check' || $category eq 'action') { ++ $item = $ARGV[1]; ++ pod2usage( ++ -verbose => 0, ++ -message => "No item specified, aborting\n" ++ ) unless $item; ++ if ($category eq 'check') { ++ $section = $config->get_param('checks')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such check $item defined, aborting\n" ++ ) unless $section; ++ } else { ++ $section = $config->get_param('actions')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such action $item defined, aborting\n" ++ ) unless $section; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ my $file = $section->{class} . '.pm'; ++ $file =~ s/::/\//g; ++ pod2usage( ++ -verbose => 99, ++ -sections => 'NAME|DESCRIPTION', ++ -input => $file, ++ -pathlist => \@INC ++ ); ++} ++ ++ ++pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless @ARGV > 0; ++pod2usage(-verbose => 0, -message => "No packages specified, aborting\n") ++ unless @ARGV > 1 || $config->get_param('allow_omitting_packages'); ++ ++# convenient global flags ++my $test = $config->get_arg('test'); ++my $verbose = $config->get_arg('verbose'); ++ ++# check target ++my $target = shift @ARGV; ++my $target_conf = $config->get_param('targets')->{$target}; ++ ++# create repository ++my $repository; ++my $repository_conf = $config->get_param('repository'); ++die "No repository declared" unless $repository_conf; ++print "Creating repository\n" if $verbose; ++eval { ++ $repository = create_instance( ++ 'Youri::Repository', ++ $repository_conf, ++ { ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ targets => [ keys %{$config->get_param('targets')} ], ++ } ++ ); ++}; ++die "Failed to create repository: $@\n" if $@; ++ ++# perfrom pre action ++my @errors; ++my $pre_packages = []; ++my $skip_pres = $config->get_arg('skip-pre'); ++my %skip_pres = $skip_pres ? map { $_ => 1 } @{$skip_pres} : (); ++foreach my $id (@{$target_conf->{pres}}) { ++ next if $skip_pres{$id}; ++ print "Creating pre $id\n" if $verbose; ++ my $pre; ++ my $pre_conf = $config->get_param('pres')->{$id}; ++ ++ if (!$pre_conf) { ++ print STDERR "No such pre $id, skipping\n"; ++ next; ++ } ++ eval { ++ $pre = create_instance( ++ 'Youri::Submit::Pre', ++ $pre_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create pre $id: $@\n"; ++ } else { ++ print "running pre $id\n" if $verbose; ++ my @err = $pre->run( ++ $pre_packages, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@errors, @err) if $err[0]; ++ } ++} ++ ++if (@errors) { ++ print "Pre-submission errors, aborting:\n"; ++ foreach my $error (@errors) { ++ print " - $error\n"; ++ } ++ exit(1) ++} ++ ++# create packages group ++my $group_error; ++my @packages_group; ++foreach my $group ([ map { { section => "", file => $_ } } @ARGV ], @$pre_packages) { ++ my @packages; ++ foreach my $opt (@$group) { ++ print "Preparing upload for $opt->{file} in $opt->{section}\n" if $verbose; ++ $repository->{packages}{$opt->{file}}{section} = $opt->{section}; ++ push( ++ @packages, ++ create_instance( ++ 'Youri::Package', ++ { ++ class => $repository->get_package_class(), ++ }, ++ { ++ file => $opt->{file}, ++ %$opt ++ }, ++ ) ++ ); ++ } ++ @packages or next; ++ ++# check all packages pass all tests ++ my %errors; ++ my $skip_check = $config->get_arg('skip-check'); ++ my %skip_check = $skip_check ? map { $_ => 1 } @{$skip_check} : (); ++ my @error; ++ foreach my $id (@{$target_conf->{checks}}) { ++ next if $skip_check{$id}; ++ print "Creating check $id\n" if $verbose; ++ my $check; ++ my $check_conf = $config->get_param('checks')->{$id}; ++ ++ if (!$check_conf) { ++ print STDERR "No such check $id, skipping\n"; ++ next; ++ } ++ eval { ++ $check = create_instance( ++ 'Youri::Submit::Check', ++ $check_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create check $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running check $id on package $package\n" if $verbose; ++ my @errors = $check->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@{$errors{$package}}, @errors) if $errors[0]; ++ } ++ } ++ } ++ if (%errors) { ++ print "Submission errors, aborting:\n"; ++ foreach my $package (keys %errors) { ++ print "- $package:\n"; ++ foreach my $error (@{$errors{$package}}) { ++ print " - $error\n"; ++ } ++ } ++ # reject the packages ++ my $skip_rejects = $config->get_arg('skip-reject'); ++ my %skip_rejects = $skip_rejects ? map { $_ => 1 } @{$skip_rejects} : (); ++ foreach my $id (@{$target_conf->{rejects}}) { ++ next if $skip_rejects{$id}; ++ print "Creating reject $id\n" if $verbose; ++ my $reject; ++ my $reject_conf = $config->get_param('rejects')->{$id}; ++ ++ if (!$reject_conf) { ++ print STDERR "No such reject $id, skipping\n"; ++ next; ++ } ++ eval { ++ $reject = create_instance( ++ 'Youri::Submit::Reject', ++ $reject_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create reject $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running reject $id on package $package\n" if $verbose; ++ eval { ++ $reject->run($package, \%errors, $repository, $target, $config->get_arg('define')); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ $group_error = 1; ++ next ++ } ++ ++# proceed further ++ my $skip_action = $config->get_arg('skip-action'); ++ my %skip_action = $skip_action ? map { $_ => 1 } @{$skip_action} : (); ++ foreach my $id (@{$target_conf->{actions}}) { ++ next if $skip_action{$id}; ++ print "Creating action $id\n" if $verbose; ++ my $action; ++ my $action_conf = $config->get_param('actions')->{$id}; ++ ++ if (!$action_conf) { ++ print STDERR "No such action $id, skipping\n"; ++ next; ++ } ++ eval { ++ $action = create_instance( ++ 'Youri::Submit::Action', ++ $action_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create action $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running action $id on package $package\n" if $verbose; ++ eval { ++ $action->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ ++ if ($config->get_arg('clean')) { ++ foreach my $package (@packages) { ++ print "cleaning file $package\n" if $verbose; ++ unlink $package->as_file(); ++ } ++ } ++} ++ ++# perfrom post action ++my $skip_post = $config->get_arg('skip-post'); ++my %skip_post = $skip_post ? map { $_ => 1 } @{$skip_post} : (); ++foreach my $id (@{$target_conf->{posts}}) { ++ next if $skip_post{$id}; ++ print "Creating post $id\n" if $verbose; ++ my $post; ++ my $post_conf = $config->get_param('posts')->{$id}; ++ ++ if (!$post_conf) { ++ print STDERR "No such post $id, skipping\n"; ++ next; ++ } ++ eval { ++ $post = create_instance( ++ 'Youri::Submit::Post', ++ $post_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create post $id: $@\n"; ++ } else { ++ print "running post $id\n" if $verbose; ++ my @err = $post->run($repository, $target, $config->get_arg('define')); ++ print STDERR "Error $id: @err\n" if @err ++ } ++} ++ ++exit(1) if $group_error; + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit.in +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunketcbash_completiondyourisubmit">Added: build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit (rev 0) ++++ build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,60 @@ ++# youri-submit completion ++# $Id$ ++ ++_youri-submit() ++{ ++ ++ local cur prev config ++ ++ COMPREPLY=() ++ cur=${COMP_WORDS[COMP_CWORD]} ++ prev=${COMP_WORDS[COMP_CWORD-1]} ++ ++ case "$prev" in ++ --config) ++ _filedir ++ return 0 ++ ;; ++ --list) ++ COMPREPLY=( $( compgen -W 'targets checks actions' -- $cur ) ) ++ return 0 ++ ;; ++ --help) ++ COMPREPLY=( $( compgen -W 'repository check action' -- $cur ) ) ++ return 0 ++ ;; ++ esac ++ ++ if [[ "$cur" == -* ]]; then ++ COMPREPLY=( $( compgen -W '--define --clean -l --list -h --help -t \ ++ --test -v --verbose' -- $cur ) ) ++ # add dangereous option for main command ++ if [[ ${COMP_WORDS[0]} == youri-submit ]]; then ++ COMPREPLY=( $( compgen -W '${COMPREPLY[@]} --config --skip-check \ ++ --skip-action' -- $cur ) ) ++ fi ++ else ++ _count_args ++ case $args in ++ 1) ++ _find_config ++ COMPREPLY=( $( compgen -W '$( youri-submit $config --list targets )' -- $cur ) ) ++ ;; ++ *) ++ _filedir ++ ;; ++ esac ++ fi ++ ++} ++complete -F _youri-submit youri-submit youri-submit-restricted youri-submit-proxy ++ ++_find_config() ++{ ++ for (( i=1; i < COMP_CWORD; i++ )); do ++ if [[ "${COMP_WORDS[i]}" == --config ]]; then ++ config="--config ${COMP_WORDS[i+1]}" ++ break ++ fi ++ done ++} + +<a id="build_systemmdvyourisubmittrunketcsubmitconf">Added: build_system/mdv-youri-submit/trunk/etc/submit.conf</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/etc/submit.conf (rev 0) ++++ build_system/mdv-youri-submit/trunk/etc/submit.conf 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,134 @@ ++# youri-submit sample configuration file ++# $Id: submit.conf 1723 2006-10-17 13:53:27Z warly $ ++ ++# helper variables ++home: /home/user ++ ++# repository definition ++repository: ++ class: Youri::Repository::PLF ++ options: ++ install_root: ${home}/ftp/mandriva ++ version_root: ${home}/cvs ++ archive_root: ${home}/backup/mandriva ++ noarch: i586 ++ ++# targets definitions ++targets: ++ cooker: ++ checks: ++ - tag ++ - recency ++ - history ++ actions: ++ - sign ++ - install ++ - link ++ - archive ++ - clean ++ - bugzilla ++ - cvs ++ - mail ++ - rss ++ ++ 2006.0: ++ checks: ++ - type ++ - tag ++ - recency ++ - history ++ - precedence ++ actions: ++ - sign ++ - install ++ - link ++ - archive ++ - clean ++ ++# checks definitions ++checks: ++ tag: ++ class: Youri::Submit::Check::Tag ++ options: ++ tags: ++ release: 'plf$' ++ packager: '<\w+@zarb\.org>$' ++ distribution: '^Mandriva Linux$' ++ vendor: '^Penguin Liberation Front$' ++ ++ recency: ++ class: Youri::Submit::Check::Recency ++ ++ history: ++ class: Youri::Submit::Check::History ++ ++ precedence: ++ class: Youri::Submit::Check::Precedence ++ options: ++ target: cooker ++ ++ type: ++ class: Youri::Submit::Check::Type ++ type: binary ++ ++# actions definitions ++actions: ++ sign: ++ class: Youri::Submit::Action::Sign ++ options: ++ name: plf@zarb.org ++ path: ${home}/.gnupg ++ passphrase: s3kr3t ++ ++ install: ++ class: Youri::Submit::Action::Install ++ ++ link: ++ class: Youri::Submit::Action::Link ++ ++ archive: ++ class: Youri::Submit::Action::Archive ++ ++ clean: ++ class: Youri::Submit::Action::Clean ++ ++ mail: ++ class: Youri::Submit::Action::Mail ++ options: ++ mta: /usr/sbin/sendmail ++ to: plf-announce@zarb.org ++ reply_to: plf-discuss@zarb.org ++ from: plf@zarb.org ++ prefix: RPM ++ cc: ++ hot-base: david@dindinx.org bellamy@neverland.net ++ dcgui: mathen@ketelhot.de ++ dclib: mathen@ketelhot.de ++ Video-DVDRip: dvdrip-users@exit1.org ++ hackVideo-DVDRip: dvdrip-users@exit1.org ++ goosnes: tak@bard.sytes.net ++ avidemux: fixounet@free.fr ++ vobcopy: robos@muon.de ++ drip: drip-devel@lists.sourceforge.net ++ libdscaler: vektor@dumbterm.net ++ xawdecode: pingus77@ifrance.com ++ ++ rss: ++ class: Youri::Submit::Action::RSS ++ options: ++ file: ${home}/www/changelog.rss ++ title: PLF packages updates ++ link: http://plf.zarb.org/ ++ description: ChangeLog for PLF packages ++ ++ cvs: ++ class: Youri::Submit::Action::CVS ++ ++ bugzilla: ++ class: Youri::Submit::Action::Bugzilla ++ options: ++ host: localhost ++ base: plf_bugs ++ user: plf ++ pass: s3kr3t ++ contact: plf@zarb.org + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionArchivepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,90 @@ ++# $Id: Archive.pm 265457 2010-01-28 13:09:30Z pterjan $ ++package Youri::Submit::Action::Archive; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Archive - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # FIXME: workaround for $self->{_verbose} not being initialized properly ++ $self->{_verbose} = 1; ++ # all this should be in Mandriva_upload.pm ++ my $section = $repository->_get_section($package, $target, $define); ++ my $main_section = $repository->_get_main_section($package, $target, $define); ++ print "section $section main_section $main_section\n" if $self->{_verbose}; ++ my $arch = $package->get_arch(); ++ $arch = $self->{_noarch} if $arch eq 'noarch'; ++ my $path = $arch eq 'src' ? "$target/SRPMS" : "$target/$arch/media"; ++ $path = "$repository->{_install_root}/$path"; ++ $path =~ s,/+,/,g; ++ foreach my $replaced_package ( ++ $repository->get_replaced_packages($package, $target, $define) ++ ) { ++ my $file = $replaced_package->get_file(); ++ ++ # trap for debugging bug 34999 ++ if ($file =~ /\/[\d.]+\/(main\/updates|.*\/release)/) { ++ my $bugmsg = "BUG#34999 WARNING: trying to remove from a release: $file\n"; ++ open(BUG34999LOG, '>>', "/home/mandrake/bug34999.log"); ++ print $bugmsg; ++ print BUG34999LOG localtime().": ".$bugmsg; ++ close BUG34999LOG; ++ ++ next; ++ } ++ ++ my ($rep_section, $rep_main_section) = $file =~ m,$path/(([^/]+)/.*)/[^/]+.rpm,; ++ # We do accept duplicate version for other submedia of the same main media section ++ print "(path '$path') file '$file' section '$rep_section' main_section '$rep_main_section'\n" if $self->{_verbose}; ++ next if $rep_main_section eq $main_section && $rep_section ne $section; ++ my $dest = $repository->get_archive_dir($package, $target, $define); ++ ++ print "archiving file $file to $dest\n" if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest") ++ unless -d $dest; ++ ++ # install file to new location ++ system("install -m $self->{_perms} $file $dest"); ++ ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionBugzillapm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,81 @@ ++# $Id: Bugzilla.pm 1700 2006-10-16 12:57:42Z warly $ ++package Youri::Submit::Action::Bugzilla; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Bugzilla - Bugzilla synchronisation ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures synchronisation with Bugzilla. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Bugzilla; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ host => '', ++ base => '', ++ user => '', ++ pass => '', ++ contact => '', ++ @_ ++ ); ++ ++ $self->{_bugzilla} = Youri::Bugzilla->new( ++ $options{host}, ++ $options{base}, ++ $options{user}, ++ $options{pass} ++ ); ++ $self->{_contact} = $options{contact}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $summary = $package->get_summary(); ++ my $packager = $package->get_packager(); ++ $packager =~ s/.*<(.*)>/$1/; ++ ++ if ($self->{_bugzilla}->has_package($name)) { ++ my %versions = ++ map { $_ => 1 } ++ $self->{_bugzilla}->get_versions($name); ++ unless ($versions{$version}) { ++ print "adding version $version to bugzilla\n" if $self->{_verbose}; ++ $self->{_bugzilla}->add_version($name, $version) ++ unless $self->{_test}; ++ } ++ } else { ++ print "adding package $name to bugzilla\n" if $self->{_verbose}; ++ $self->{_bugzilla}->add_package( ++ $name, ++ $summary, ++ $version, ++ $packager, ++ $self->{_contact} ++ ) unless $self->{_test}; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionCVSpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,135 @@ ++# $Id: CVS.pm 224115 2007-07-02 09:17:15Z pixel $ ++package Youri::Submit::Action::CVS; ++ ++=head1 NAME ++ ++Youri::Submit::Action::CVS - CVS versionning ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures CVS versionning of package sources. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Cwd; ++use File::Temp qw/tempdir/; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ exclude => '\.(tar(\.(gz|bz2))?|zip)$', ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_exclude} = $options{exclude}; ++ $self->{_perms} = $options{perms}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ ++ my $root = $repository->get_version_root(); ++ my $path = $repository->get_version_path($package, $target, $define); ++ ++ # remember original directory ++ my $original_dir = cwd(); ++ ++ # get a safe temporary directory ++ my $dir = tempdir( CLEANUP => 1 ); ++ chdir $dir; ++ ++ # first checkout base directory only ++ system("cvs -Q -d $root co -l $path"); ++ ++ # try to checkout package directory ++ my $dest = $path . '/' . $name; ++ system("cvs -Q -d $root co $dest"); ++ ++ # create directory if previous import failed ++ unless (-d $dest) { ++ print "adding directory $dest\n" if $self->{_verbose}; ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest"); ++ system("cvs -Q -d $root add $dest"); ++ } ++ ++ chdir $dest; ++ ++ # remove all files ++ unlink grep { -f } glob '*'; ++ ++ # extract all rpm files locally ++ $package->extract(); ++ ++ # remove excluded files ++ if ($self->{_exclude}) { ++ unlink grep { -f && /$self->{_exclude}/ } glob '*'; ++ } ++ ++ # uncompress all compressed files ++ system("bunzip2 *.bz2 2>/dev/null"); ++ system("gunzip *.gz 2>/dev/null"); ++ ++ my (@to_remove, @to_add, @to_add_binary); ++ foreach my $line (`cvs -nq update`) { ++ if ($line =~ /^\? (\S+)/) { ++ if (-B $1) { ++ push(@to_add_binary, $1); ++ } else { ++ push(@to_add, $1); ++ } ++ } ++ if ($line =~ /^U (\S+)/) { ++ push(@to_remove, $1); ++ } ++ } ++ if (@to_remove) { ++ my $to_remove = join(' ', @to_remove); ++ print "removing file(s) $to_remove\n" if $self->{_verbose}; ++ system("cvs -Q remove $to_remove"); ++ } ++ if (@to_add) { ++ my $to_add = join(' ', @to_add); ++ print "adding text file(s) $to_add\n" if $self->{_verbose}; ++ system("cvs -Q add $to_add"); ++ } ++ if (@to_add_binary) { ++ my $to_add_binary = join(' ', @to_add_binary); ++ print "adding binary file(s) $to_add_binary\n" if $self->{_verbose}; ++ system("cvs -Q add -kb $to_add_binary"); ++ } ++ ++ print "committing current directory\n" if $self->{_verbose}; ++ system("cvs -Q commit -m $version-$release") unless $self->{_test}; ++ ++ # tag new release ++ my $tag = "r$version-$release"; ++ $tag =~ s/\./_/g; ++ print "tagging current directory as $tag\n" if $self->{_verbose}; ++ system("cvs -Q tag $tag") unless $self->{_test}; ++ ++ # get back to original directory ++ chdir $original_dir; ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionCleanpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,40 @@ ++# $Id: Clean.pm 4742 2007-01-30 09:49:58Z pixel $ ++package Youri::Submit::Action::Clean; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Clean - Old revisions cleanup ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures cleanup of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ foreach my $replaced_package ( ++ $repository->get_replaced_packages($package, $target, $define) ++ ) { ++ my $file = $replaced_package->as_file(); ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionDkmsModuleInfopm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,111 @@ ++# $Id$ ++package Youri::Submit::Action::DkmsModuleInfo; ++ ++=head1 NAME ++ ++Youri::Submit::Action::DkmsModuleInfo - extract and commit info from dkms package. ++ ++=head1 DESCRIPTION ++ ++This action plugin extract modalias and description from dkms packages and commit them ++on a SVN module. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++use File::Temp qw/tempdir/; ++use File::Basename; ++use SVN::Client; ++ ++#- inlineed from MDK::Common::Various ++sub chomp_ { my @l = @_; chomp @l; wantarray() ? @l : $l[0] } ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ croak "undefined svn module" unless $options{svn_module}; ++ ++ foreach my $var ('svn_module') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my ($dkms_name) = $package->get_canonical_name =~ /^dkms-(.*)$/ or return; ++ my $package_name = $package->get_name; ++ my ($kver) = $package_name =~ /^$dkms_name-kernel-(.*)$/ or return; ++ ++ my @files = map { $_->[0] } $package->get_files; ++ my @module_files = grep { m!^(/lib/modules/|/var/lib/dkms-binary/).*\.ko(\.gz)?$! } @files ++ or return; ++ ++ print "Submit::Action::DkmsModuleInfo: proceeding with $package_name\n" if $self->{_verbose}; ++ ++ my $tempdir = tempdir(CLEANUP => 1); ++ my $file = $package->as_file; ++ my $cmd = "rpm2cpio $file | (cd $tempdir ; cpio --quiet -id)"; ++ print "Submit::Action::DkmsModuleInfo: doing $cmd\n" if $self->{_verbose}; ++ if (system($cmd) != 0) { ++ print "Submit::Action::DkmsModuleInfo: failed!\n" if $self->{_verbose}; ++ return; ++ } ++ ++ my @fields = qw(description alias); ++ ++ my (%modules); ++ foreach my $file (@module_files) { ++ print "Submit::Action::DkmsModuleInfo: extracting $file\n" if $self->{_verbose}; ++ my $module = $file; ++ $module =~ s!.*/!!; ++ $module =~ s!\.ko(\.gz)$!!; ++ $modules{$module}{$_} = [ chomp_(`/sbin/modinfo -F $_ $tempdir$file`) ] ++ foreach @fields; ++ } ++ ++ eval { ++ my $svn = SVN::Client->new(); ++ my $dir = $tempdir . '/' . basename($self->{_svn_module}); ++ my $revision = $svn->checkout($self->{_svn_module}, $dir, 'HEAD', 0); ++ my $vdir = $dir . '/' . $kver; ++ $svn->update($vdir, 'HEAD', 0); ++ -d $vdir or $svn->mkdir($vdir); ++ foreach my $module (keys %modules) { ++ print "Submit::Action::DkmsModuleInfo: adding module $module\n" if $self->{_verbose}; ++ foreach my $field (@fields) { ++ my $file = "$vdir/$module.$field"; ++ $svn->update($file, 'HEAD', 0); ++ my $exists = -f $file; ++ open(my $fh, ">", $file); ++ print $fh map { "$_\n" } @{$modules{$module}{$field}}; ++ $svn->add($file, 1) if !$exists; ++ } ++ } ++ ++ $svn->log_msg(sub { $_[0] = \"add dkms info for $dkms_name with kernel $kver" }); ++ $svn->commit($vdir, 0); ++ }; ++ if (my $error = $@) { ++ print "Submit::Action::DkmsModuleInfo: commit to svn failed ($error)!\n" if $self->{_verbose}; ++ return; ++ } ++ ++ 1; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionInstallpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,74 @@ ++# $Id: Install.pm 229772 2007-09-26 11:21:07Z blino $ ++package Youri::Submit::Action::Install; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Install - Package installation ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures installation of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->as_file(); ++ my $rpm = $package->get_file_name(); ++ my $dest = $repository->get_install_dir($package, $target, $define); ++ ++ # FIXME remove prefix this should be done by a function ++ $rpm =~ s/^\d{14}\.\w*\.\w+\.\d+_//; ++ $rpm =~ s/^\@\d+://; ++ print "installing file $file to $dest/$rpm\n" if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ if (! -d $dest) { ++ my $status = ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest"); ++ croak "Unable to create directory $dest: $?" if $status; ++ } ++ ++ # install file to new location ++ my $status = ++ system("install -m $self->{_perms} $file $dest/$rpm"); ++ croak "Unable to install file $file to $dest/$rpm: $?" if $status; ++ ++ my $arch = $package->get_arch(); ++ $repository->set_arch_changed($target, $arch); ++ $repository->set_install_dir_changed($dest); ++ } ++ $package->{_file} = "$dest/$rpm"; ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionLinkpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,80 @@ ++# $Id: Link.pm 233641 2008-01-31 16:35:55Z pixel $ ++package Youri::Submit::Action::Link; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Link - Noarch packages linking ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures linking of noarch packages between arch-specific ++directories. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Cwd; ++use File::Spec; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ symbolic => 0, # use symbolic linking ++ @_ ++ ); ++ ++ $self->{_symbolic} = $options{symbolic}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # only needed for noarch packages ++ return unless $package->get_arch() eq 'noarch'; ++ ++ my $default_dir = $repository->get_install_dir($package, $target, $define); ++ my $file = $package->get_file_name(); ++ ++ # FIXME remove prefix this should be done by a function ++ $file =~ s/^\d{14}\.\w*\.\w+\.\d+_//; ++ $file =~ s/^\@\d+://; ++ ++ foreach my $arch ($repository->get_extra_arches()) { ++ # compute installation target, forcing arch ++ my $other_dir = $repository->get_install_dir( ++ $package, ++ $target, ++ $define, ++ { arch => $arch } ++ ); ++ ++ if (! $self->{_test}) { ++ my $current_dir = cwd(); ++ chdir $other_dir; ++ my $default_file = File::Spec->abs2rel($default_dir) . '/' . $file; ++ if ($self->{_symbolic}) { ++ symlink $default_file, $file; ++ } else { ++ link $default_file, $file; ++ } ++ chdir $current_dir; ++ print "set_install_dir_changed($other_dir) for updated $file\n"; ++ $repository->set_install_dir_changed($other_dir); ++ $repository->set_arch_changed($target, $arch); ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionMailpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,131 @@ ++# $Id: Mail.pm 223952 2007-06-23 13:54:13Z pixel $ ++package Youri::Submit::Action::Mail; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Mail - Mail notification ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures mail notification of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use MIME::Entity; ++use Encode qw/from_to/; ++use Carp; ++use Youri::Package; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ mta => '/usr/sbin/sendmail', ++ to => '', ++ from => '', ++ cc => '', ++ prefix => '', ++ encoding => 'quoted-printable', ++ charset => 'iso-8859-1', ++ @_ ++ ); ++ ++ croak "undefined mail MTA" unless $options{mta}; ++ croak "invalid mail MTA $options{mta}" unless -x $options{mta}; ++ croak "undefined to" unless $options{to}; ++ if ($options{cc}) { ++ croak "cc should be an hashref" unless ref $options{cc} eq 'HASH'; ++ } ++ croak "invalid charset $options{charset}" ++ unless Encode::resolve_alias($options{charset}); ++ ++ $self->{_mta} = $options{mta}; ++ $self->{_to} = $options{to}; ++ $self->{_from} = $options{from}; ++ $self->{_cc} = $options{cc}; ++ $self->{_prefix} = $options{prefix}; ++ $self->{_encoding} = $options{encoding}; ++ $self->{_charset} = $options{charset}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $from = $package->get_packager(); ++ ++ # force from adress if defined ++ $from =~ s/<.*>/<$self->{_from}>/ if $self->{_from}; ++ ++ my $subject = $self->get_subject($package, $repository, $target, $define); ++ my $content = $self->get_content($package, $repository, $target, $define); ++ ++ # ensure proper codeset conversion ++ # for informations coming from package ++ my $charset = $repository->get_package_charset(); ++ from_to($content, $charset, $self->{_charset}); ++ from_to($subject, $charset, $self->{_charset}); ++ ++ my $mail = MIME::Entity->build( ++ Type => 'text/plain', ++ Charset => $self->{_charset}, ++ Encoding => $self->{_encoding}, ++ From => $from, ++ To => $self->{_to}, ++ Subject => $subject, ++ Data => $content, ++ ); ++ ++ if ($self->{_cc}) { ++ my $cc = $self->{_cc}->{$package->get_name()}; ++ $mail->head()->add('cc', $cc) if $cc; ++ } ++ ++ if ($self->{_test}) { ++ $mail->print(\*STDOUT); ++ } else { ++ open(MAIL, "| $self->{_mta} -t -oi -oem") or die "Can't open MTA program: $!"; ++ $mail->print(\*MAIL); ++ close MAIL; ++ } ++ ++} ++ ++sub get_subject { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $section = $repository->_get_section($package, $target, $define); ++ return ++ ($self->{_prefix} ? '[' . $self->{_prefix} . '] ' : '' ) . ++ "$target " . ($section ? "$section " : '' ) . ++ $package->as_formated_string('%{name}-%{version}-%{release}'); ++} ++ ++sub get_content { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $information = $package->get_information(); ++ my $last_change = $package->get_last_change(); ++ ++ return ++ $information . "\n" . ++ $last_change->[Youri::Package::CHANGE_AUTHOR] . ":\n" . ++ $last_change->[Youri::Package::CHANGE_TEXT]; ++} ++ ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionMarkreleasepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,56 @@ ++# $Id: Markrelease.pm 4743 2007-01-30 09:58:30Z pixel $ ++package Youri::Submit::Action::Markrelease; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Markrelease - calls markrelease ++ ++=head1 DESCRIPTION ++ ++This action plugin calls markrelease ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $package->is_source or return 1; ++ my $file = $package->get_file(); ++ my $srpm_name = $package->get_canonical_name; ++ ++ if ($repository->package_in_svn($srpm_name)) { ++ my $svn = $repository->get_svn_url(); ++ my ($rev) = $file =~ /.*\/.*?\@(\d+):/; ++ print "Run repsys markrelease -f $file -r $rev $svn/$srpm_name\n"; ++ # FIXME repsys ask for a username and password ++ # FIXME we should use the key in /var/home/mandrake so that /home/mandrake does not ++ # need to be mounted ++ system('repsys', 'markrelease', '-f', $file, '-r', $rev, "$svn/$srpm_name"); ++ } ++ 1 ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionRSSpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,102 @@ ++# $Id: RSS.pm 1700 2006-10-16 12:57:42Z warly $ ++package Youri::Submit::Action::RSS; ++ ++=head1 NAME ++ ++Youri::Submit::Action::RSS - RSS notification ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures RSS notification of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use XML::RSS; ++use Encode qw/from_to/; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ file => '', ++ title => '', ++ link => '', ++ description => '', ++ charset => 'iso-8859-1', ++ max_items => 10, ++ @_ ++ ); ++ ++ croak "undefined rss file" unless $options{file}; ++ croak "invalid charset $options{charset}" ++ unless Encode::resolve_alias($options{charset}); ++ ++ $self->{_file} = $options{file}; ++ $self->{_title} = $options{title}; ++ $self->{_link} = $options{link}; ++ $self->{_description} = $options{description}; ++ $self->{_charset} = $options{charset}; ++ $self->{_max_items} = $options{max_items}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $subject = $package->as_formated_string('%{name}-%{version}-%{release}'); ++ my $content = $package->get_information(); ++ ++ $content =~ s/$/<br\/>/mg; ++ ++ # ensure proper codeset conversion ++ # for informations coming from package ++ my $charset = $repository->get_package_charset(); ++ from_to($content, $charset, $self->{_charset}); ++ from_to($subject, $charset, $self->{_charset}); ++ ++ my $rss = XML::RSS->new( ++ encoding => $self->{_charset}, ++ encode_output => 1 ++ ); ++ ++ my $file = $self->{_file}; ++ if (-e $file) { ++ $rss->parsefile($file); ++ splice(@{$rss->{items}}, $self->{_max_items}) ++ if @{$rss->{items}} >= $self->{_max_items}; ++ } else { ++ $rss->channel( ++ title => $self->{_title}, ++ link => $self->{_link}, ++ description => $self->{_description}, ++ language => 'en' ++ ); ++ } ++ ++ $rss->add_item( ++ title => $subject, ++ description => $content, ++ mode => 'insert' ++ ); ++ ++ if ($self->{_test}) { ++ print $rss->as_string(); ++ } else { ++ $rss->save($file); ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionRpminfopm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,69 @@ ++# $Id: Rpminfo.pm 4742 2007-01-30 09:49:58Z pixel $ ++package Youri::Submit::Action::Rpminfo; ++ ++=head1 NAME ++ ++Youri::Submit::Action::RpmInfo - Creates .info files ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures the creation of .info files ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ uphost => '', ++ user => '', ++ ssh_key => '', ++ verbose => '', ++ @_ ++ ); ++ croak "undefined upload host" unless $options{uphost}; ++ croak "undefined ssh key" unless $options{ssh_key}; ++ ++ foreach my $var ('perms', 'user', 'uphost', 'ssh_key', 'verbose') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $dest = $repository->get_upload_dir($package, $target, $define); ++ ++ print "Caching rpm information $file on $dest\n" if $self->{_verbose}; ++ my $base = basename ($file); ++ $dest =~ s/\/[0-9]{14}\./\/*./; ++ ++ my $cmd = "ssh -i $self->{_ssh_key} $self->{_user}\@$self->{_uphost} \"srpm=`echo /$dest$base`; rpm -q --qf '\%{name}\n\%{epoch}\n\%{version}-\%{release}\n\%{summary}\n' -p \\\$srpm > \\\$srpm.info\""; ++ print "Submit::Action::RpmInfo: doing $cmd\n" if $self->{_verbose}; ++ if (!$self->{_test}) { ++ if (!system($cmd)) { ++ print "Submit::Action::RpmInfo: rpminfo succeeded!\n"; ++ return 1 ++ } ++ print "Submit::Action::RpmInfo: rpminfo failed!\n"; ++ } ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionSendpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,77 @@ ++# $Id: Send.pm 4744 2007-01-30 09:59:07Z pixel $ ++package Youri::Submit::Action::Send; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Send - upload package ++ ++=head1 DESCRIPTION ++ ++This action plugin uploads the package on uphost ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ uphost => '', ++ user => '', ++ ssh_key => '', ++ verbose => '', ++ keep_svn_release => '', ++ @_ ++ ); ++ croak "undefined upload host" unless $options{uphost}; ++ croak "undefined ssh key" unless $options{ssh_key}; ++ ++ foreach my $var ('perms', 'user', 'uphost', 'ssh_key', 'verbose', 'keep_svn_release') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $dest = $repository->get_upload_dir($package, $target, $define); ++ ++ print "Sending file $file to $dest\n" if $self->{_verbose}; ++ my $base; ++ if ($self->{_keep_svn_release}) { ++ $base = basename($file) ++ } else { ++ ($base) = $file =~ /.*\/(?:@\d+:)?([^\/]*)/ ++ } ++ ++ my $cmd = "scp -i $self->{_ssh_key} $file $self->{_user}\@$self->{_uphost}:/$dest$base.new"; ++ my $cmd2 = "ssh -i $self->{_ssh_key} $self->{_user}\@$self->{_uphost} \"mv /$dest$base.new /$dest$base\""; ++ print "Submit::Action::Send: doing $cmd\n$cmd2\n" if 1 || $self->{_verbose}; ++ if (!$self->{_test}) { ++ if (!system($cmd)) { ++ if (!system($cmd2)) { ++ print "Submit::Action::Send: upload succeeded!\n"; ++ return 1 ++ } ++ } ++ print "Submit::Action::Send: upload failed!\n"; ++ } ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionSendcachepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,81 @@ ++# $Id: Sendcache.pm 232350 2007-12-07 18:26:17Z spuk $ ++package Youri::Submit::Action::Sendcache; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Sendcache - upload package to cache ++ ++=head1 DESCRIPTION ++ ++This action plugin uploads the package on uphost ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ uphost => '', ++ user => '', ++ ssh_key => '', ++ verbose => '', ++ root => '', ++ debug_pkgs => 0, ++ @_ ++ ); ++ croak "undefined upload host" unless $options{uphost}; ++ croak "undefined ssh key" unless $options{ssh_key}; ++ ++ foreach my $var ('perms', 'user', 'uphost', 'ssh_key', 'verbose', 'root', 'debug_pkgs') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # only cache debug packages if option debug_pkgs is true ++ return if ($package->is_debug() && !$self->{_debug_pkgs}); ++ ++ my $file = $package->get_file(); ++ my $dest = $repository->get_upload_dir($package, $target, $define); ++ $dest =~ s!$repository->{_upload_root}/$repository->{_queue}!$self->{_root}!; ++ ++ print "Sending file $file to $dest\n" if $self->{_verbose}; ++ my $destfile = "$dest".basename($file); ++ $destfile =~ s,/[^/_]+_([^/]+)$,/$1,; ++ $destfile =~ s,/@\d+:,/,; ++ my $destfilehidden = $destfile; ++ $destfilehidden =~ s,/([^/]+)$,/.$1,; ++ ++ my $cmd = "scp -i $self->{_ssh_key} $file $self->{_user}\@$self->{_uphost}:/$destfilehidden"; ++ my $cmd2 = "ssh -i $self->{_ssh_key} $self->{_user}\@$self->{_uphost} \"mv /$destfilehidden /$destfile\""; ++ print "Submit::Action::Send: doing $cmd\n$cmd2\n" if 1 || $self->{_verbose}; ++ if (!$self->{_test}) { ++ if (!system($cmd)) { ++ if (!system($cmd2)) { ++ print "Submit::Action::Sendcache: upload succeeded!\n"; ++ return 1 ++ } ++ } ++ print "Submit::Action::Sendcache: upload failed!\n"; ++ } ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionSignpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,56 @@ ++# $Id: Sign.pm 1700 2006-10-16 12:57:42Z warly $ ++package Youri::Submit::Action::Sign; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Sign - GPG signature ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures GPG signature of packages. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ name => '', ++ path => $ENV{HOME} . '/.gnupg', ++ passphrase => '', ++ @_ ++ ); ++ ++ croak "undefined name" unless $options{name}; ++ croak "undefined path" unless $options{path}; ++ croak "invalid path $options{path}" unless -d $options{path}; ++ ++ $self->{_name} = $options{name}; ++ $self->{_path} = $options{path}; ++ $self->{_passphrase} = $options{passphrase}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $package->sign( ++ $self->{_name}, ++ $self->{_path}, ++ $self->{_passphrase} ++ ) unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionUnpackpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,82 @@ ++# $Id: Unpack.pm 115370 2007-01-30 09:59:07Z pixel $ ++package Youri::Submit::Action::Unpack; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Unpack - unpack package files ++ ++=head1 DESCRIPTION ++ ++This action plugin unpack package files somewhere. ++When unpack_inside_distribution_root is set, dest_directory is relative to the distribution root. ++When the package is a noarch, the wanted files are unpacked in distribution root of each archs. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Temp qw/tempdir/; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ croak "undefined package name" unless $options{name}; ++ croak "undefined source sub directory" unless $options{source_subdir}; ++ croak "undefined destination directory" unless $options{dest_directory}; ++ ++ foreach my $var ('name', 'dest_directory', 'source_subdir', 'grep_files', 'unpack_inside_distribution_root') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $package->get_name eq $self->{_name} or return; ++ ++ my @dests = $self->{_unpack_inside_distribution_root} ? ++ (map { "$_/$self->{_dest_directory}" } $repository->get_distribution_roots($package, $target)) ++ : $self->{_dest_directory}; ++ my $file = $package->as_file; ++ print "Unpacking rpm $file$self->{_source_subdir} to @dests\n" if $self->{_verbose}; ++ ++ my $tempdir = tempdir(CLEANUP => 1); ++ ++ my $cmd = "rpm2cpio $file | (cd $tempdir ; cpio -id)"; ++ print "Submit::Action::Unpack: doing $cmd\n" if $self->{_verbose}; ++ if (!$self->{_test} && system($cmd) != 0) { ++ print "Submit::Action::Unpack: failed!\n" if $self->{_verbose}; ++ return; ++ } ++ ++ foreach my $dest (@dests) { ++ my $find_grep = $self->{_grep_files} ? "find | grep '$self->{_grep_files}'" : 'find'; ++ my $cmd = "cd $tempdir/$self->{_source_subdir}; $find_grep | cpio -pdu $dest"; ++ print "Submit::Action::Unpack: doing $cmd\n" if $self->{_verbose}; ++ if (!$self->{_test}) { ++ my @l = glob("$tempdir/$self->{_source_subdir}"); ++ if (@l == 1 && -d $l[0]) { ++ if (system($cmd) != 0) { ++ print "Submit::Action::Unpack: failed!\n" if $self->{_verbose}; ++ } ++ } else { ++ print "Submit::Action::Unpack: directory $self->{_source_subdir} doesn't exist in package $self->{_name}\n"; ++ } ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionUpdateMdvDbpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,62 @@ ++# $Id$ ++package Youri::Submit::Action::UpdateMdvDb; ++ ++=head1 NAME ++ ++Youri::Submit::Action::UpdateMdvDb - Mandriva maintainers database updater ++ ++=head1 DESCRIPTION ++ ++This action plugin calls an external script to update last commit info, as ++well as add new packages, in the package maintainers database at ++<http://maint.mandriva.com/>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++ ++ # path for mdvdb-updaterep script ++ $self->{_mdvdb_updaterep} = $options{mdvdb_updaterep}; ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # only SRPMs matter ++ return unless $package->is_source(); ++ ++ unless ($self->{_test}) { ++ my $pkg_name = $package->get_name(); ++ my $pkg_media = $repository->_get_main_section($package, $target, $define); ++ $package->get_packager() =~ m/(\w[-_.\w]+\@[-_.\w]+)\W/; ++ my $pkg_commiter = $1; ++ ++ if (system($self->{_mdvdb_updaterep}, "update", $pkg_name, $pkg_media, $pkg_commiter, "youri")) { ++ print "ERROR: ".$self->{_mdvdb_updaterep}." failed for '$pkg_name', '$pkg_media', '$pkg_commiter'.\n"; ++ } else { ++ print "Updated package maintainers DB for '$pkg_name', '$pkg_media', '$pkg_commiter'.\n" if $self->{_verbose}; ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2007, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Base.pm 631 2006-01-26 22:22:23Z guillomovitch $ ++package Youri::Submit::Action; ++ ++=head1 NAME ++ ++Youri::Submit::Action - Abstract action plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines action plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckACLpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,71 @@ ++# $Id: ACL.pm 4817 2007-02-09 19:39:05Z blino $ ++package Youri::Submit::Check::ACL; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++my $acl; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ acl_file => '', ++ @_ ++ ); ++ $acl = get_acl($options{acl_file}); ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $file = $package->get_full_name(); ++ my $arch = $package->get_arch(); ++ my $srpm = $package->get_canonical_name; ++ my $section = $repository->_get_section($package, $target, $define); ++ my $user = $define->{user}; ++ foreach my $t (keys %$acl) { ++ next if $target !~ /$t/; ++ foreach my $acl (@{$acl->{$t}}) { ++ my ($a, $media, $r, $users) = @$acl; ++ next if $arch !~ $a || $srpm !~ $r || $section !~ $media; ++ if ($user =~ /$users/) { ++ return ++ } else { ++ return "$user is not authorized to upload packages belonging to $srpm in section $section (authorized persons: " . join(', ', split '\|', $users) . ")"; ++ } ++ } ++ } ++ return ++} ++ ++sub get_acl { ++ my ($file) = @_; ++ my %acl; ++ open my $f, $file; ++ while (<$f>) { ++ my ($dis, $arch, $media, $regexp, $users) = split ' '; ++ push @{$acl{$dis}}, [ $arch , $media, $regexp, $users ] ++ } ++ \%acl ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckHistorypm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,61 @@ ++# $Id: History.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::History; ++ ++=head1 NAME ++ ++Youri::Submit::Check::History - Non-linear history check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose history does not include last ++available revision one. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Package; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $last_revision = ++ $repository->get_last_older_revision($package, $target, $define); ++ ++ if ($last_revision) { ++ # skip the test if last revision has been produced from another source package, as it occurs during package split/merges ++ return ++ if $last_revision->get_canonical_name() ++ ne $package->get_canonical_name(); ++ ++ my ($last_revision_number) = $last_revision->get_last_change()->[Youri::Package::CHANGE_AUTHOR] =~ /(\S+)\s*$/; ++ my %entries = ++ map { $_ => 1 } ++ map { /(\S+)\s*$/ } ++ map { $_->[Youri::Package::CHANGE_AUTHOR] } ++ $package->get_changes(); ++ unless ($entries{$last_revision_number}) { ++ push( ++ @errors, ++ "Last changelog entry $last_revision_number from last revision " . $last_revision->get_full_name() . " missing from current changelog" ++ ); ++ } ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckHostpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,63 @@ ++# $Id: Host.pm 230850 2007-10-04 20:07:25Z blino $ ++package Youri::Submit::Check::Host; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++my $host; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ host_file => '', ++ @_ ++ ); ++ $host = get_host($options{host_file}) ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $file = $package->get_file; ++ my $arch = $package->get_arch; ++ my $buildhost = $package->as_formated_string('%{buildhost}'); ++ foreach my $h (keys %$host) { ++ next if $buildhost !~ $h; ++ if ($arch =~ $host->{$h}) { ++ return ++ } ++ } ++ "Packages build on host $buildhost are not authorized for arch $arch"; ++} ++ ++sub get_host { ++ my ($file) = @_; ++ my %host; ++ open my $f, $file; ++ while (<$f>) { ++ my ($host, $arch) = split ' '; ++ $host{$host} = $arch ++ } ++ \%host ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckPrecedencepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,58 @@ ++# $Id: Precedence.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::Precedence; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Precedence - Release check against another check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose an older revision already exists for ++another upload target. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ _target => undef, # mandatory targets ++ @_ ++ ); ++ ++ die "undefined target" unless $options{target}; ++ ++ $self->{_target} = $options{target}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my @older_revisions = ++ $repository->get_older_revisions($package, $self->{_target}, $define); ++ if (@older_revisions) { ++ push( ++ @errors, ++ "Older revisions still exists for $self->{_target}: " . join(', ', @older_revisions) ++ ); ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckQueue_recencypm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,40 @@ ++# $Id: Queue_recency.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::Queue_recency; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Recency - Release check against current target ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose a current or newer revision already ++exists for current upload target. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @newer_revisions = ++ $repository->get_upload_newer_revisions($package, $target, $define); ++ if (@newer_revisions) { ++ return "Newer revisions already exists for $target in upload queue: " . join(', ', @newer_revisions); ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckRecencypm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,64 @@ ++# $Id: Recency.pm 224793 2007-07-08 02:44:48Z spuk $ ++package Youri::Submit::Check::Recency; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Recency - Release check against current target ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose a current or newer revision already ++exists for current upload target. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my @revisions = $repository->get_revisions($package, $target, $define, undef, sub { return $_[0]->compare($package) >= 0 }); ++ if (@revisions) { ++ my $section = $repository->_get_section($package, $target, $define); ++ push( ++ @errors, ++ "Current or newer revision(s) already exists in $section for $target: " . ++ join(', ', @revisions) ++ ); ++ } ++ ++ my $defined_section = $define->{section}; ++ ++ # if the user provided a section, check also in the default section ++ if ($defined_section) { ++ $define->{section} = undef; ++ my @default_revisions = $repository->get_revisions($package, $target, $define, undef, sub { return $_[0]->compare($package) >= 0 }); ++ if (@default_revisions) { ++ my $section = $repository->_get_section($package, $target, $define); ++ push( ++ @errors, ++ "Current or newer revision(s) already exists in $section for $target: " . ++ join(', ', @default_revisions) ++ ); ++ } ++ $define->{section} = $defined_section; ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckRpmlintpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,90 @@ ++# $Id: Rpmlint.pm 234384 2008-02-12 09:42:32Z blino $ ++package Youri::Submit::Check::Rpmlint; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Rpmlint - Rpmlint-based check ++ ++=head1 DESCRIPTION ++ ++This check plugin wraps rpmlint, and reject packages triggering results ++declared as fatal. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Submit::Check::Rpmlint object. ++ ++Specific parameters: ++ ++=over ++ ++=item results $results ++ ++List of rpmlint result id considered as fatal. ++ ++=item path $path ++ ++Path to the rpmlint executable (default: /usr/bin/rpmlint) ++ ++=item config $config ++ ++Specific rpmlint configuration. ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ results => undef, ++ path => '/usr/bin/rpmlint', ++ config => '', ++ @_ ++ ); ++ ++ croak "no results to check" unless $options{results}; ++ croak "fatal should be an arrayref" unless ref $options{results} eq 'ARRAY'; ++ ++ $self->{_config} = $options{config}; ++ $self->{_path} = $options{path}; ++ $self->{_pattern} = '^(?:' . join('|', @{$options{results}}) . ')$'; ++} ++ ++sub run { ++ my ($self, $package, $_repository, $_target, $_define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $command = "$self->{_path} -f $self->{_config} " . $package->as_file; ++ open(my $RPMLINT, "$command |") or die "Can't run $command: $!"; ++ while (my $line = <$RPMLINT>) { ++ $line =~ /^[EW]: \S+ (\S+)(.*)$/ # old rpmlint format ++ || $line =~ /^\S+: [EW]: (\S+)(.*)$/ or next; # new rpmlint format ++ my ($id, $value) = ($1, $2); ++ if ($id =~ /$self->{_pattern}/o) { ++ push(@errors, "$id$value"); ++ } ++ } ++ ++ return @errors; ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under ++the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckSVNpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,79 @@ ++# $Id: SVN.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::SVN; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ svn => '', ++ @_ ++ ); ++ $self->{_svn} = $options{svn}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $section = $repository->_get_section($package, $target, $define); ++ if ($section =~ /\/(testing|backport)$/) { ++ # FIXME, right now ignore packages in SVN for testing and backports ++ # we need to find a clean way to handle them ++ return ++ } ++ ++ $package->is_source or return; ++ my $file = $package->get_file_name; ++ my $srpm_name = $package->get_canonical_name; ++ if ($repository->package_in_svn($srpm_name)) { ++ if ($file !~ /(^|\/|$define->{prefix}_)@\d+:\Q$srpm_name/) { ++ return "package $srpm_name is in the SVN, the uploaded SRPM must look like @<svn rev>:$srpm_name-<version>-<release>.src.rpm (created with getsrpm-mdk $srpm_name)"; ++ } else { ++ print "Package $file is correct\n"; ++ } ++ } ++ return ++} ++ ++sub simple_prompt { ++ my $cred = shift; ++ my $realm = shift; ++ my $default_username = shift; ++ my $may_save = shift; ++ my $pool = shift; ++ ++ print "Enter authentication info for realm: $realm\n"; ++ print "Username: "; ++ my $username = <>; ++ chomp($username); ++ $cred->username($username); ++ print "Password: "; ++ my $password = <>; ++ chomp($password); ++ $cred->password($password); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckSectionpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,58 @@ ++# $Id: Precedence.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::Section; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Section - Check if package was submitted to the right section ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages which were submitted to a section ++different than the one where an older version already exists. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $submitted_main_section = $repository->_get_main_section($package, $target, $define); ++ ++ # undefine section, so that Repository::_get_section() of Mandriva_upload.pm ++ # finds the section from existing packages ++ my $defined_section = $define->{section}; ++ undef $define->{section}; ++ ++ my $old_main_section = $repository->_get_main_section($package, $target, $define); ++ my @older_revisions = $repository->get_older_revisions($package, $target, $define); ++ ++ # restore defined section ++ $define->{section} = $defined_section; ++ ++ if (@older_revisions && $submitted_main_section ne $old_main_section) { ++ push( ++ @errors, ++ "Section should be $old_main_section, not $submitted_main_section." ++ ); ++ } ++ ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2007, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckSourcepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,45 @@ ++# $Id: Source.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::Source; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $file = $package->as_file(); ++ if (!$package->is_source()) { ++ return "Package $file is not a source rpm"; ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckTagpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,61 @@ ++# $Id: Tag.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::Tag; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ tags => undef, # expected tag values ++ @_ ++ ); ++ ++ croak "no tags to check" unless $options{tags}; ++ croak "tag should be an hashref" unless ref $options{tags} eq 'HASH'; ++ ++ $self->{_tags} = $options{tags}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ foreach my $tag (keys %{$self->{_tags}}) { ++ my $value = $package->get_tag($tag); ++ if ($value !~ /$self->{_tags}->{$tag}/) { ++ push( ++ @errors, ++ "invalid value $value for tag $tag" ++ ); ++ } ++ } ++ ++ return @errors; ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckTypepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,54 @@ ++# $Id: Type.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::Type; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Type - Type check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect type. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ type => undef, # expected type ++ @_ ++ ); ++ ++ croak "no type to check" unless $options{type}; ++ croak "invalid type value" unless $options{type} =~ /^(?:source|binary)$/; ++ ++ $self->{_type} = $options{type}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $type = $package->get_type(); ++ if ($type ne $self->{_type}) { ++ push(@errors, "invalid type $type"); ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckVersionpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,102 @@ ++# $Id: Version.pm 267050 2010-03-23 17:36:49Z nvigier $ ++package Youri::Submit::Check::Version; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Version - Check if older version already exist in cooker (used in freeze period) ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects new version of packages if they are not mentioned as authorized ++in the configuration file or in a non frozen section. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use URPM; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++ ++ foreach my $target (keys %options) { ++ $self->{$target} = $options{$target} ++ } ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $opt = $self->{$target}; ++ return if $opt->{mode} eq 'normal'; ++ my $section = $repository->_get_section($package, $target, $define); ++ my $name = $package->get_canonical_name; ++ return if $name =~ /$opt->{authorized_packages}/; ++ my $arch = $repository->get_arch($package, $target, $define); ++ return if $arch =~ /$opt->{authorized_arches}/; ++ if ($opt->{mode} eq 'version_freeze') { ++ return if $section =~ /$opt->{authorized_sections}/; ++ my $user = $define->{user}; ++ return if $user =~ /^($opt->{authorized_users})$/; ++ my ($package_version) = $package =~ /-([^-]+)-[^-]+\.src$/; ++ $define->{arch} = 'src'; ++ my @revisions = $repository->get_revisions($package, $target, $define, undef, ++ sub { ++ my ($version) = $_[0] =~ /-([^-]+)-[^-]+\.src$/; ++ URPM::ranges_overlap("== $version", "< $package_version") ++ } ++ ); ++ $define->{arch} = ''; ++ if (@revisions) { ++ return "FREEZE, package @revisions of different versions exist in $target\n"; ++ } ++ } ++ # FIXME: The following code is not working and must be reviewed. ++ elsif ($opt->{mode} eq 'freeze') { ++ my $user = $define->{user}; ++ return if (defined($opt->{authorized_users}) && $user =~ /^($opt->{authorized_users})$/); ++ # XXX: So freeze mode really only check for this exceptions? ++ if ($section !~ /$opt->{authorized_sections}/) { ++ return "FREEZE: repository $target section $section is frozen, you can still submit your packages in testing\nTo do so use your.devel --define section=<section> $target <package 1> <package 2> ... <package n>"; ++ } ++ } else { ++ # FIXME: Calls to get_source_package seems invalid nowadays. ++ # This results on $source having a null content. ++ my $source = $package->get_source_package; ++ my ($package_version) = $source =~ /-([^-]+)-[^-]+\.src\.rpm$/; ++ $define->{arch} = 'src'; ++ # FIXME: get_revisions now expects the filter as the 5th element, and not the 4th. ++ my @revisions = $repository->get_revisions($package, $target, $define, ++ sub { ++ # FIXME: Calls to get_source_package seems invalid nowadays. ++ # This results on $source_package having a null content. ++ my $source_package = $_[0]->get_source_package; ++ my ($version) = $source_package =~ /-([^-]+)-[^-]+\.src\.rpm$/; ++ print STDERR "Found version $version\n"; ++ URPM::ranges_overlap("== $version", "< $package_version") ++ } ++ ); ++ $define->{arch} = ''; ++ if (@revisions) { ++ return "FREEZE, package @revisions of different versions exist in $target\n"; ++ } ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, YOURI project ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Base.pm 631 2006-01-26 22:22:23Z guillomovitch $ ++package Youri::Submit::Check; ++ ++=head1 NAME ++ ++Youri::Submit::Check - Abstract check plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines check plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPluginpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,93 @@ ++# $Id: Plugin.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Plugin; ++ ++=head1 NAME ++ ++Youri::Submit::Plugin - Abstract youri-submit plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines youri-submit plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Submit::Plugin object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns plugin identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 run($package, $repository, $target, $define) ++ ++Execute action on given L<Youri::Package> object. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item run ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostCleanRpmsratepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,53 @@ ++# $Id: CleanRpmsrate.pm 115367 2007-01-30 09:47:04Z pixel $ ++package Youri::Submit::Post::CleanRpmsrate; ++ ++=head1 NAME ++ ++Youri::Submit::Post::CleanRpmsrate - calls clean-rpmsrate ++ ++=head1 DESCRIPTION ++ ++Calls clean-rpmsrate ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Post/; ++ ++#- inlined from MDK::Common::DataStructure ++sub uniq { my %l; $l{$_} = 1 foreach @_; grep { delete $l{$_} } @_ } ++ ++sub _init { ++} ++ ++sub run { ++ my ($self, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $root = $repository->get_install_root(); ++ my @changed = @{$repository->get_arch_changed($target)}; ++ if (grep { $_ eq 'i586' } @changed) { ++ # x86_64 uses i586 pkgs, so rpmsrate need to be rebuild ++ @changed = uniq(@changed, 'x86_64'); ++ } ++ foreach my $arch (@changed) { ++ my $rpmsrate = "$root/$target/$arch/media/media_info/rpmsrate"; ++ my @media = "$root/$target/$arch/media/main/release"; ++ system("cp", "$rpmsrate-raw", "$rpmsrate-new"); ++ system("clean-rpmsrate", "$rpmsrate-new", @media); ++ system("mv", "-f", "$rpmsrate-new", $rpmsrate); ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2007, Mandriva <blino@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostGendistribpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,66 @@ ++# $Id: Gendistrib.pm 115367 2007-01-30 09:47:04Z pixel $ ++package Youri::Submit::Post::Gendistrib; ++ ++=head1 NAME ++ ++Youri::Submit::Post::Gendistrib - calls gendistrib ++ ++=head1 DESCRIPTION ++ ++Calls gendistrib ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Post/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ user => '', ++ host => '', ++ source => '', ++ destination => '', ++ @_ ++ ); ++ ++ foreach my $var ('tmpdir', 'command') { ++ $self->{"_$var"} = $options{$var}; ++ } ++} ++ ++sub run { ++ my ($self, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $root = $repository->get_install_root(); ++ (undef, undef, my $hour) = gmtime(time); ++ # during the night, use complete hdlist rebuild ++ my $fast = '--fast'; ++ $fast = ''; # blino: don't use fast for now, it might be broken ++ if ($hour > 22 && $hour < 5) { ++ if ($hour < 4) { ++ $fast = '--blind' ++ } else { ++ $fast = '' ++ } ++ } ++ foreach my $arch (@{$repository->get_arch_changed($target)}) { ++ my $cmd = "TMPDIR=$self->{_tmpdir}/$target/$arch time $self->{_command} --nochkdep --nobadrpm $fast --noclean $root/$target/$arch"; ++ print "$cmd\n"; ++ system($cmd); ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, Mandriva <warly@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostGenhdlist2pm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,82 @@ ++# $Id: Gendistrib.pm 115367 2007-01-30 09:47:04Z pixel $ ++package Youri::Submit::Post::Genhdlist2; ++ ++=head1 NAME ++ ++Youri::Submit::Post::Genhdlist2 - calls genhdlist2 ++ ++=head1 DESCRIPTION ++ ++Calls genhdlist2 ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Post/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ user => '', ++ host => '', ++ source => '', ++ destination => '', ++ @_ ++ ); ++ ++ foreach my $var ('command') { ++ $self->{"_$var"} = $options{$var}; ++ } ++} ++ ++sub run { ++ my ($self, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $root = $repository->get_install_root(); ++ my @changed = @{$repository->get_install_dir_changed($target)}; ++ if (!@changed) { ++ print "nothing to do\n"; ++ return; ++ } ++ foreach my $dir (@changed) { ++ my $file_deps = "$dir/../../media_info/file-deps"; ++ my $file_deps_option = -e $file_deps ? "--file-deps $file_deps" : ''; ++ my $cmd = "time $self->{_command} -v --versioned --allow-empty-media $file_deps_option $dir"; ++ print "$cmd\n"; ++ system($cmd) == 0 or print "ERROR: $cmd failed\n"; ++ } ++ ++ # need to redo global MD5SUM. This MD5SUM is mostly obsolete, but is still needed up to 2007.1 ++ # (and even on cooker for existing urpmi.cfg) ++ foreach my $arch (@{$repository->get_arch_changed($target)}) { ++ my $dir = "$root/$target/$arch/media/media_info"; ++ my $cmd = "cd $dir ; time md5sum hdlist_* synthesis.*"; ++ print "$cmd\n"; ++ my $m = `$cmd`; ++ open my $f, '>', "$dir/MD5SUM" or die "Can't write $dir/MD5SUM: $!\n"; ++ print $f $m; ++ ++ { ++ require MDV::Distribconf::Build; ++ my $distrib = MDV::Distribconf::Build->new("$root/$target/$arch"); ++ $distrib->loadtree or die "$root/$target/$arch does not seem to be a distribution tree\n"; ++ $distrib->parse_mediacfg; ++ $distrib->write_version($distrib->getfullpath(undef, "VERSION")); ++ print "updated $root/$target/$arch/VERSION\n"; ++ } ++ } ++ return; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, Mandriva <warly@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Post.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Post; ++ ++=head1 NAME ++ ++Youri::Submit::Post - Abstract post plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines post plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPreRsyncpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,87 @@ ++# $Id: Rsync.pm 267280 2010-04-01 19:57:53Z bogdano $ ++package Youri::Submit::Pre::Rsync; ++ ++=head1 NAME ++ ++Youri::Submit::Pre::Rsync - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Pre/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ user => '', ++ host => '', ++ source => '', ++ destination => '', ++ @_ ++ ); ++ ++ foreach my $var ('user', 'host', 'source', 'destination') { ++ $self->{"_$var"} = $options{$var}; ++ } ++} ++ ++sub run { ++ my ($self, $pre_packages, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ if (system("rsync --exclude '*.new' --exclude '.*' --remove-sent-files -avlPHe 'ssh -xc arcfour' $self->{_user}\@$self->{_host}:$self->{_source}/$target/ $self->{_destination}/$target/")) { ++ $self->{_error} = "Rsync command failed ($!)"; ++ return ++ } ++ my $queue = "$self->{_destination}/$target"; ++ $self->{_error} = "Reading queue directory failed"; ++ # now get the packages downloaded ++ my %packages; ++ opendir my $queuedh, "$self->{_destination}/$target/" or return "Could not open $self->{_destination}/$target"; ++ opendir my $targetdh, $queue or return "Could not open $queue"; ++ my $idx; ++ foreach my $media (readdir $targetdh) { ++ $media =~ /^\.{1,2}$/ and next; ++ print "$target - $media\n"; ++ if (-d "$queue/$media") { ++ opendir my $submediadh, "$queue/$media" or return "Could not open $queue/$media"; ++ foreach my $submedia (readdir $submediadh) { ++ $submedia =~ /^\.{1,2}$/ and next; ++ print "$target - $media - $submedia\n"; ++ opendir my $rpmdh, "$queue/$media/$submedia" or return "Could not open $queue/$media/$submedia"; ++ foreach my $rpm (readdir $rpmdh) { ++ $rpm =~ /^\.{1,2}$/ and next; ++ print "$target - $media - $submedia : $rpm\n"; ++ my $file = "$queue/$media/$submedia/$rpm"; ++ $file =~ s/\/+/\//g; ++ if ($rpm =~ /^(\d{14}\.\w+\.\w+\.\d+)_.*\.rpm$/) { ++ push @{$packages{$1}{rpms}}, { section => "$media/$submedia", file => $file }; ++ } elsif ($rpm =~ /\.rpm$/) { ++ $idx++; ++ push @{$packages{"independant_$idx"}{rpms}}, { section => "$media/$submedia", file => $file } ++ } ++ } ++ } ++ } ++ } ++ foreach my $key (keys %packages) { ++ push @$pre_packages, $packages{$key}{rpms} ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, Mandriva <warly@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPrepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Pre.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Pre; ++ ++=head1 NAME ++ ++Youri::Submit::Pre - Abstract pre plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines pre plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectArchivepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,61 @@ ++# $Id: Archive.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Reject::Install; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Archive - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Reject/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $rpm = $package->get_file_name(); ++ my $dest = $repository->get_reject_dir($package, $target, $define); ++ ++ # FIXME remove prefix this should be done by a function ++ $rpm =~ s/^\d{14}\.\w+\.\w+\.\d+_//; ++ print "installing file $file to $dest/$rpm\n" ;#if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest/") ++ unless -d $dest; ++ ++ # install file to new location ++ system("install -m $self->{_perms} $file $dest/$rpm"); ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectCleanpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,36 @@ ++# $Id: Clean.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Reject::Clean; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Clean - Old revisions cleanup ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures cleanup of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Reject/; ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1 + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectInstallpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,63 @@ ++# $Id: Install.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Reject::Install; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Archive - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Reject/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++ $self->{_verbose} = $options{verbose}; ++} ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $rpm = $package->get_file_name(); ++ my $dest = $repository->get_reject_path($package, $target, $define); ++ ++ # FIXME remove prefix this should be done by a function ++ $rpm =~ s/^\d{14}\.\w+\.\w+\.\d+_//; ++ print "installing file $file to $dest/$rpm\n" if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest/") ++ unless -d $dest; ++ ++ # install file to new location ++ system("install -m $self->{_perms} $file $dest/$rpm"); ++ } ++ $package->{_file} = "$dest/$rpm"; ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectMailpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,112 @@ ++# $Id: Mail.pm 223952 2007-06-23 13:54:13Z pixel $ ++package Youri::Submit::Reject::Mail; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Mail - Mail notification ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures mail notification of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use MIME::Entity; ++use Encode qw/from_to/; ++use Carp; ++use Youri::Package; ++use base qw/Youri::Submit::Reject/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ mta => '/usr/sbin/sendmail', ++ to => '', ++ from => '', ++ cc => '', ++ prefix => '', ++ encoding => 'quoted-printable', ++ charset => 'iso-8859-1', ++ @_ ++ ); ++ ++ croak "undefined mail MTA" unless $options{mta}; ++ croak "invalid mail MTA $options{mta}" unless -x $options{mta}; ++ croak "undefined to" unless $options{to}; ++ if ($options{cc}) { ++ croak "cc should be an hashref" unless ref $options{cc} eq 'HASH'; ++ } ++ croak "invalid charset $options{charset}" ++ unless Encode::resolve_alias($options{charset}); ++ ++ $self->{_mta} = $options{mta}; ++ $self->{_to} = $options{to}; ++ $self->{_from} = $options{from}; ++ $self->{_cc} = $options{cc}; ++ $self->{_prefix} = $options{prefix}; ++ $self->{_encoding} = $options{encoding}; ++ $self->{_charset} = $options{charset}; ++} ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $section = $repository->_get_section($package, $target, $define); ++ ++ my $subject = ++ ($self->{_prefix} ? '[' . $self->{_prefix} . '] ' : '' ) . ($section ? "$section " : '') . ++ $package->get_revision_name(); ++ my $information = $package->get_information(); ++ my $last_change = $package->get_last_change(); ++ my $author = $last_change->[Youri::Package::CHANGE_AUTHOR] if $last_change; ++ my $list = $last_change->[Youri::Package::CHANGE_TEXT] if $last_change; ++ my $content = ++ "Errors: \n\n" . join("\n", map { ++ ( "* $_", (map { " - $_" } @{$errors->{$_}}), "\n"); ++ } sort(keys %$errors)) . "\n" . ++ $information . "\n" . ++ $author . ":\n$list"; ++ ++ # ensure proper codeset conversion ++ # for informations coming from package ++ my $charset = $repository->get_package_charset(); ++ from_to($content, $charset, $self->{_charset}); ++ from_to($subject, $charset, $self->{_charset}); ++ ++ my $mail = MIME::Entity->build( ++ Type => 'text/plain', ++ Charset => $self->{_charset}, ++ Encoding => $self->{_encoding}, ++ From => $self->{_from}, ++ To => $self->{_to}, ++ Subject => $subject, ++ Data => $content, ++ ); ++ ++ if ($self->{_cc}) { ++ my $cc = $self->{_cc}->{$package->get_name()}; ++ $mail->head()->add('cc', $cc) if $cc; ++ } ++ ++ if ($self->{_test}) { ++ $mail->print(\*STDOUT); ++ } else { ++ open(MAIL, "| $self->{_mta} -t -oi -oem") or die "Can't open MTA program: $!"; ++ $mail->print(\*MAIL); ++ close MAIL; ++ } ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Reject.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Reject; ++ ++=head1 NAME ++ ++Youri::Submit::Reject - Abstract reject plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines reject plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunkt00distributiont">Added: build_system/mdv-youri-submit/trunk/t/00distribution.t</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/t/00distribution.t (rev 0) ++++ build_system/mdv-youri-submit/trunk/t/00distribution.t 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,15 @@ ++#!/usr/bin/perl ++# $Id: 00distribution.t 1723 2006-10-17 13:53:27Z warly $ ++ ++use Test::More; ++ ++BEGIN { ++ eval { ++ require Test::Distribution; ++ }; ++ if($@) { ++ plan skip_all => 'Test::Distribution not installed'; ++ } else { ++ import Test::Distribution only => [ qw/use pod description/ ]; ++ } ++} + + +Property changes on: build_system/mdv-youri-submit/trunk/t/00distribution.t +___________________________________________________________________ +Added: svn:executable + + * + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/2b91b15e/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/2b91b15e/attachment.html new file mode 100644 index 000000000..ca22eaf1b --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/2b91b15e/attachment.html @@ -0,0 +1,6045 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[209] add mandriva version of youri-submit, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/submit/trunk at revision 271600</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>209</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 14:19:06 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add mandriva version of youri-submit, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/submit/trunk at revision 271600</pre> + +<h3>Added Paths</h3> +<ul> +<li>build_system/mdv-youri-submit/</li> +<li>build_system/mdv-youri-submit/branches/</li> +<li>build_system/mdv-youri-submit/tags/</li> +<li>build_system/mdv-youri-submit/trunk/</li> +<li><a href="#build_systemmdvyourisubmittrunkChangeLog">build_system/mdv-youri-submit/trunk/ChangeLog</a></li> +<li><a href="#build_systemmdvyourisubmittrunkMANIFESTSKIP">build_system/mdv-youri-submit/trunk/MANIFEST.SKIP</a></li> +<li><a href="#build_systemmdvyourisubmittrunkMakefilePL">build_system/mdv-youri-submit/trunk/Makefile.PL</a></li> +<li><a href="#build_systemmdvyourisubmittrunkREADME">build_system/mdv-youri-submit/trunk/README</a></li> +<li><a href="#build_systemmdvyourisubmittrunkTODO">build_system/mdv-youri-submit/trunk/TODO</a></li> +<li>build_system/mdv-youri-submit/trunk/bin/</li> +<li><a href="#build_systemmdvyourisubmittrunkbinyouricheckin">build_system/mdv-youri-submit/trunk/bin/youri-check.in</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmit">build_system/mdv-youri-submit/trunk/bin/youri-submit</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmitproxyin">build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmitrestrictedin">build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in</a></li> +<li><a href="#build_systemmdvyourisubmittrunkbinyourisubmitin">build_system/mdv-youri-submit/trunk/bin/youri-submit.in</a></li> +<li>build_system/mdv-youri-submit/trunk/etc/</li> +<li>build_system/mdv-youri-submit/trunk/etc/bash_completion.d/</li> +<li><a href="#build_systemmdvyourisubmittrunketcbash_completiondyourisubmit">build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit</a></li> +<li><a href="#build_systemmdvyourisubmittrunketcsubmitconf">build_system/mdv-youri-submit/trunk/etc/submit.conf</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/</li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/</li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/</li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionArchivepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionBugzillapm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionCVSpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionCleanpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionDkmsModuleInfopm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionInstallpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionLinkpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionMailpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionMarkreleasepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionRSSpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionRpminfopm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionSendpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionSendcachepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionSignpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionUnpackpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionUpdateMdvDbpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitActionpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckACLpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckHistorypm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckHostpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckPrecedencepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckQueue_recencypm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckRecencypm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckRpmlintpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckSVNpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckSectionpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckSourcepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckTagpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckTypepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckVersionpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitCheckpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPluginpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostCleanRpmsratepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostGendistribpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostGenhdlist2pm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPostpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPreRsyncpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitPrepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/</li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectArchivepm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectCleanpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectInstallpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectMailpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm</a></li> +<li><a href="#build_systemmdvyourisubmittrunklibYouriSubmitRejectpm">build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm</a></li> +<li>build_system/mdv-youri-submit/trunk/t/</li> +<li><a href="#build_systemmdvyourisubmittrunkt00distributiont">build_system/mdv-youri-submit/trunk/t/00distribution.t</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemmdvyourisubmittrunkChangeLog">Added: build_system/mdv-youri-submit/trunk/ChangeLog</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/ChangeLog (rev 0) ++++ build_system/mdv-youri-submit/trunk/ChangeLog 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,606 @@ ++2008-02-19 07:50 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: fix "grep_files" handling ++ ++2008-02-12 09:42 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: do not make rpmlint errors ++ fatal anymore (asked by fcrozat) ++ ++2008-02-08 17:49 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: remove results occurences and ++ update doc ++ ++2008-02-08 17:48 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: make all rpmlint errors fatal ++ ++2008-02-08 17:44 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: removed unneeded parentheses ++ ++2008-02-08 17:44 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: make clear ++ repository/target/define are unused ++ ++2008-02-08 17:43 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: use scalar for fd ++ ++2008-01-31 16:35 pixel ++ ++ * lib/Youri/Submit/Action/Link.pm: also call ->set_arch_changed ++ when linking a noarch file to another arch ++ (this still doesn't explain media/media_info/MD5SUM not being ++ remade, but it ++ can help...) ++ ++2007-12-21 14:37 blino ++ ++ * bin/youri-submit.in: merge youri-submit into youri-submit.in ++ ++2007-12-19 13:43 blino ++ ++ * lib/Youri/Submit/Action/Archive.pm: only log main/updates ++ modifications, not contrib/updates or non-free/updates which are ++ legal ++ ++2007-12-19 13:37 blino ++ ++ * lib/Youri/Submit/Action/Archive.pm: add spuk's debug code for bug ++ 34999 ++ ++2007-12-17 19:45 blino ++ ++ * bin/youri-submit: add an "allow_omitting_packages" global option, ++ to be able to run youri even if no packages are specified on the ++ command line (useful if packages are fetched in pre action) ++ ++2007-12-17 19:34 blino ++ ++ * bin/youri-submit: improve error messages for pres/posts actions ++ (patch from raoh's copy, probably from warly) ++ ++2007-12-17 19:33 blino ++ ++ * bin/youri-submit: fix typo about posts actions (patch from raoh's ++ copy, probably from warly) ++ ++2007-12-13 15:01 pixel ++ ++ * lib/Youri/Submit/Check/Version.pm: - empty {authorized_users} ++ doesn't imply every one is allowed to bypass freeze check! ++ - {authorized_users} should be checked more strictly ++ ++2007-12-07 18:26 spuk ++ ++ * lib/Youri/Submit/Action/Sendcache.pm: - make Sendcache send debug ++ packages only if explicitly told to, to save space ++ ++2007-11-30 19:29 spuk ++ ++ * lib/Youri/Submit/Action/UpdateMdvDb.pm: Youri action to update ++ the Mandriva maintainers database. ++ ++2007-10-04 20:07 blino ++ ++ * lib/Youri/Submit/Check/Host.pm: make host reject message more ++ explicit by print arch (useful when VMware-player for x86_64 ++ actually uses i386 as rpm arch...) ++ ++2007-09-26 11:21 blino ++ ++ * lib/Youri/Submit/Action/Install.pm: improve log message ++ ++2007-09-26 11:19 blino ++ ++ * lib/Youri/Submit/Action/Install.pm: fix installed filename (oops) ++ ++2007-09-26 09:58 blino ++ ++ * lib/Youri/Submit/Action/Install.pm: throw exception on failure, ++ not to delete files that can be copied because of lack of space ++ (upstream commit 1398) ++ ++2007-09-25 10:49 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: allow to unpack only some ++ files (for release-notes.txt in mandriva-release-common) ++ ++2007-09-22 13:11 blino ++ ++ * lib/Youri/Submit/Check/Version.pm: allow authorized users to ++ upload everything even during full freeze ++ ++2007-08-31 12:51 pixel ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: handle new rpmlint format ++ (not useful at the moment since we still use old rpmlint, but may ++ be useful in ++ the future) ++ ++2007-08-31 10:03 blino ++ ++ * lib/Youri/Submit/Action/DkmsModuleInfo.pm: adapt to new ++ SOURCEPACKAGE value in prebuilt dkms kernel ++ ++2007-08-29 13:21 blino ++ ++ * lib/Youri/Submit/Action/DkmsModuleInfo.pm: initial ++ Youri::Submit::Action::DkmsModuleInfo module ++ ++2007-08-07 12:50 pixel ++ ++ * lib/Youri/Submit/Action/Link.pm: we need the same workaround as ++ done in Action::Install ++ ++2007-07-16 09:27 blino ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: remove unused variable ++ ++2007-07-08 02:44 spuk ++ ++ * lib/Youri/Submit/Check/Recency.pm: - check for newer/current ++ revisions in default section when submitted to another section ++ (bug #30635) ++ ++2007-07-02 09:17 pixel ++ ++ * lib/Youri/Submit/Action/CVS.pm: drop mdv specific stuff (mdv ++ doesn't use this action anymore) ++ ++2007-06-28 07:40 pixel ++ ++ * lib/Youri/Submit/Action/Link.pm: do update hdlist for every arch ++ after linking noarch packages (#31638) ++ ++2007-06-28 07:37 pixel ++ ++ * lib/Youri/Submit/Action/Install.pm: simplify ($arch is not used ++ by ->set_install_dir_changed) ++ ++2007-06-23 13:54 pixel ++ ++ * lib/Youri/Submit/Action/Mail.pm, lib/Youri/Submit/Reject/Mail.pm: ++ keep raw changelogs to avoid changing the format (backport) ++ ++2007-06-23 08:10 spuk ++ ++ * lib/Youri/Submit/Check/Recency.pm: - check for newer and same ++ existing revisions in a single pass ++ - use proper get_revisions() instead of get_install_file() hack, ++ as the ++ latter will use the current file name, and thus will fail to ++ check for an ++ existing package revision when submitting, because submitted ++ SRPMs have a ++ different name ("@rev:foobar-...") than what goes into the ++ repository ++ ++2007-06-22 13:51 pixel ++ ++ * lib/Youri/Submit/Post/CleanRpmsrate.pm: ensure we don't do ++ anything if nothing changed ++ ++2007-06-22 13:41 pixel ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: more atomic generation of ++ MD5SUM ++ ++2007-06-22 13:35 pixel ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: - need to redo global ++ MD5SUM. This MD5SUM is mostly obsolete, but is still needed up to ++ 2007.1 ++ (and needed even on cooker for existing urpmi.cfg) ++ - don't use --blind. hopefully not needed ++ ++2007-06-22 06:45 pixel ++ ++ * lib/Youri/Submit/Post/Genhdlist2.pm: call genhdlist2 with (new) ++ option --allow-empty-media ++ ++2007-06-21 10:13 blino ++ ++ * lib/Youri/Submit/Post/CleanRpmsrate.pm: uniquify arch list ++ ++2007-06-21 08:16 pixel ++ ++ * lib/Youri/Submit/Action/Install.pm, ++ lib/Youri/Submit/Post/Genhdlist2.pm: new action Genhdlist2 ++ ++2007-06-14 18:23 mrl ++ ++ * lib/Youri/Submit/Action/Sendcache.pm: - As this action is unique, ++ avoid too much flexibility and simplify the code. ++ - Use . for hidding temporary files instead of .new suffix. ++ ++2007-06-13 18:36 mrl ++ ++ * lib/Youri/Submit/Action/Sendcache.pm: - Adapted for working with ++ iurt cache. ++ ++2007-06-13 01:48 spuk ++ ++ * lib/Youri/Submit/Action/Link.pm: no such 'cd' function, 'chdir' ++ it is... ++ ++2007-05-08 06:22 spuk ++ ++ * lib/Youri/Submit/Reject/Mail.pm: fixing the Big SVN Breakage: ++ reverting last commit, restoring state as of latest working ++ checkout in ken ++ ++2007-05-08 06:06 spuk ++ ++ * lib/Youri/Submit/Post/Gendistrib.pm: fixing the Big SVN Breakage: ++ restoring state as of working checkout in ken ++ ++2007-05-08 06:00 spuk ++ ++ * lib/Youri/Submit/Action/Scp.pm: fixing the Big SVN Breakage: ++ Scp.pm was changed into Send.pm ++ ++2007-05-05 06:16 spuk ++ ++ * lib/Youri/Submit/Check/Section.pm: Check if package submission ++ was for the correct section. ++ ++2007-03-24 11:36 spuk ++ ++ * lib/Youri/Submit/Action/Archive.pm: - moved hack for verbosity to ++ start of code, with a remark ++ - removed double $path from debug string ++ ++2007-03-15 12:36 mrl ++ ++ * lib/Youri/Submit/Check/Version.pm: - Fixed version_freeze mode: ++ do not allow any upload with a different version ++ from what is already present on the repository. ++ - Added an ACL control for maintainers allowed to bypass this ++ restriction as option ++ authorized_users. ++ ++2007-03-15 12:32 mrl ++ ++ * lib/Youri/Submit/Check/Version.pm: - Improved indentation. ++ - Added some comments regarding possible bugs in freeze modes. ++ ++2005-05-24 14:40 Sawyer ++ ++ * lib/Youri/Submit/Reject/Mail.pm: LOST ++ ++2007-03-10 07:49 spuk ++ ++ * lib/Youri/Submit/Action/Archive.pm: The extra '/' was causing the ++ string to not be matched by the regexp below ++ for getting $rep_section and $rep_main_section, in the end making ++ the SRPMs ++ of all other subsections be removed when a newer package was ++ uploaded for any ++ subsection. (#28719) ++ ++2007-02-26 10:56 blino ++ ++ * lib/Youri/Submit/Post/CleanRpmsrate.pm: initial ++ Post::CleanRpmsrate module ++ ++2007-02-14 12:10 blino ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: match rpmlint errors that have ++ no value (such as non-xdg-migrated-menu, the only one we ++ currently use...) ++ ++2007-02-09 22:11 blino ++ ++ * bin/youri-submit: get -> get_arg ++ ++2007-02-09 22:09 blino ++ ++ * bin/youri-submit: merge changes from ken/kenobi ++ ++2007-02-09 22:09 blino ++ ++ * bin/youri-submit: create youri-submit from youri-submit.in ++ ++2007-02-09 19:39 blino ++ ++ * lib/Youri/Submit/Check/ACL.pm: add section in acl error message ++ ++2007-02-09 19:34 blino ++ ++ * lib/Youri/Submit/Reject/Mail.pm: do not use packager adress as ++ from, it may be invalid (non-free packages) or not subscribed to ++ maintainers ++ ++2007-02-09 18:51 blino ++ ++ * lib/Youri/Submit/Reject/Mail.pm: fix changelog in reject mail ++ ++2007-02-09 18:50 blino ++ ++ * lib/Youri/Submit/Reject/Mail.pm: fix reject mail ++ ++2007-02-08 17:28 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: also give directories to "cpio ++ -pdu" to ensure directories are created with same rights ++ ++2007-02-08 14:09 pixel ++ ++ * lib/Youri/Submit/Action/Unpack.pm: This action plugin unpack ++ package files somewhere. ++ When unpack_inside_distribution_root is set, dest_directory is ++ relative to the distribution root. ++ When the package is a noarch, the wanted files are unpacked in ++ distribution root of each archs. ++ ++ eg: ++ unpack_installer_images: ++ class: Youri::Submit::Action::Unpack ++ options: ++ name: drakx-installer-images ++ source_subdir: /usr/lib*/drakx-installer-images ++ dest_directory: . ++ unpack_inside_distribution_root: 1 ++ ++2007-01-30 10:02 pixel ++ ++ * lib/Youri/Submit/Check/ACL.pm, lib/Youri/Submit/Check/Host.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/SVN.pm, ++ lib/Youri/Submit/Check/Source.pm, lib/Youri/Submit/Check/Type.pm, ++ lib/Youri/Submit/Check/Version.pm, lib/Youri/Submit/Pre/Rsync.pm, ++ lib/Youri/Submit/Reject/Archive.pm, ++ lib/Youri/Submit/Reject/Clean.pm, ++ lib/Youri/Submit/Reject/Install.pm, ++ lib/Youri/Submit/Reject/Mail.pm: fix $Id$ expansion ++ ++2007-01-30 10:01 pixel ++ ++ * lib/Youri/Submit/Plugin.pm, lib/Youri/Submit/Post.pm, ++ lib/Youri/Submit/Pre.pm, lib/Youri/Submit/Reject.pm: fix pod and ++ $Id$ expansion ++ ++2007-01-30 10:00 pixel ++ ++ * lib/Youri/Submit/Post.pm: fix pod ++ ++2007-01-30 09:59 pixel ++ ++ * lib/Youri/Submit/Action/Send.pm: fix pod ++ ++2007-01-30 09:58 pixel ++ ++ * lib/Youri/Submit/Action/Markrelease.pm, ++ lib/Youri/Submit/Action/Scp.pm: fix pod ++ ++2007-01-30 09:49 pixel ++ ++ * lib/Youri/Submit/Action/Clean.pm, ++ lib/Youri/Submit/Action/Link.pm, ++ lib/Youri/Submit/Action/Markrelease.pm, ++ lib/Youri/Submit/Action/Rpminfo.pm, ++ lib/Youri/Submit/Action/Scp.pm, lib/Youri/Submit/Action/Send.pm: ++ fix $Id$ expansion ++ ++2007-01-26 11:25 blino ++ ++ * lib/Youri/Submit/Check/ACL.pm: really match section in ACL ++ ++2007-01-26 11:24 blino ++ ++ * lib/Youri/Submit/Check/ACL.pm: fix arch ACL matching (and thus ++ allow ACLs to match again) ++ ++2006-12-24 10:31 mandrake ++ ++ * lib/Youri/Submit/Post.pm, lib/Youri/Submit/Pre.pm, ++ lib/Youri/Submit/Reject.pm: Removing previous pristine/ ++ directory. ++ ++2006-12-24 03:15 mandrake ++ ++ * lib/Youri/Submit/Action.pm: %repsys markrelease ++ version: 1.0 ++ release: 0.20061223.3mdv2007.1 ++ revision: 101968 ++ ++ Copying 1.0-0.20061223.3mdv2007.1 to releases/ directory. ++ ++2006-10-16 16:05 warly ++ ++ * lib/Youri/Submit/Check.pm: merging dev with upstream ++ ++2006-11-14 22:01 mrl ++ ++ * lib/Youri/Submit/Action/Rpminfo.pm: - Renamed package name tag. ++ ++2006-11-14 16:38 mrl ++ ++ * lib/Youri/Submit/Action/RpmInfo.pm, ++ lib/Youri/Submit/Action/Rpminfo.pm: - Renamed, due to some ++ enforcement (cfengine?). ++ ++2006-11-14 13:23 mrl ++ ++ * lib/Youri/Submit/Action/RpmInfo.pm: - Added package summary to ++ .info files. ++ ++2006-11-13 12:40 mrl ++ ++ * lib/Youri/Submit/Action/RpmInfo.pm: - First version of web ++ interface. ++ ++2006-10-31 11:40 mandrake ++ ++ * lib/Youri/Submit/Action/Archive.pm: unlink file in Archive for ++ the moment (should be done in clean but the code to detect which ++ packages is obsoleted has to be moved ++ ++2006-10-26 11:26 mandrake ++ ++ * lib/Youri/Submit/Action/CVS.pm: we perform CVS commit ++ asynchronously ++ ++2006-10-26 11:21 mandrake ++ ++ * lib/Youri/Submit/Action/Install.pm: rename the rpm to remove the ++ prefix ++ ++2006-10-26 11:18 mandrake ++ ++ * lib/Youri/Submit/Action/Mail.pm: fix double . ++ ++2006-10-26 11:16 mandrake ++ ++ * lib/Youri/Submit/Post/Gendistrib.pm: add gendistrib command ++ directly into gendistrib module ++ ++2006-10-26 11:14 mandrake ++ ++ * lib/Youri/Submit/Pre/Rsync.pm: return correct packages table for ++ groups ++ ++2006-10-26 11:10 mandrake ++ ++ * lib/Youri/Submit/Reject/Install.pm: get_reject_path seems to be ++ the new name ++ ++2006-10-26 11:07 mandrake ++ ++ * lib/Youri/Submit/Reject/Mail.pm: $last_change is sometime empty ++ ++2006-10-24 11:07 warly ++ ++ * bin/youri-submit.in: exit with an error code if an error occured ++ in one group; s/Upload/Submit/; use new structure name from ++ upstream ++ ++2006-10-23 11:48 warly ++ ++ * lib/Youri/Submit/Check/ACL.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/SVN.pm, ++ lib/Youri/Submit/Check/Source.pm, ++ lib/Youri/Submit/Check/Version.pm: must return an empty value ++ ++2006-10-18 12:46 warly ++ ++ * lib/Youri/Submit/Check/Rpmlint.pm: remove debug code ++ ++2006-10-17 16:10 warly ++ ++ * lib/Youri/Submit/Check/ACL.pm: now checks must return the error ++ message ++ ++2006-10-17 16:04 warly ++ ++ * lib/Youri/Submit/Check/ACL.pm, lib/Youri/Submit/Check/Host.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/SVN.pm, ++ lib/Youri/Submit/Check/Source.pm, ++ lib/Youri/Submit/Check/Version.pm: now checks must return the ++ error message ++ ++2006-10-17 15:16 warly ++ ++ * lib/Youri/Submit/Action/Clean.pm, ++ lib/Youri/Submit/Action/Link.pm, lib/Youri/Submit/Check/ACL.pm, ++ lib/Youri/Submit/Check/Host.pm, ++ lib/Youri/Submit/Check/Queue_recency.pm, ++ lib/Youri/Submit/Check/SVN.pm, lib/Youri/Submit/Check/Source.pm, ++ lib/Youri/Submit/Check/Type.pm, ++ lib/Youri/Submit/Check/Version.pm, lib/Youri/Submit/Post.pm, ++ lib/Youri/Submit/Pre.pm, lib/Youri/Submit/Reject.pm: ++ s/Upload/Submit/g ++ ++2006-10-17 13:53 warly ++ ++ * ., ChangeLog, MANIFEST.SKIP, Makefile.PL, README, TODO, ++ bin/youri-submit-proxy.in, bin/youri-submit-restricted.in, ++ bin/youri-submit.in, etc, etc/bash_completion.d, ++ etc/bash_completion.d/youri-submit, etc/submit.conf, ++ lib/Youri/Submit/Plugin.pm, t, t/00distribution.t: merge with ++ upstream ++ ++2006-10-16 16:27 warly ++ ++ * lib/Youri/Submit/Post/Gendistrib.pm, ++ lib/Youri/Submit/Pre/Rsync.pm, ++ lib/Youri/Submit/Reject/Archive.pm, ++ lib/Youri/Submit/Reject/Clean.pm, ++ lib/Youri/Submit/Reject/Install.pm, ++ lib/Youri/Submit/Reject/Mail.pm: Now the module is Submit and not ++ Upload ++ ++2006-10-16 16:26 warly ++ ++ * lib/Youri/Submit/Check, lib/Youri/Submit/Check/History.pm, ++ lib/Youri/Submit/Check/Precedence.pm, ++ lib/Youri/Submit/Check/Recency.pm, ++ lib/Youri/Submit/Check/Rpmlint.pm, lib/Youri/Submit/Check/Tag.pm, ++ lib/Youri/Submit/Check/Type.pm: merging dev with upstream ++ ++2006-10-16 16:15 warly ++ ++ * lib/Youri/Submit/Post.pm, lib/Youri/Submit/Pre.pm, ++ lib/Youri/Submit/Reject.pm: now plugins are complete abstract ++ classes ++ ++2006-10-16 16:08 warly ++ ++ * lib/Youri/Submit/Action.pm: merging dev with upstream ++ ++2006-10-16 16:05 warly ++ ++ * lib/Youri/Submit/Check.pm: merging dev with upstream ++ ++2006-10-16 13:03 warly ++ ++ * lib/Youri/Submit/Action/Markrelease.pm, ++ lib/Youri/Submit/Action/Scp.pm, lib/Youri/Submit/Action/Send.pm: ++ Now the Module is Submit ++ ++2006-10-16 12:57 warly ++ ++ * lib/Youri/Submit/Action, lib/Youri/Submit/Action/Archive.pm, ++ lib/Youri/Submit/Action/Bugzilla.pm, ++ lib/Youri/Submit/Action/CVS.pm, lib/Youri/Submit/Action/Clean.pm, ++ lib/Youri/Submit/Action/Install.pm, ++ lib/Youri/Submit/Action/Link.pm, lib/Youri/Submit/Action/Mail.pm, ++ lib/Youri/Submit/Action/RSS.pm, lib/Youri/Submit/Action/Sign.pm: ++ merging dev with upstream ++ ++2006-10-16 11:33 warly ++ ++ * bin/youri-check.in: add new youri subsections (from upstream) ++ ++2006-10-16 11:30 warly ++ ++ * lib/Youri/Submit: add new youri subsections (from upstream) ++ ++2006-10-16 11:30 warly ++ ++ * lib/Youri: add new youri subsections (from upstream) ++ ++2006-10-16 11:30 warly ++ ++ * lib: add new youri subsections (from upstream) ++ ++2006-10-16 11:22 warly ++ ++ * bin/youri-submit.in: add new youri subsections (from upstream) ++ ++2006-10-16 11:18 warly ++ ++ * bin: add new youri subsections (from upstream) ++ ++2006-10-16 11:18 warly ++ ++ * .: add new youri subsections (from upstream) ++ ++2006-04-23 Guillaume Rousse <guillomovitch@zarb.org> 0.9 ++ * initial release + +<a id="build_systemmdvyourisubmittrunkMANIFESTSKIP">Added: build_system/mdv-youri-submit/trunk/MANIFEST.SKIP</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/MANIFEST.SKIP (rev 0) ++++ build_system/mdv-youri-submit/trunk/MANIFEST.SKIP 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,11 @@ ++\.tar\.gz$ ++\.SKIP$ ++~$ ++^pm_to_blib$ ++^Makefile$ ++^Makefile\.old$ ++^bin/youri-submit$ ++^bin/youri-submit-restricted$ ++^bin/youri-submit-proxy$ ++.svn ++blib + +<a id="build_systemmdvyourisubmittrunkMakefilePL">Added: build_system/mdv-youri-submit/trunk/Makefile.PL</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/Makefile.PL (rev 0) ++++ build_system/mdv-youri-submit/trunk/Makefile.PL 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,97 @@ ++# $Id: Makefile.PL 1723 2006-10-17 13:53:27Z warly $ ++use ExtUtils::MakeMaker; ++use Config; ++ ++WriteMakefile( ++ NAME => 'youri-submit', ++ VERSION => 0.9, ++ AUTHOR => 'Youri project <youri@zarb.org>', ++ EXE_FILES => [ ++ 'bin/youri-submit', ++ 'bin/youri-submit-restricted', ++ 'bin/youri-submit-proxy' ++ ], ++ PREREQ_PM => { ++ 'Youri::Config' => 0, ++ 'Youri::Utils' => 0, ++ 'Pod::Simple::HTMLBatch' => 0 ++ }, ++ PREFIX => '/usr/local', ++ INSTALLPRIVLIB => $Config{installprivlib}, ++ INSTALLSITELIB => $Config{installsitelib}, ++ INSTALLVENDORLIB => $Config{installvendorlib}, ++ INSTALLMAN3DIR => $Config{installman3dir}, ++ INSTALLSITEMAN3DIR => $Config{installsiteman3dir}, ++ INSTALLVENDORMAN3DIR => $Config{installvendorman3dir}, ++ INSTALLSCRIPT => '$(PREFIX)/bin', ++ INSTALLSITESCRIPT => '$(PREFIX)/bin', ++ INSTALLVENDORSCRIPT => '$(PREFIX)/bin', ++ INSTALLMAN1DIR => '$(PREFIX)/share/man/man1', ++ INSTALLSITEMAN1DIR => '$(PREFIX)/share/man/man1', ++ INSTALLVENDORMAN1DIR => '$(PREFIX)/share/man/man1', ++); ++ ++package MY; ++ ++sub post_constants { ++ my ($self) = @_; ++ my $sysconfdir = $self->{ARGS}->{SYSCONFDIR} || '$(PREFIX)/etc'; ++ return <<EOF; ++SYSCONFDIR = $sysconfdir ++EOF ++} ++ ++sub top_targets { ++ my ($self) = @_; ++ my $top_targets = $self->SUPER::top_targets(@_); ++ $top_targets =~ s/all :: pure_all manifypods/all :: pure_all manifypods htmlifypods/; ++ $top_targets .= <<'EOF'; ++htmlifypods : $(TO_INST_PM) ++ if [ ! -d blib/html ]; then mkdir blib/html; fi ++ perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go lib blib/html ++ pod2html < bin/youri-submit > blib/html/youri-submit.html ++ pod2html < bin/youri-submit-restricted > blib/html/youri-submit-restricted.html ++ pod2html < bin/youri-submit-proxy > blib/html/youri-submit-proxy.html ++EOF ++ return $top_targets; ++} ++ ++sub install { ++ my ($self) = @_; ++ my $install = $self->SUPER::install(@_); ++ $install =~ s/install :: all pure_install doc_install/install :: all pure_install doc_install config_install completion_install/; ++ $install .= <<'EOF'; ++config_install : ++ install -d -m 755 $(DESTDIR)$(SYSCONFDIR)/youri ++ install -m 644 etc/submit.conf $(DESTDIR)$(SYSCONFDIR)/youri ++ ++completion_install : ++ install -d -m 755 $(DESTDIR)$(SYSCONFDIR)/bash_completion.d ++ install -m 644 etc/bash_completion.d/youri-submit $(DESTDIR)$(SYSCONFDIR)/bash_completion.d ++EOF ++ return $install; ++} ++ ++sub installbin { ++ my ($self) = @_; ++ my $installbin = $self->SUPER::installbin(@_); ++ $installbin .= <<'EOF'; ++bin/youri-submit : bin/youri-submit.in Makefile ++ perl -p \ ++ -e 's|\@sysconfdir\@|$(SYSCONFDIR)|;' \ ++ < $< > $@ ++ ++bin/youri-submit-restricted : bin/youri-submit-restricted.in Makefile ++ perl -p \ ++ -e 's|\@sysconfdir\@|$(SYSCONFDIR)|;' \ ++ -e 's|\@bindir\@|$(PREFIX)/bin|;' \ ++ < $< > $@ ++ ++bin/youri-submit-proxy : bin/youri-submit-proxy.in Makefile ++ perl -p \ ++ -e 's|\@sysconfdir\@|$(SYSCONFDIR)|;' \ ++ -e 's|\@bindir\@|$(PREFIX)/bin|;' \ ++ < $< > $@ ++EOF ++ return $installbin; ++} + +<a id="build_systemmdvyourisubmittrunkREADME">Added: build_system/mdv-youri-submit/trunk/README</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/README (rev 0) ++++ build_system/mdv-youri-submit/trunk/README 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,45 @@ ++YOURI project ++------------- ++ ++YOURI stands for "Youri Offers an Upload & Repository Infrastucture". It aims ++to build tools making management of a coherent set of packages easier. ++ ++Description ++----------- ++Managing a package repository involves many tasks, such as keeping packages ++tree tidy, generating packages indexes, synchronising bug report system, ++running coherency checks, checking for available updates, etc... ++ ++Instead of a gazillion project-specific scripts, we aim to provide a generic package-format independant framework, so as to build coherent and robust tools. ++ ++Components ++---------- ++Available software in this release ++- youri-check allows to check packages ++- youri-upload allows to upload packages ++ ++Installation ++------------ ++To install, just use: ++perl Makefile.PL ++make ++make test ++ ++All standard MakeMaker variables are usable, with the addition of SYSCONFDIR to ++specify configuration files destination. ++ ++Copyright and License ++--------------------- ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under ++the same terms as Perl itself. ++ ++Authors ++------- ++Guillaume Rousse <guillomovitch@zarb.org>, ++Pascal Terjan <pterjan@zarb.org> ++Damien Krotkine <dams@zarb.org> ++Olivier Thauvin <nanardon@zarb.org> ++Ville Skytt\xE4 <ville.skytta@iki.fi> ++ + +<a id="build_systemmdvyourisubmittrunkTODO">Added: build_system/mdv-youri-submit/trunk/TODO</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/TODO (rev 0) ++++ build_system/mdv-youri-submit/trunk/TODO 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,6 @@ ++1.0 Goals ++========= ++ ++- svn support ++- automatic bugzilla ticket closing on upload ++- more customizable (template based ?) mail notification + +<a id="build_systemmdvyourisubmittrunkbinyouricheckin">Added: build_system/mdv-youri-submit/trunk/bin/youri-check.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-check.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-check.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,395 @@ ++#!/usr/bin/perl ++# $Id: youri-check.in 1699 2006-10-16 11:33:58Z warly $ ++ ++=head1 NAME ++ ++youri-check - package check agent ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 SYNOPSIS ++ ++youri-check [options] <mode> ++ ++Options: ++ ++ --config <file> use file <file> as config file ++ --skip-media <media> skip media <media> ++ --skip-plugin <plugin> skip plugin <plugin> ++ --parallel parallel run ++ --verbose verbose run ++ --test test run ++ --help print this help message ++ ++=head1 DESCRIPTION ++ ++B<youri-check> allows to check packages in a repository. ++ ++In input mode, all medias defined in configuration are passed to a list of ++input plugins, each of them storing their result in a persistent resultset. In ++output mode, this resultset is passed to a list of output plugins, each of them ++producing arbitrary effects. ++ ++=head1 OPTIONS ++ ++=over ++ ++=item B<--config> <file> ++ ++Use given file as configuration, instead of normal one. ++ ++=item B<--skip-media> <media> ++ ++Skip media with given identity. ++ ++=item B<--skip-plugin> <plugin> ++ ++Skip plugin with given identity. ++ ++=item B<--parallel> ++ ++Run all plugins parallelously ++ ++=item B<--verbose> ++ ++Produce more verbose output (can be used more than once) ++ ++=item B<--test> ++ ++Don't perform any modification. ++ ++=item B<--help> ++ ++Print a brief help message and exits. ++ ++=back ++ ++=head1 CONFIGURATION ++ ++Configuration is read from the first file found among: ++ ++=over ++ ++=item * the one specified by B<--config> option on command-line ++ ++=item * $HOME/.youri/check.conf ++ ++=item * @sysconfdir@/youri/check.conf ++ ++=back ++ ++All additional configuration files specified by B<includes> directive are then ++processed. Then command line options. Any directive overrides prior definition. ++ ++=over ++ ++=item B<includes> I<files> ++ ++Uses space-separated list I<files> as a list of additional configuration files. ++ ++=item B<resolver> I<id> ++ ++Declare a maintainer resolver object with identity I<id>. ++ ++=item B<preferences> I<id> ++ ++Declare a maintainer preferences object with identity I<id>. ++ ++=item B<resultset> I<id> ++ ++Declare a resultset object with identity I<id>. ++ ++=item B<medias> I<ids> ++ ++Declares a list of media objects with identity taken in space-separated list ++I<ids>. ++ ++=item B<inputs> I<ids> ++ ++Declares a list of input plugin objects with identity taken in space-separated ++list I<ids>. ++ ++=item B<outputs> I<ids> ++ ++Declares a list of output plugin objects with identity taken in space-separated ++list I<ids>. ++ ++=back ++ ++Each object declared in configuration must be fully defined later, using a ++configuration section, starting with bracketed object identity, followed by at ++least a class directive, then any number of additional object-specific ++directives. ++ ++Example: ++ ++ objects = foo ++ ++ [foo] ++ class = Foo::Bar ++ key1 = value1 ++ key2 = value2 ++ ++=head1 SEE ALSO ++ ++Youri::Config, for configuration file format. ++ ++Each used plugin man page, for available options. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++use Youri::Config; ++use Youri::Utils; ++use Pod::Usage; ++use Net::Config qw/%NetConfig/; ++use DateTime; ++ ++my $config = Youri::Config->new( ++ command_spec => [ ++ 'config=s', ++ 'skip-plugin=s@', ++ 'skip-media=s@', ++ 'parallel!', ++ 'help|h!', ++ 'test|t!', ++ 'verbose|v!' ++ ], ++ file_spec => [ ++ 'includes=s', ++ 'resolver=s', ++ 'preferences=s', ++ 'resultset=s', ++ 'medias=s', ++ 'inputs=s', ++ 'outputs=s' ++ ], ++ directories => [ '@sysconfdir@', "$ENV{HOME}/.youri" ], ++ file_name => 'check.conf', ++ caller => $0, ++); ++ ++pod2usage( ++ -verbose => 0, ++ -message => "No mode specified, aborting\n" ++) unless @ARGV; ++ ++my $mode = $ARGV[0]; ++ ++# convenient global flags ++my $test = $config->get('test'); ++my $verbose = $config->get('verbose'); ++ ++# libnet configuration ++my %netconfig = $config->get_section('netconfig'); ++$NetConfig{$_} = $netconfig{$_} foreach keys %netconfig; ++ ++# resultset creation ++my $resultset_id = $config->get('resultset'); ++die "No resultset defined" unless $resultset_id; ++ ++report("Creating resultset $resultset_id"); ++my $resultset = create_instance( ++ 'Youri::Check::Resultset', ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ $config->get_section($resultset_id) ++); ++ ++my $children; ++ ++my %skip_plugins = map { $_ => 1 } @{$config->get('skip-plugin')}; ++ ++if ($mode eq 'input') { ++ ++ # additional objects ++ ++ my $resolver; ++ my $resolver_id = $config->get('resolver'); ++ if ($resolver_id) { ++ report("Creating maintainer resolver $resolver_id"); ++ eval { ++ $resolver = create_instance( ++ 'Youri::Check::Maintainer::Resolver', ++ test => $test, ++ verbose => $verbose > 1 ? $verbose - 2 : 0, ++ $config->get_section($resolver_id) ++ ); ++ }; ++ print STDERR "Failed to create maintainer resolver $resolver_id: $@\n" if $@; ++ } ++ ++ my $preferences; ++ my $preferences_id = $config->get('preferences'); ++ if ($preferences_id) { ++ report("Creating maintainer preferences $preferences_id"); ++ eval { ++ $preferences = create_instance( ++ 'Youri::Check::Maintainer::Preferences', ++ test => $test, ++ verbose => $verbose > 1 ? $verbose - 2 : 0, ++ $config->get_section($preferences_id) ++ ); ++ }; ++ print STDERR "Failed to create maintainer preferences $preferences_id: $@\n" if $@; ++ } ++ ++ my @medias; ++ my %skip_medias = map { $_ => 1 } @{$config->get('skip-media')}; ++ foreach my $id (split(/\s+/, $config->get('medias'))) { ++ next if $skip_medias{$id}; ++ report("Creating media $id"); ++ eval { ++ push( ++ @medias, ++ create_instance( ++ 'Youri::Media', ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ $config->get_section($id) ++ ) ++ ); ++ }; ++ print STDERR "Failed to create media $id: $@\n" if $@; ++ } ++ ++ # prepare resultset ++ $resultset->reset(); ++ $resultset->set_resolver($resolver); ++ ++ ++ foreach my $id (split(/\s+/, $config->get('inputs'))) { ++ next if $skip_plugins{$id}; ++ report("Creating input $id"); ++ my $input; ++ eval { ++ $input = create_instance( ++ 'Youri::Check::Input', ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ resolver => $resolver, ++ preferences => $preferences, ++ $config->get_section($id) ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create input $id: $@\n"; ++ } else { ++ if ($config->get('parallel')) { ++ # fork ++ my $pid = fork; ++ die "Can't fork: $!" unless defined $pid; ++ if ($pid) { ++ # parent process ++ $children++; ++ next; ++ } ++ } ++ eval { ++ $input->prepare(@medias); ++ }; ++ if ($@) { ++ print STDERR "Failed to prepare input $id: $@\n"; ++ } else { ++ # clone resultset in child process ++ $resultset = $config->get('parallel') ? ++ $resultset->clone() : ++ $resultset; ++ ++ foreach my $media (@medias) { ++ next if $media->skip_input($id); ++ my $media_id = $media->get_id(); ++ report("running input $id on media $media_id"); ++ eval { ++ $input->run($media, $resultset); ++ }; ++ if ($@) { ++ print STDERR "Failed to run input $id on media $media_id: $@\n"; ++ } ++ } ++ } ++ if ($config->get('parallel')) { ++ # child process ++ exit; ++ } ++ } ++ } ++ ++} elsif ($mode eq 'output') { ++ ++ foreach my $id (split(/\s+/, $config->get('outputs'))) { ++ next if $skip_plugins{$id}; ++ report("Creating output $id"); ++ my $output; ++ eval { ++ $output = create_instance( ++ 'Youri::Check::Output', ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ config => $config, ++ $config->get_section($id) ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create output $id: $@\n"; ++ } else { ++ if ($config->get('parallel')) { ++ # fork ++ my $pid = fork; ++ die "Can't fork: $!" unless defined $pid; ++ if ($pid) { ++ # parent process ++ $children++; ++ next; ++ } ++ } ++ ++ # clone resultset in child process ++ $resultset = $config->get('parallel') ? ++ $resultset->clone() : ++ $resultset; ++ ++ report("running output $id"); ++ eval { ++ $output->run($resultset); ++ }; ++ if ($@) { ++ print STDERR "Failed to run output $id: $@\n"; ++ } ++ ++ if ($config->get('parallel')) { ++ # child process ++ exit; ++ } ++ } ++ } ++} else { ++ die "Invalid mode $mode"; ++} ++ ++# wait for all forked processus termination ++while ($children) { ++ wait; ++ $children--; ++} ++ ++sub report { ++ my ($message) = @_; ++ print DateTime->now()->strftime('[%H:%M:%S] ') ++ if $verbose > 1; ++ print "$message\n" ++ if $verbose > 0; ++} + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-check.in +___________________________________________________________________ +<a id="svnexecutable">Added: svn:executable</a> + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmit">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,534 @@ ++#!/usr/bin/perl ++# $Id: youri-submit 232579 2007-12-17 19:45:47Z blino $ ++ ++=head1 NAME ++ ++youri-submit - package submission tool ++ ++=head1 VERSION ++ ++Version 2.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit [options] <target> <files> ++ ++youri-submit --list <category> [target] ++ ++youri-submit --help [category] [item] ++ ++Options: ++ ++ --config <file> use file <file> as config file ++ --skip-pre <pre> skip pre <pre> ++ --skip-check <check> skip check <check> ++ --skip-action <action> skip action <action> ++ --skip-post <post> skip post <post> ++ --skip-reject <reject> skip reject <reject> ++ --define <key>=<value> pass additional values ++ --clean delete package after success ++ --verbose verbose run ++ --test test run ++ --list <category> list items from given category ++ --help [category] display contextual help ++ ++=head1 DESCRIPTION ++ ++B<youri-submit> allows to submit packages to a repository. ++ ++All packages given on command lines are passed to a list of check plugins, ++depending on given upload target. If none of them fails, all packages are ++passed to a list of action plugins, depending also on given upload target. ++ ++=head1 OPTIONS ++ ++=over ++ ++=item B<--config> I<file> ++ ++Use given file as configuration, instead of normal one. ++ ++=item B<--skip-pre> I<id> ++ ++Skip pre transaction plugin with given identity ++ ++=item B<--skip-check> I<id> ++ ++Skip check plugin with given identity. ++ ++=item B<--skip-action> I<id> ++ ++Skip action plugin with given identity. ++ ++=item B<--skip-post> I<id> ++ ++Skip post transaction plugin with given identity. ++ ++=item B<--skip-reject> I<id> ++ ++Skip reject action plugin with given identity. ++ ++=item B<--define> <key>=<value> ++ ++Define additional parameters, to be used by plugins. ++ ++=item B<--clean> ++ ++Delete submited packages upon successfull submission. ++ ++=item B<--verbose> ++ ++Produce more verbose output (can be used more than once) ++ ++=item B<--test> ++ ++Don't perform any modification. ++ ++=item B<--list> I<category> ++ ++List available items from given category and exits. Category must be either ++B<targets>, B<actions> or B<checks>. A target is needed for the two last ones. ++ ++=item B<--help> I<category> ++ ++Display help for given category and exits. Category must be either ++B<repository>, B<action> or B<check>. An item is needed for the two last ones. ++If no category given, display standard help. ++ ++=back ++ ++=head1 CONFIGURATION ++ ++Configuration is read from the first file found among: ++ ++=over ++ ++=item * the one specified by B<--config> option on command-line ++ ++=item * $HOME/.youri/submit.conf ++ ++=item * /usr/local/etc/youri/submit.conf ++ ++=back ++ ++The configuration file should be a YAML-format files, with the following ++mandatory top-level directives: ++ ++=over ++ ++=item B<repository> ++ ++The definition of repository plugin to be used. ++ ++=item B<targets> ++ ++The list of available submission targets, each one being composed from the ++following keys: ++ ++=over ++ ++=item B<checks> ++ ++The list of check plugins to use for this target. ++ ++=item B<actions> ++ ++The list of action plugins to use for this target. ++ ++=back ++ ++=item B<checks> ++ ++The list of check plugin definitions, indexed by their identity. ++ ++=item B<actions> ++ ++The list of action plugin definitions, indexed by their identity. ++ ++=back ++ ++=head1 SEE ALSO ++ ++Youri::Config, for additional details about configuration file format. ++ ++Each used plugin man page, for available options. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++use Youri::Config; ++use Youri::Utils; ++use Pod::Usage; ++ ++my $config = Youri::Config->new( ++ args => { ++ 'skip-check' => '=s@', ++ 'skip-action' => '=s@', ++ 'define' => '=s%', ++ 'verbose' => '|v!', ++ 'clean' => '!', ++ 'test' => '|t!', ++ 'list' => '|l!', ++ 'config' => '=s', ++ 'skip-prei' => '=s@', ++ 'skip-post' => '=s@', ++ 'skip-reject' => '=s@', ++ }, ++ directories => [ "$ENV{HOME}/.youri", '/usr/local/etc/youri' ], ++ file => 'submit.conf', ++); ++ ++if ($config->get_arg('list')) { ++ my $category = $ARGV[0]; ++ pod2usage(-verbose => 0, -message => "No category specified, aborting\n") ++ unless $category; ++ if ($category eq 'targets') { ++ print join(' ', keys %{$config->get_param('targets')}); ++ } elsif ($category eq 'checks' || $category eq 'actions') { ++ my $target = $ARGV[1]; ++ pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless $target; ++ if ($category eq 'checks') { ++ my $checks = $config->get_param('targets')->{$target}->{checks}; ++ print join(' ', @{$checks}) if $checks; ++ } else { ++ my $actions = $config->get_param('targets')->{$target}->{actions}; ++ print join(' ', @{$actions}) if $actions; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ print "\n"; ++ exit 0; ++} ++ ++if ($config->get_arg('help')) { ++ my $category = $ARGV[0]; ++ my ($item, $section); ++ if ($category eq 'repository') { ++ $section = $config->get_param('repository'); ++ pod2usage( ++ -verbose => 0, ++ -message => "No repository defined, aborting\n" ++ ) unless $section; ++ } elsif ($category eq 'check' || $category eq 'action') { ++ $item = $ARGV[1]; ++ pod2usage( ++ -verbose => 0, ++ -message => "No item specified, aborting\n" ++ ) unless $item; ++ if ($category eq 'check') { ++ $section = $config->get_param('checks')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such check $item defined, aborting\n" ++ ) unless $section; ++ } else { ++ $section = $config->get_param('actions')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such action $item defined, aborting\n" ++ ) unless $section; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ my $file = $section->{class} . '.pm'; ++ $file =~ s/::/\//g; ++ pod2usage( ++ -verbose => 99, ++ -sections => 'NAME|DESCRIPTION', ++ -input => $file, ++ -pathlist => \@INC ++ ); ++} ++ ++ ++pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless @ARGV > 0; ++pod2usage(-verbose => 0, -message => "No packages specified, aborting\n") ++ unless @ARGV > 1 || $config->get_param('allow_omitting_packages'); ++ ++# convenient global flags ++my $test = $config->get_arg('test'); ++my $verbose = $config->get_arg('verbose'); ++ ++# check target ++my $target = shift @ARGV; ++my $target_conf = $config->get_param('targets')->{$target}; ++ ++# create repository ++my $repository; ++my $repository_conf = $config->get_param('repository'); ++die "No repository declared" unless $repository_conf; ++print "Creating repository\n" if $verbose; ++eval { ++ $repository = create_instance( ++ 'Youri::Repository', ++ $repository_conf, ++ { ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ targets => [ keys %{$config->get_param('targets')} ], ++ } ++ ); ++}; ++die "Failed to create repository: $@\n" if $@; ++ ++# perfrom pre action ++my @errors; ++my $pre_packages = []; ++my $skip_pres = $config->get_arg('skip-pre'); ++my %skip_pres = $skip_pres ? map { $_ => 1 } @{$skip_pres} : (); ++foreach my $id (@{$target_conf->{pres}}) { ++ next if $skip_pres{$id}; ++ print "Creating pre $id\n" if $verbose; ++ my $pre; ++ my $pre_conf = $config->get_param('pres')->{$id}; ++ ++ if (!$pre_conf) { ++ print STDERR "No such pre $id, skipping\n"; ++ next; ++ } ++ eval { ++ $pre = create_instance( ++ 'Youri::Submit::Pre', ++ $pre_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create pre $id: $@\n"; ++ } else { ++ print "running pre $id\n" if $verbose; ++ my @err = $pre->run( ++ $pre_packages, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@errors, @err) if $err[0]; ++ } ++} ++ ++if (@errors) { ++ print "Pre-submission errors, aborting:\n"; ++ foreach my $error (@errors) { ++ print " - $error\n"; ++ } ++ exit(1) ++} ++ ++# create packages group ++my $group_error; ++my @packages_group; ++foreach my $group ([ map { { section => "", file => $_ } } @ARGV ], @$pre_packages) { ++ my @packages; ++ foreach my $opt (@$group) { ++ print "Preparing upload for $opt->{file} in $opt->{section}\n" if $verbose; ++ $repository->{packages}{$opt->{file}}{section} = $opt->{section}; ++ push( ++ @packages, ++ create_instance( ++ 'Youri::Package', ++ { ++ class => $repository->get_package_class(), ++ }, ++ { ++ file => $opt->{file}, ++ %$opt ++ }, ++ ) ++ ); ++ } ++ @packages or next; ++ ++# check all packages pass all tests ++ my %errors; ++ my $skip_check = $config->get_arg('skip-check'); ++ my %skip_check = $skip_check ? map { $_ => 1 } @{$skip_check} : (); ++ my @error; ++ foreach my $id (@{$target_conf->{checks}}) { ++ next if $skip_check{$id}; ++ print "Creating check $id\n" if $verbose; ++ my $check; ++ my $check_conf = $config->get_param('checks')->{$id}; ++ ++ if (!$check_conf) { ++ print STDERR "No such check $id, skipping\n"; ++ next; ++ } ++ eval { ++ $check = create_instance( ++ 'Youri::Submit::Check', ++ $check_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create check $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running check $id on package $package\n" if $verbose; ++ my @errors = $check->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@{$errors{$package}}, @errors) if $errors[0]; ++ } ++ } ++ } ++ if (%errors) { ++ print "Submission errors, aborting:\n"; ++ foreach my $package (keys %errors) { ++ print "- $package:\n"; ++ foreach my $error (@{$errors{$package}}) { ++ print " - $error\n"; ++ } ++ } ++ # reject the packages ++ my $skip_rejects = $config->get_arg('skip-reject'); ++ my %skip_rejects = $skip_rejects ? map { $_ => 1 } @{$skip_rejects} : (); ++ foreach my $id (@{$target_conf->{rejects}}) { ++ next if $skip_rejects{$id}; ++ print "Creating reject $id\n" if $verbose; ++ my $reject; ++ my $reject_conf = $config->get_param('rejects')->{$id}; ++ ++ if (!$reject_conf) { ++ print STDERR "No such reject $id, skipping\n"; ++ next; ++ } ++ eval { ++ $reject = create_instance( ++ 'Youri::Submit::Reject', ++ $reject_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create reject $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running reject $id on package $package\n" if $verbose; ++ eval { ++ $reject->run($package, \%errors, $repository, $target, $config->get_arg('define')); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ $group_error = 1; ++ next ++ } ++ ++# proceed further ++ my $skip_action = $config->get_arg('skip-action'); ++ my %skip_action = $skip_action ? map { $_ => 1 } @{$skip_action} : (); ++ foreach my $id (@{$target_conf->{actions}}) { ++ next if $skip_action{$id}; ++ print "Creating action $id\n" if $verbose; ++ my $action; ++ my $action_conf = $config->get_param('actions')->{$id}; ++ ++ if (!$action_conf) { ++ print STDERR "No such action $id, skipping\n"; ++ next; ++ } ++ eval { ++ $action = create_instance( ++ 'Youri::Submit::Action', ++ $action_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create action $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running action $id on package $package\n" if $verbose; ++ eval { ++ $action->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ ++ if ($config->get_arg('clean')) { ++ foreach my $package (@packages) { ++ print "cleaning file $package\n" if $verbose; ++ unlink $package->as_file(); ++ } ++ } ++} ++ ++# perfrom post action ++my $skip_post = $config->get_arg('skip-post'); ++my %skip_post = $skip_post ? map { $_ => 1 } @{$skip_post} : (); ++foreach my $id (@{$target_conf->{posts}}) { ++ next if $skip_post{$id}; ++ print "Creating post $id\n" if $verbose; ++ my $post; ++ my $post_conf = $config->get_param('posts')->{$id}; ++ ++ if (!$post_conf) { ++ print STDERR "No such post $id, skipping\n"; ++ next; ++ } ++ eval { ++ $post = create_instance( ++ 'Youri::Submit::Post', ++ $post_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create post $id: $@\n"; ++ } else { ++ print "running post $id\n" if $verbose; ++ my @err = $post->run($repository, $target, $config->get_arg('define')); ++ print STDERR "Error $id: @err\n" if @err ++ } ++} ++ ++exit(1) if $group_error; + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmitproxyin">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,77 @@ ++#!/usr/bin/perl ++ ++=head1 NAME ++ ++youri-submit-proxy - proxy wrapper over youri-submit-restricted ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit-proxy [options] <target> <files> ++ ++=head1 DESCRIPTION ++ ++youri-submit-proxy is a proxy wrapper over youri-submit-restricted, intended to ++be used in collaborative work to change uid before calling it through sudo. ++ ++=head1 SEE ALSO ++ ++youri-submit-restricted(1), youri-submit(1) ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++use Fcntl ':mode'; ++use File::Basename; ++ ++my ($uid, $gid); ++if (-l $0) { ++ # this is a symlink, get uid and gid from it ++ ($uid, $gid) = (lstat($0))[4, 5]; ++} else { ++ ($uid, $gid) = (stat($0))[4, 5]; ++} ++my $user = getpwuid($uid) or die "unknown uid $uid"; ++my $prog = '@bindir@/youri-submit-restricted'; ++ ++my %dirs; ++my @options; ++foreach my $arg (@ARGV) { ++ if (-f $arg) { ++ # push parent dir in list ++ my $parent = dirname($arg); ++ $dirs{$parent}++; ++ } ++ push(@options, $arg); ++} ++ ++foreach my $dir (keys %dirs) { ++ # save original perms and gid ++ my ($orig_mode, $orig_gid) = (stat($dir))[2,5]; ++ $dirs{$dir} = { ++ mode => $orig_mode, ++ gid => $orig_gid ++ }; ++ # ensure correct perms and gid ++ chown -1, $gid, $dir; ++ chmod $orig_mode|S_IRGRP|S_IWGRP, $dir; ++} ++ ++# call wrapped program ++system('sudo', '-H', '-u', $user, $prog, @options); ++ ++foreach my $dir (keys %dirs) { ++ # restore original perms and gid ++ chown -1, $dirs{$dir}->{gid}, $dir; ++ chmod $dirs{$dir}->{mode}, $dir; ++} + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit-proxy.in +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmitrestrictedin">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,64 @@ ++#!/usr/bin/perl -T ++ ++=head1 NAME ++ ++youri-submit-restricted - filtering wrapper over youri-submit ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit-restricted [options] <target> <files> ++ ++=head1 DESCRIPTION ++ ++youri-submit-restricted is just a filtering wrapper over youri-submit, intended ++to be used in collaborative work to sanitize environment and options before ++calling it. ++ ++=head1 SEE ALSO ++ ++youri-submit(1) ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++my $prog = '@bindir@/youri-submit'; ++my @prohibited_options = qw/--config --skip-check --skip-action/; ++my %prohibited_options = map { $_ => 1 } @prohibited_options; ++my @prohibited_envvars = qw/ ++ ENV BASH_ENV IFS CDPATH ++ PERLLIB PERL5LIB PERL5OPT PERLIO ++ PERLIO_DEBUG PERL5DB PERL_ENCODING ++ PERL_HASH_SEED PERL_SIGNALS PERL_UNICODE ++/; ++ ++my @options; ++while (my $arg = shift @ARGV) { ++ if ($prohibited_options{$arg}) { ++ # drop prohibited options ++ print STDERR "prohibited option $arg, skipping\n"; ++ shift @ARGV; ++ } else { ++ # untaint everything else ++ $arg =~ /(.*)/; ++ push(@options, $1); ++ } ++} ++ ++# secure ENV ++$ENV{PATH} = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"; ++delete $ENV{$_} foreach @prohibited_envvars; ++ ++# call wrapped program ++system($prog, @options); + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit-restricted.in +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunkbinyourisubmitin">Added: build_system/mdv-youri-submit/trunk/bin/youri-submit.in</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/bin/youri-submit.in (rev 0) ++++ build_system/mdv-youri-submit/trunk/bin/youri-submit.in 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,534 @@ ++#!/usr/bin/perl ++# $Id: youri-submit.in 232668 2007-12-21 14:37:04Z blino $ ++ ++=head1 NAME ++ ++youri-submit - package submission tool ++ ++=head1 VERSION ++ ++Version 2.0 ++ ++=head1 SYNOPSIS ++ ++youri-submit [options] <target> <files> ++ ++youri-submit --list <category> [target] ++ ++youri-submit --help [category] [item] ++ ++Options: ++ ++ --config <file> use file <file> as config file ++ --skip-pre <pre> skip pre <pre> ++ --skip-check <check> skip check <check> ++ --skip-action <action> skip action <action> ++ --skip-post <post> skip post <post> ++ --skip-reject <reject> skip reject <reject> ++ --define <key>=<value> pass additional values ++ --clean delete package after success ++ --verbose verbose run ++ --test test run ++ --list <category> list items from given category ++ --help [category] display contextual help ++ ++=head1 DESCRIPTION ++ ++B<youri-submit> allows to submit packages to a repository. ++ ++All packages given on command lines are passed to a list of check plugins, ++depending on given upload target. If none of them fails, all packages are ++passed to a list of action plugins, depending also on given upload target. ++ ++=head1 OPTIONS ++ ++=over ++ ++=item B<--config> I<file> ++ ++Use given file as configuration, instead of normal one. ++ ++=item B<--skip-pre> I<id> ++ ++Skip pre transaction plugin with given identity ++ ++=item B<--skip-check> I<id> ++ ++Skip check plugin with given identity. ++ ++=item B<--skip-action> I<id> ++ ++Skip action plugin with given identity. ++ ++=item B<--skip-post> I<id> ++ ++Skip post transaction plugin with given identity. ++ ++=item B<--skip-reject> I<id> ++ ++Skip reject action plugin with given identity. ++ ++=item B<--define> <key>=<value> ++ ++Define additional parameters, to be used by plugins. ++ ++=item B<--clean> ++ ++Delete submited packages upon successfull submission. ++ ++=item B<--verbose> ++ ++Produce more verbose output (can be used more than once) ++ ++=item B<--test> ++ ++Don't perform any modification. ++ ++=item B<--list> I<category> ++ ++List available items from given category and exits. Category must be either ++B<targets>, B<actions> or B<checks>. A target is needed for the two last ones. ++ ++=item B<--help> I<category> ++ ++Display help for given category and exits. Category must be either ++B<repository>, B<action> or B<check>. An item is needed for the two last ones. ++If no category given, display standard help. ++ ++=back ++ ++=head1 CONFIGURATION ++ ++Configuration is read from the first file found among: ++ ++=over ++ ++=item * the one specified by B<--config> option on command-line ++ ++=item * $HOME/.youri/submit.conf ++ ++=item * /usr/local/etc/youri/submit.conf ++ ++=back ++ ++The configuration file should be a YAML-format files, with the following ++mandatory top-level directives: ++ ++=over ++ ++=item B<repository> ++ ++The definition of repository plugin to be used. ++ ++=item B<targets> ++ ++The list of available submission targets, each one being composed from the ++following keys: ++ ++=over ++ ++=item B<checks> ++ ++The list of check plugins to use for this target. ++ ++=item B<actions> ++ ++The list of action plugins to use for this target. ++ ++=back ++ ++=item B<checks> ++ ++The list of check plugin definitions, indexed by their identity. ++ ++=item B<actions> ++ ++The list of action plugin definitions, indexed by their identity. ++ ++=back ++ ++=head1 SEE ALSO ++ ++Youri::Config, for additional details about configuration file format. ++ ++Each used plugin man page, for available options. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++use strict; ++use warnings; ++ ++use Youri::Config; ++use Youri::Utils; ++use Pod::Usage; ++ ++my $config = Youri::Config->new( ++ args => { ++ 'skip-check' => '=s@', ++ 'skip-action' => '=s@', ++ 'define' => '=s%', ++ 'verbose' => '|v!', ++ 'clean' => '!', ++ 'test' => '|t!', ++ 'list' => '|l!', ++ 'config' => '=s', ++ 'skip-prei' => '=s@', ++ 'skip-post' => '=s@', ++ 'skip-reject' => '=s@', ++ }, ++ directories => [ "$ENV{HOME}/.youri", '@sysconfdir@/youri' ], ++ file => 'submit.conf', ++); ++ ++if ($config->get_arg('list')) { ++ my $category = $ARGV[0]; ++ pod2usage(-verbose => 0, -message => "No category specified, aborting\n") ++ unless $category; ++ if ($category eq 'targets') { ++ print join(' ', keys %{$config->get_param('targets')}); ++ } elsif ($category eq 'checks' || $category eq 'actions') { ++ my $target = $ARGV[1]; ++ pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless $target; ++ if ($category eq 'checks') { ++ my $checks = $config->get_param('targets')->{$target}->{checks}; ++ print join(' ', @{$checks}) if $checks; ++ } else { ++ my $actions = $config->get_param('targets')->{$target}->{actions}; ++ print join(' ', @{$actions}) if $actions; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ print "\n"; ++ exit 0; ++} ++ ++if ($config->get_arg('help')) { ++ my $category = $ARGV[0]; ++ my ($item, $section); ++ if ($category eq 'repository') { ++ $section = $config->get_param('repository'); ++ pod2usage( ++ -verbose => 0, ++ -message => "No repository defined, aborting\n" ++ ) unless $section; ++ } elsif ($category eq 'check' || $category eq 'action') { ++ $item = $ARGV[1]; ++ pod2usage( ++ -verbose => 0, ++ -message => "No item specified, aborting\n" ++ ) unless $item; ++ if ($category eq 'check') { ++ $section = $config->get_param('checks')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such check $item defined, aborting\n" ++ ) unless $section; ++ } else { ++ $section = $config->get_param('actions')->{$item}; ++ pod2usage( ++ -verbose => 0, ++ -message => "No such action $item defined, aborting\n" ++ ) unless $section; ++ } ++ } else { ++ pod2usage(-verbose => 0, -message => "Invalid category $category, aborting\n") ++ } ++ my $file = $section->{class} . '.pm'; ++ $file =~ s/::/\//g; ++ pod2usage( ++ -verbose => 99, ++ -sections => 'NAME|DESCRIPTION', ++ -input => $file, ++ -pathlist => \@INC ++ ); ++} ++ ++ ++pod2usage(-verbose => 0, -message => "No target specified, aborting\n") ++ unless @ARGV > 0; ++pod2usage(-verbose => 0, -message => "No packages specified, aborting\n") ++ unless @ARGV > 1 || $config->get_param('allow_omitting_packages'); ++ ++# convenient global flags ++my $test = $config->get_arg('test'); ++my $verbose = $config->get_arg('verbose'); ++ ++# check target ++my $target = shift @ARGV; ++my $target_conf = $config->get_param('targets')->{$target}; ++ ++# create repository ++my $repository; ++my $repository_conf = $config->get_param('repository'); ++die "No repository declared" unless $repository_conf; ++print "Creating repository\n" if $verbose; ++eval { ++ $repository = create_instance( ++ 'Youri::Repository', ++ $repository_conf, ++ { ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ targets => [ keys %{$config->get_param('targets')} ], ++ } ++ ); ++}; ++die "Failed to create repository: $@\n" if $@; ++ ++# perfrom pre action ++my @errors; ++my $pre_packages = []; ++my $skip_pres = $config->get_arg('skip-pre'); ++my %skip_pres = $skip_pres ? map { $_ => 1 } @{$skip_pres} : (); ++foreach my $id (@{$target_conf->{pres}}) { ++ next if $skip_pres{$id}; ++ print "Creating pre $id\n" if $verbose; ++ my $pre; ++ my $pre_conf = $config->get_param('pres')->{$id}; ++ ++ if (!$pre_conf) { ++ print STDERR "No such pre $id, skipping\n"; ++ next; ++ } ++ eval { ++ $pre = create_instance( ++ 'Youri::Submit::Pre', ++ $pre_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create pre $id: $@\n"; ++ } else { ++ print "running pre $id\n" if $verbose; ++ my @err = $pre->run( ++ $pre_packages, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@errors, @err) if $err[0]; ++ } ++} ++ ++if (@errors) { ++ print "Pre-submission errors, aborting:\n"; ++ foreach my $error (@errors) { ++ print " - $error\n"; ++ } ++ exit(1) ++} ++ ++# create packages group ++my $group_error; ++my @packages_group; ++foreach my $group ([ map { { section => "", file => $_ } } @ARGV ], @$pre_packages) { ++ my @packages; ++ foreach my $opt (@$group) { ++ print "Preparing upload for $opt->{file} in $opt->{section}\n" if $verbose; ++ $repository->{packages}{$opt->{file}}{section} = $opt->{section}; ++ push( ++ @packages, ++ create_instance( ++ 'Youri::Package', ++ { ++ class => $repository->get_package_class(), ++ }, ++ { ++ file => $opt->{file}, ++ %$opt ++ }, ++ ) ++ ); ++ } ++ @packages or next; ++ ++# check all packages pass all tests ++ my %errors; ++ my $skip_check = $config->get_arg('skip-check'); ++ my %skip_check = $skip_check ? map { $_ => 1 } @{$skip_check} : (); ++ my @error; ++ foreach my $id (@{$target_conf->{checks}}) { ++ next if $skip_check{$id}; ++ print "Creating check $id\n" if $verbose; ++ my $check; ++ my $check_conf = $config->get_param('checks')->{$id}; ++ ++ if (!$check_conf) { ++ print STDERR "No such check $id, skipping\n"; ++ next; ++ } ++ eval { ++ $check = create_instance( ++ 'Youri::Submit::Check', ++ $check_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create check $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running check $id on package $package\n" if $verbose; ++ my @errors = $check->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ push(@{$errors{$package}}, @errors) if $errors[0]; ++ } ++ } ++ } ++ if (%errors) { ++ print "Submission errors, aborting:\n"; ++ foreach my $package (keys %errors) { ++ print "- $package:\n"; ++ foreach my $error (@{$errors{$package}}) { ++ print " - $error\n"; ++ } ++ } ++ # reject the packages ++ my $skip_rejects = $config->get_arg('skip-reject'); ++ my %skip_rejects = $skip_rejects ? map { $_ => 1 } @{$skip_rejects} : (); ++ foreach my $id (@{$target_conf->{rejects}}) { ++ next if $skip_rejects{$id}; ++ print "Creating reject $id\n" if $verbose; ++ my $reject; ++ my $reject_conf = $config->get_param('rejects')->{$id}; ++ ++ if (!$reject_conf) { ++ print STDERR "No such reject $id, skipping\n"; ++ next; ++ } ++ eval { ++ $reject = create_instance( ++ 'Youri::Submit::Reject', ++ $reject_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create reject $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running reject $id on package $package\n" if $verbose; ++ eval { ++ $reject->run($package, \%errors, $repository, $target, $config->get_arg('define')); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ $group_error = 1; ++ next ++ } ++ ++# proceed further ++ my $skip_action = $config->get_arg('skip-action'); ++ my %skip_action = $skip_action ? map { $_ => 1 } @{$skip_action} : (); ++ foreach my $id (@{$target_conf->{actions}}) { ++ next if $skip_action{$id}; ++ print "Creating action $id\n" if $verbose; ++ my $action; ++ my $action_conf = $config->get_param('actions')->{$id}; ++ ++ if (!$action_conf) { ++ print STDERR "No such action $id, skipping\n"; ++ next; ++ } ++ eval { ++ $action = create_instance( ++ 'Youri::Submit::Action', ++ $action_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create action $id: $@\n"; ++ } else { ++ foreach my $package (@packages) { ++ print "running action $id on package $package\n" if $verbose; ++ eval { ++ $action->run( ++ $package, ++ $repository, ++ $target, ++ $config->get_arg('define') ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to run action $id on package $package: $@\n"; ++ } ++ } ++ } ++ } ++ ++ if ($config->get_arg('clean')) { ++ foreach my $package (@packages) { ++ print "cleaning file $package\n" if $verbose; ++ unlink $package->as_file(); ++ } ++ } ++} ++ ++# perfrom post action ++my $skip_post = $config->get_arg('skip-post'); ++my %skip_post = $skip_post ? map { $_ => 1 } @{$skip_post} : (); ++foreach my $id (@{$target_conf->{posts}}) { ++ next if $skip_post{$id}; ++ print "Creating post $id\n" if $verbose; ++ my $post; ++ my $post_conf = $config->get_param('posts')->{$id}; ++ ++ if (!$post_conf) { ++ print STDERR "No such post $id, skipping\n"; ++ next; ++ } ++ eval { ++ $post = create_instance( ++ 'Youri::Submit::Post', ++ $post_conf, ++ { ++ id => $id, ++ test => $test, ++ verbose => $verbose > 0 ? $verbose - 1 : 0, ++ } ++ ); ++ }; ++ if ($@) { ++ print STDERR "Failed to create post $id: $@\n"; ++ } else { ++ print "running post $id\n" if $verbose; ++ my @err = $post->run($repository, $target, $config->get_arg('define')); ++ print STDERR "Error $id: @err\n" if @err ++ } ++} ++ ++exit(1) if $group_error; + + +Property changes on: build_system/mdv-youri-submit/trunk/bin/youri-submit.in +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyourisubmittrunketcbash_completiondyourisubmit">Added: build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit (rev 0) ++++ build_system/mdv-youri-submit/trunk/etc/bash_completion.d/youri-submit 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,60 @@ ++# youri-submit completion ++# $Id$ ++ ++_youri-submit() ++{ ++ ++ local cur prev config ++ ++ COMPREPLY=() ++ cur=${COMP_WORDS[COMP_CWORD]} ++ prev=${COMP_WORDS[COMP_CWORD-1]} ++ ++ case "$prev" in ++ --config) ++ _filedir ++ return 0 ++ ;; ++ --list) ++ COMPREPLY=( $( compgen -W 'targets checks actions' -- $cur ) ) ++ return 0 ++ ;; ++ --help) ++ COMPREPLY=( $( compgen -W 'repository check action' -- $cur ) ) ++ return 0 ++ ;; ++ esac ++ ++ if [[ "$cur" == -* ]]; then ++ COMPREPLY=( $( compgen -W '--define --clean -l --list -h --help -t \ ++ --test -v --verbose' -- $cur ) ) ++ # add dangereous option for main command ++ if [[ ${COMP_WORDS[0]} == youri-submit ]]; then ++ COMPREPLY=( $( compgen -W '${COMPREPLY[@]} --config --skip-check \ ++ --skip-action' -- $cur ) ) ++ fi ++ else ++ _count_args ++ case $args in ++ 1) ++ _find_config ++ COMPREPLY=( $( compgen -W '$( youri-submit $config --list targets )' -- $cur ) ) ++ ;; ++ *) ++ _filedir ++ ;; ++ esac ++ fi ++ ++} ++complete -F _youri-submit youri-submit youri-submit-restricted youri-submit-proxy ++ ++_find_config() ++{ ++ for (( i=1; i < COMP_CWORD; i++ )); do ++ if [[ "${COMP_WORDS[i]}" == --config ]]; then ++ config="--config ${COMP_WORDS[i+1]}" ++ break ++ fi ++ done ++} + +<a id="build_systemmdvyourisubmittrunketcsubmitconf">Added: build_system/mdv-youri-submit/trunk/etc/submit.conf</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/etc/submit.conf (rev 0) ++++ build_system/mdv-youri-submit/trunk/etc/submit.conf 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,134 @@ ++# youri-submit sample configuration file ++# $Id: submit.conf 1723 2006-10-17 13:53:27Z warly $ ++ ++# helper variables ++home: /home/user ++ ++# repository definition ++repository: ++ class: Youri::Repository::PLF ++ options: ++ install_root: ${home}/ftp/mandriva ++ version_root: ${home}/cvs ++ archive_root: ${home}/backup/mandriva ++ noarch: i586 ++ ++# targets definitions ++targets: ++ cooker: ++ checks: ++ - tag ++ - recency ++ - history ++ actions: ++ - sign ++ - install ++ - link ++ - archive ++ - clean ++ - bugzilla ++ - cvs ++ - mail ++ - rss ++ ++ 2006.0: ++ checks: ++ - type ++ - tag ++ - recency ++ - history ++ - precedence ++ actions: ++ - sign ++ - install ++ - link ++ - archive ++ - clean ++ ++# checks definitions ++checks: ++ tag: ++ class: Youri::Submit::Check::Tag ++ options: ++ tags: ++ release: 'plf$' ++ packager: '<\w+@zarb\.org>$' ++ distribution: '^Mandriva Linux$' ++ vendor: '^Penguin Liberation Front$' ++ ++ recency: ++ class: Youri::Submit::Check::Recency ++ ++ history: ++ class: Youri::Submit::Check::History ++ ++ precedence: ++ class: Youri::Submit::Check::Precedence ++ options: ++ target: cooker ++ ++ type: ++ class: Youri::Submit::Check::Type ++ type: binary ++ ++# actions definitions ++actions: ++ sign: ++ class: Youri::Submit::Action::Sign ++ options: ++ name: plf@zarb.org ++ path: ${home}/.gnupg ++ passphrase: s3kr3t ++ ++ install: ++ class: Youri::Submit::Action::Install ++ ++ link: ++ class: Youri::Submit::Action::Link ++ ++ archive: ++ class: Youri::Submit::Action::Archive ++ ++ clean: ++ class: Youri::Submit::Action::Clean ++ ++ mail: ++ class: Youri::Submit::Action::Mail ++ options: ++ mta: /usr/sbin/sendmail ++ to: plf-announce@zarb.org ++ reply_to: plf-discuss@zarb.org ++ from: plf@zarb.org ++ prefix: RPM ++ cc: ++ hot-base: david@dindinx.org bellamy@neverland.net ++ dcgui: mathen@ketelhot.de ++ dclib: mathen@ketelhot.de ++ Video-DVDRip: dvdrip-users@exit1.org ++ hackVideo-DVDRip: dvdrip-users@exit1.org ++ goosnes: tak@bard.sytes.net ++ avidemux: fixounet@free.fr ++ vobcopy: robos@muon.de ++ drip: drip-devel@lists.sourceforge.net ++ libdscaler: vektor@dumbterm.net ++ xawdecode: pingus77@ifrance.com ++ ++ rss: ++ class: Youri::Submit::Action::RSS ++ options: ++ file: ${home}/www/changelog.rss ++ title: PLF packages updates ++ link: http://plf.zarb.org/ ++ description: ChangeLog for PLF packages ++ ++ cvs: ++ class: Youri::Submit::Action::CVS ++ ++ bugzilla: ++ class: Youri::Submit::Action::Bugzilla ++ options: ++ host: localhost ++ base: plf_bugs ++ user: plf ++ pass: s3kr3t ++ contact: plf@zarb.org + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionArchivepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Archive.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,90 @@ ++# $Id: Archive.pm 265457 2010-01-28 13:09:30Z pterjan $ ++package Youri::Submit::Action::Archive; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Archive - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # FIXME: workaround for $self->{_verbose} not being initialized properly ++ $self->{_verbose} = 1; ++ # all this should be in Mandriva_upload.pm ++ my $section = $repository->_get_section($package, $target, $define); ++ my $main_section = $repository->_get_main_section($package, $target, $define); ++ print "section $section main_section $main_section\n" if $self->{_verbose}; ++ my $arch = $package->get_arch(); ++ $arch = $self->{_noarch} if $arch eq 'noarch'; ++ my $path = $arch eq 'src' ? "$target/SRPMS" : "$target/$arch/media"; ++ $path = "$repository->{_install_root}/$path"; ++ $path =~ s,/+,/,g; ++ foreach my $replaced_package ( ++ $repository->get_replaced_packages($package, $target, $define) ++ ) { ++ my $file = $replaced_package->get_file(); ++ ++ # trap for debugging bug 34999 ++ if ($file =~ /\/[\d.]+\/(main\/updates|.*\/release)/) { ++ my $bugmsg = "BUG#34999 WARNING: trying to remove from a release: $file\n"; ++ open(BUG34999LOG, '>>', "/home/mandrake/bug34999.log"); ++ print $bugmsg; ++ print BUG34999LOG localtime().": ".$bugmsg; ++ close BUG34999LOG; ++ ++ next; ++ } ++ ++ my ($rep_section, $rep_main_section) = $file =~ m,$path/(([^/]+)/.*)/[^/]+.rpm,; ++ # We do accept duplicate version for other submedia of the same main media section ++ print "(path '$path') file '$file' section '$rep_section' main_section '$rep_main_section'\n" if $self->{_verbose}; ++ next if $rep_main_section eq $main_section && $rep_section ne $section; ++ my $dest = $repository->get_archive_dir($package, $target, $define); ++ ++ print "archiving file $file to $dest\n" if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest") ++ unless -d $dest; ++ ++ # install file to new location ++ system("install -m $self->{_perms} $file $dest"); ++ ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionBugzillapm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Bugzilla.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,81 @@ ++# $Id: Bugzilla.pm 1700 2006-10-16 12:57:42Z warly $ ++package Youri::Submit::Action::Bugzilla; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Bugzilla - Bugzilla synchronisation ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures synchronisation with Bugzilla. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Bugzilla; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ host => '', ++ base => '', ++ user => '', ++ pass => '', ++ contact => '', ++ @_ ++ ); ++ ++ $self->{_bugzilla} = Youri::Bugzilla->new( ++ $options{host}, ++ $options{base}, ++ $options{user}, ++ $options{pass} ++ ); ++ $self->{_contact} = $options{contact}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $summary = $package->get_summary(); ++ my $packager = $package->get_packager(); ++ $packager =~ s/.*<(.*)>/$1/; ++ ++ if ($self->{_bugzilla}->has_package($name)) { ++ my %versions = ++ map { $_ => 1 } ++ $self->{_bugzilla}->get_versions($name); ++ unless ($versions{$version}) { ++ print "adding version $version to bugzilla\n" if $self->{_verbose}; ++ $self->{_bugzilla}->add_version($name, $version) ++ unless $self->{_test}; ++ } ++ } else { ++ print "adding package $name to bugzilla\n" if $self->{_verbose}; ++ $self->{_bugzilla}->add_package( ++ $name, ++ $summary, ++ $version, ++ $packager, ++ $self->{_contact} ++ ) unless $self->{_test}; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionCVSpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/CVS.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,135 @@ ++# $Id: CVS.pm 224115 2007-07-02 09:17:15Z pixel $ ++package Youri::Submit::Action::CVS; ++ ++=head1 NAME ++ ++Youri::Submit::Action::CVS - CVS versionning ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures CVS versionning of package sources. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Cwd; ++use File::Temp qw/tempdir/; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ exclude => '\.(tar(\.(gz|bz2))?|zip)$', ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_exclude} = $options{exclude}; ++ $self->{_perms} = $options{perms}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ ++ my $root = $repository->get_version_root(); ++ my $path = $repository->get_version_path($package, $target, $define); ++ ++ # remember original directory ++ my $original_dir = cwd(); ++ ++ # get a safe temporary directory ++ my $dir = tempdir( CLEANUP => 1 ); ++ chdir $dir; ++ ++ # first checkout base directory only ++ system("cvs -Q -d $root co -l $path"); ++ ++ # try to checkout package directory ++ my $dest = $path . '/' . $name; ++ system("cvs -Q -d $root co $dest"); ++ ++ # create directory if previous import failed ++ unless (-d $dest) { ++ print "adding directory $dest\n" if $self->{_verbose}; ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest"); ++ system("cvs -Q -d $root add $dest"); ++ } ++ ++ chdir $dest; ++ ++ # remove all files ++ unlink grep { -f } glob '*'; ++ ++ # extract all rpm files locally ++ $package->extract(); ++ ++ # remove excluded files ++ if ($self->{_exclude}) { ++ unlink grep { -f && /$self->{_exclude}/ } glob '*'; ++ } ++ ++ # uncompress all compressed files ++ system("bunzip2 *.bz2 2>/dev/null"); ++ system("gunzip *.gz 2>/dev/null"); ++ ++ my (@to_remove, @to_add, @to_add_binary); ++ foreach my $line (`cvs -nq update`) { ++ if ($line =~ /^\? (\S+)/) { ++ if (-B $1) { ++ push(@to_add_binary, $1); ++ } else { ++ push(@to_add, $1); ++ } ++ } ++ if ($line =~ /^U (\S+)/) { ++ push(@to_remove, $1); ++ } ++ } ++ if (@to_remove) { ++ my $to_remove = join(' ', @to_remove); ++ print "removing file(s) $to_remove\n" if $self->{_verbose}; ++ system("cvs -Q remove $to_remove"); ++ } ++ if (@to_add) { ++ my $to_add = join(' ', @to_add); ++ print "adding text file(s) $to_add\n" if $self->{_verbose}; ++ system("cvs -Q add $to_add"); ++ } ++ if (@to_add_binary) { ++ my $to_add_binary = join(' ', @to_add_binary); ++ print "adding binary file(s) $to_add_binary\n" if $self->{_verbose}; ++ system("cvs -Q add -kb $to_add_binary"); ++ } ++ ++ print "committing current directory\n" if $self->{_verbose}; ++ system("cvs -Q commit -m $version-$release") unless $self->{_test}; ++ ++ # tag new release ++ my $tag = "r$version-$release"; ++ $tag =~ s/\./_/g; ++ print "tagging current directory as $tag\n" if $self->{_verbose}; ++ system("cvs -Q tag $tag") unless $self->{_test}; ++ ++ # get back to original directory ++ chdir $original_dir; ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionCleanpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Clean.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,40 @@ ++# $Id: Clean.pm 4742 2007-01-30 09:49:58Z pixel $ ++package Youri::Submit::Action::Clean; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Clean - Old revisions cleanup ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures cleanup of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ foreach my $replaced_package ( ++ $repository->get_replaced_packages($package, $target, $define) ++ ) { ++ my $file = $replaced_package->as_file(); ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionDkmsModuleInfopm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/DkmsModuleInfo.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,111 @@ ++# $Id$ ++package Youri::Submit::Action::DkmsModuleInfo; ++ ++=head1 NAME ++ ++Youri::Submit::Action::DkmsModuleInfo - extract and commit info from dkms package. ++ ++=head1 DESCRIPTION ++ ++This action plugin extract modalias and description from dkms packages and commit them ++on a SVN module. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++use File::Temp qw/tempdir/; ++use File::Basename; ++use SVN::Client; ++ ++#- inlineed from MDK::Common::Various ++sub chomp_ { my @l = @_; chomp @l; wantarray() ? @l : $l[0] } ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ croak "undefined svn module" unless $options{svn_module}; ++ ++ foreach my $var ('svn_module') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my ($dkms_name) = $package->get_canonical_name =~ /^dkms-(.*)$/ or return; ++ my $package_name = $package->get_name; ++ my ($kver) = $package_name =~ /^$dkms_name-kernel-(.*)$/ or return; ++ ++ my @files = map { $_->[0] } $package->get_files; ++ my @module_files = grep { m!^(/lib/modules/|/var/lib/dkms-binary/).*\.ko(\.gz)?$! } @files ++ or return; ++ ++ print "Submit::Action::DkmsModuleInfo: proceeding with $package_name\n" if $self->{_verbose}; ++ ++ my $tempdir = tempdir(CLEANUP => 1); ++ my $file = $package->as_file; ++ my $cmd = "rpm2cpio $file | (cd $tempdir ; cpio --quiet -id)"; ++ print "Submit::Action::DkmsModuleInfo: doing $cmd\n" if $self->{_verbose}; ++ if (system($cmd) != 0) { ++ print "Submit::Action::DkmsModuleInfo: failed!\n" if $self->{_verbose}; ++ return; ++ } ++ ++ my @fields = qw(description alias); ++ ++ my (%modules); ++ foreach my $file (@module_files) { ++ print "Submit::Action::DkmsModuleInfo: extracting $file\n" if $self->{_verbose}; ++ my $module = $file; ++ $module =~ s!.*/!!; ++ $module =~ s!\.ko(\.gz)$!!; ++ $modules{$module}{$_} = [ chomp_(`/sbin/modinfo -F $_ $tempdir$file`) ] ++ foreach @fields; ++ } ++ ++ eval { ++ my $svn = SVN::Client->new(); ++ my $dir = $tempdir . '/' . basename($self->{_svn_module}); ++ my $revision = $svn->checkout($self->{_svn_module}, $dir, 'HEAD', 0); ++ my $vdir = $dir . '/' . $kver; ++ $svn->update($vdir, 'HEAD', 0); ++ -d $vdir or $svn->mkdir($vdir); ++ foreach my $module (keys %modules) { ++ print "Submit::Action::DkmsModuleInfo: adding module $module\n" if $self->{_verbose}; ++ foreach my $field (@fields) { ++ my $file = "$vdir/$module.$field"; ++ $svn->update($file, 'HEAD', 0); ++ my $exists = -f $file; ++ open(my $fh, ">", $file); ++ print $fh map { "$_\n" } @{$modules{$module}{$field}}; ++ $svn->add($file, 1) if !$exists; ++ } ++ } ++ ++ $svn->log_msg(sub { $_[0] = \"add dkms info for $dkms_name with kernel $kver" }); ++ $svn->commit($vdir, 0); ++ }; ++ if (my $error = $@) { ++ print "Submit::Action::DkmsModuleInfo: commit to svn failed ($error)!\n" if $self->{_verbose}; ++ return; ++ } ++ ++ 1; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionInstallpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Install.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,74 @@ ++# $Id: Install.pm 229772 2007-09-26 11:21:07Z blino $ ++package Youri::Submit::Action::Install; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Install - Package installation ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures installation of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->as_file(); ++ my $rpm = $package->get_file_name(); ++ my $dest = $repository->get_install_dir($package, $target, $define); ++ ++ # FIXME remove prefix this should be done by a function ++ $rpm =~ s/^\d{14}\.\w*\.\w+\.\d+_//; ++ $rpm =~ s/^\@\d+://; ++ print "installing file $file to $dest/$rpm\n" if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ if (! -d $dest) { ++ my $status = ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest"); ++ croak "Unable to create directory $dest: $?" if $status; ++ } ++ ++ # install file to new location ++ my $status = ++ system("install -m $self->{_perms} $file $dest/$rpm"); ++ croak "Unable to install file $file to $dest/$rpm: $?" if $status; ++ ++ my $arch = $package->get_arch(); ++ $repository->set_arch_changed($target, $arch); ++ $repository->set_install_dir_changed($dest); ++ } ++ $package->{_file} = "$dest/$rpm"; ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionLinkpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Link.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,80 @@ ++# $Id: Link.pm 233641 2008-01-31 16:35:55Z pixel $ ++package Youri::Submit::Action::Link; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Link - Noarch packages linking ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures linking of noarch packages between arch-specific ++directories. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Cwd; ++use File::Spec; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ symbolic => 0, # use symbolic linking ++ @_ ++ ); ++ ++ $self->{_symbolic} = $options{symbolic}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # only needed for noarch packages ++ return unless $package->get_arch() eq 'noarch'; ++ ++ my $default_dir = $repository->get_install_dir($package, $target, $define); ++ my $file = $package->get_file_name(); ++ ++ # FIXME remove prefix this should be done by a function ++ $file =~ s/^\d{14}\.\w*\.\w+\.\d+_//; ++ $file =~ s/^\@\d+://; ++ ++ foreach my $arch ($repository->get_extra_arches()) { ++ # compute installation target, forcing arch ++ my $other_dir = $repository->get_install_dir( ++ $package, ++ $target, ++ $define, ++ { arch => $arch } ++ ); ++ ++ if (! $self->{_test}) { ++ my $current_dir = cwd(); ++ chdir $other_dir; ++ my $default_file = File::Spec->abs2rel($default_dir) . '/' . $file; ++ if ($self->{_symbolic}) { ++ symlink $default_file, $file; ++ } else { ++ link $default_file, $file; ++ } ++ chdir $current_dir; ++ print "set_install_dir_changed($other_dir) for updated $file\n"; ++ $repository->set_install_dir_changed($other_dir); ++ $repository->set_arch_changed($target, $arch); ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionMailpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Mail.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,131 @@ ++# $Id: Mail.pm 223952 2007-06-23 13:54:13Z pixel $ ++package Youri::Submit::Action::Mail; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Mail - Mail notification ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures mail notification of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use MIME::Entity; ++use Encode qw/from_to/; ++use Carp; ++use Youri::Package; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ mta => '/usr/sbin/sendmail', ++ to => '', ++ from => '', ++ cc => '', ++ prefix => '', ++ encoding => 'quoted-printable', ++ charset => 'iso-8859-1', ++ @_ ++ ); ++ ++ croak "undefined mail MTA" unless $options{mta}; ++ croak "invalid mail MTA $options{mta}" unless -x $options{mta}; ++ croak "undefined to" unless $options{to}; ++ if ($options{cc}) { ++ croak "cc should be an hashref" unless ref $options{cc} eq 'HASH'; ++ } ++ croak "invalid charset $options{charset}" ++ unless Encode::resolve_alias($options{charset}); ++ ++ $self->{_mta} = $options{mta}; ++ $self->{_to} = $options{to}; ++ $self->{_from} = $options{from}; ++ $self->{_cc} = $options{cc}; ++ $self->{_prefix} = $options{prefix}; ++ $self->{_encoding} = $options{encoding}; ++ $self->{_charset} = $options{charset}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $from = $package->get_packager(); ++ ++ # force from adress if defined ++ $from =~ s/<.*>/<$self->{_from}>/ if $self->{_from}; ++ ++ my $subject = $self->get_subject($package, $repository, $target, $define); ++ my $content = $self->get_content($package, $repository, $target, $define); ++ ++ # ensure proper codeset conversion ++ # for informations coming from package ++ my $charset = $repository->get_package_charset(); ++ from_to($content, $charset, $self->{_charset}); ++ from_to($subject, $charset, $self->{_charset}); ++ ++ my $mail = MIME::Entity->build( ++ Type => 'text/plain', ++ Charset => $self->{_charset}, ++ Encoding => $self->{_encoding}, ++ From => $from, ++ To => $self->{_to}, ++ Subject => $subject, ++ Data => $content, ++ ); ++ ++ if ($self->{_cc}) { ++ my $cc = $self->{_cc}->{$package->get_name()}; ++ $mail->head()->add('cc', $cc) if $cc; ++ } ++ ++ if ($self->{_test}) { ++ $mail->print(\*STDOUT); ++ } else { ++ open(MAIL, "| $self->{_mta} -t -oi -oem") or die "Can't open MTA program: $!"; ++ $mail->print(\*MAIL); ++ close MAIL; ++ } ++ ++} ++ ++sub get_subject { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $section = $repository->_get_section($package, $target, $define); ++ return ++ ($self->{_prefix} ? '[' . $self->{_prefix} . '] ' : '' ) . ++ "$target " . ($section ? "$section " : '' ) . ++ $package->as_formated_string('%{name}-%{version}-%{release}'); ++} ++ ++sub get_content { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $information = $package->get_information(); ++ my $last_change = $package->get_last_change(); ++ ++ return ++ $information . "\n" . ++ $last_change->[Youri::Package::CHANGE_AUTHOR] . ":\n" . ++ $last_change->[Youri::Package::CHANGE_TEXT]; ++} ++ ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionMarkreleasepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Markrelease.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,56 @@ ++# $Id: Markrelease.pm 4743 2007-01-30 09:58:30Z pixel $ ++package Youri::Submit::Action::Markrelease; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Markrelease - calls markrelease ++ ++=head1 DESCRIPTION ++ ++This action plugin calls markrelease ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $package->is_source or return 1; ++ my $file = $package->get_file(); ++ my $srpm_name = $package->get_canonical_name; ++ ++ if ($repository->package_in_svn($srpm_name)) { ++ my $svn = $repository->get_svn_url(); ++ my ($rev) = $file =~ /.*\/.*?\@(\d+):/; ++ print "Run repsys markrelease -f $file -r $rev $svn/$srpm_name\n"; ++ # FIXME repsys ask for a username and password ++ # FIXME we should use the key in /var/home/mandrake so that /home/mandrake does not ++ # need to be mounted ++ system('repsys', 'markrelease', '-f', $file, '-r', $rev, "$svn/$srpm_name"); ++ } ++ 1 ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionRSSpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/RSS.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,102 @@ ++# $Id: RSS.pm 1700 2006-10-16 12:57:42Z warly $ ++package Youri::Submit::Action::RSS; ++ ++=head1 NAME ++ ++Youri::Submit::Action::RSS - RSS notification ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures RSS notification of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use XML::RSS; ++use Encode qw/from_to/; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ file => '', ++ title => '', ++ link => '', ++ description => '', ++ charset => 'iso-8859-1', ++ max_items => 10, ++ @_ ++ ); ++ ++ croak "undefined rss file" unless $options{file}; ++ croak "invalid charset $options{charset}" ++ unless Encode::resolve_alias($options{charset}); ++ ++ $self->{_file} = $options{file}; ++ $self->{_title} = $options{title}; ++ $self->{_link} = $options{link}; ++ $self->{_description} = $options{description}; ++ $self->{_charset} = $options{charset}; ++ $self->{_max_items} = $options{max_items}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $package->is_source(); ++ ++ my $subject = $package->as_formated_string('%{name}-%{version}-%{release}'); ++ my $content = $package->get_information(); ++ ++ $content =~ s/$/<br\/>/mg; ++ ++ # ensure proper codeset conversion ++ # for informations coming from package ++ my $charset = $repository->get_package_charset(); ++ from_to($content, $charset, $self->{_charset}); ++ from_to($subject, $charset, $self->{_charset}); ++ ++ my $rss = XML::RSS->new( ++ encoding => $self->{_charset}, ++ encode_output => 1 ++ ); ++ ++ my $file = $self->{_file}; ++ if (-e $file) { ++ $rss->parsefile($file); ++ splice(@{$rss->{items}}, $self->{_max_items}) ++ if @{$rss->{items}} >= $self->{_max_items}; ++ } else { ++ $rss->channel( ++ title => $self->{_title}, ++ link => $self->{_link}, ++ description => $self->{_description}, ++ language => 'en' ++ ); ++ } ++ ++ $rss->add_item( ++ title => $subject, ++ description => $content, ++ mode => 'insert' ++ ); ++ ++ if ($self->{_test}) { ++ print $rss->as_string(); ++ } else { ++ $rss->save($file); ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionRpminfopm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Rpminfo.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,69 @@ ++# $Id: Rpminfo.pm 4742 2007-01-30 09:49:58Z pixel $ ++package Youri::Submit::Action::Rpminfo; ++ ++=head1 NAME ++ ++Youri::Submit::Action::RpmInfo - Creates .info files ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures the creation of .info files ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ uphost => '', ++ user => '', ++ ssh_key => '', ++ verbose => '', ++ @_ ++ ); ++ croak "undefined upload host" unless $options{uphost}; ++ croak "undefined ssh key" unless $options{ssh_key}; ++ ++ foreach my $var ('perms', 'user', 'uphost', 'ssh_key', 'verbose') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $dest = $repository->get_upload_dir($package, $target, $define); ++ ++ print "Caching rpm information $file on $dest\n" if $self->{_verbose}; ++ my $base = basename ($file); ++ $dest =~ s/\/[0-9]{14}\./\/*./; ++ ++ my $cmd = "ssh -i $self->{_ssh_key} $self->{_user}\@$self->{_uphost} \"srpm=`echo /$dest$base`; rpm -q --qf '\%{name}\n\%{epoch}\n\%{version}-\%{release}\n\%{summary}\n' -p \\\$srpm > \\\$srpm.info\""; ++ print "Submit::Action::RpmInfo: doing $cmd\n" if $self->{_verbose}; ++ if (!$self->{_test}) { ++ if (!system($cmd)) { ++ print "Submit::Action::RpmInfo: rpminfo succeeded!\n"; ++ return 1 ++ } ++ print "Submit::Action::RpmInfo: rpminfo failed!\n"; ++ } ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionSendpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Send.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,77 @@ ++# $Id: Send.pm 4744 2007-01-30 09:59:07Z pixel $ ++package Youri::Submit::Action::Send; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Send - upload package ++ ++=head1 DESCRIPTION ++ ++This action plugin uploads the package on uphost ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ uphost => '', ++ user => '', ++ ssh_key => '', ++ verbose => '', ++ keep_svn_release => '', ++ @_ ++ ); ++ croak "undefined upload host" unless $options{uphost}; ++ croak "undefined ssh key" unless $options{ssh_key}; ++ ++ foreach my $var ('perms', 'user', 'uphost', 'ssh_key', 'verbose', 'keep_svn_release') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $dest = $repository->get_upload_dir($package, $target, $define); ++ ++ print "Sending file $file to $dest\n" if $self->{_verbose}; ++ my $base; ++ if ($self->{_keep_svn_release}) { ++ $base = basename($file) ++ } else { ++ ($base) = $file =~ /.*\/(?:@\d+:)?([^\/]*)/ ++ } ++ ++ my $cmd = "scp -i $self->{_ssh_key} $file $self->{_user}\@$self->{_uphost}:/$dest$base.new"; ++ my $cmd2 = "ssh -i $self->{_ssh_key} $self->{_user}\@$self->{_uphost} \"mv /$dest$base.new /$dest$base\""; ++ print "Submit::Action::Send: doing $cmd\n$cmd2\n" if 1 || $self->{_verbose}; ++ if (!$self->{_test}) { ++ if (!system($cmd)) { ++ if (!system($cmd2)) { ++ print "Submit::Action::Send: upload succeeded!\n"; ++ return 1 ++ } ++ } ++ print "Submit::Action::Send: upload failed!\n"; ++ } ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionSendcachepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sendcache.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,81 @@ ++# $Id: Sendcache.pm 232350 2007-12-07 18:26:17Z spuk $ ++package Youri::Submit::Action::Sendcache; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Sendcache - upload package to cache ++ ++=head1 DESCRIPTION ++ ++This action plugin uploads the package on uphost ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ uphost => '', ++ user => '', ++ ssh_key => '', ++ verbose => '', ++ root => '', ++ debug_pkgs => 0, ++ @_ ++ ); ++ croak "undefined upload host" unless $options{uphost}; ++ croak "undefined ssh key" unless $options{ssh_key}; ++ ++ foreach my $var ('perms', 'user', 'uphost', 'ssh_key', 'verbose', 'root', 'debug_pkgs') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # only cache debug packages if option debug_pkgs is true ++ return if ($package->is_debug() && !$self->{_debug_pkgs}); ++ ++ my $file = $package->get_file(); ++ my $dest = $repository->get_upload_dir($package, $target, $define); ++ $dest =~ s!$repository->{_upload_root}/$repository->{_queue}!$self->{_root}!; ++ ++ print "Sending file $file to $dest\n" if $self->{_verbose}; ++ my $destfile = "$dest".basename($file); ++ $destfile =~ s,/[^/_]+_([^/]+)$,/$1,; ++ $destfile =~ s,/@\d+:,/,; ++ my $destfilehidden = $destfile; ++ $destfilehidden =~ s,/([^/]+)$,/.$1,; ++ ++ my $cmd = "scp -i $self->{_ssh_key} $file $self->{_user}\@$self->{_uphost}:/$destfilehidden"; ++ my $cmd2 = "ssh -i $self->{_ssh_key} $self->{_user}\@$self->{_uphost} \"mv /$destfilehidden /$destfile\""; ++ print "Submit::Action::Send: doing $cmd\n$cmd2\n" if 1 || $self->{_verbose}; ++ if (!$self->{_test}) { ++ if (!system($cmd)) { ++ if (!system($cmd2)) { ++ print "Submit::Action::Sendcache: upload succeeded!\n"; ++ return 1 ++ } ++ } ++ print "Submit::Action::Sendcache: upload failed!\n"; ++ } ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionSignpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Sign.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,56 @@ ++# $Id: Sign.pm 1700 2006-10-16 12:57:42Z warly $ ++package Youri::Submit::Action::Sign; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Sign - GPG signature ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures GPG signature of packages. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ name => '', ++ path => $ENV{HOME} . '/.gnupg', ++ passphrase => '', ++ @_ ++ ); ++ ++ croak "undefined name" unless $options{name}; ++ croak "undefined path" unless $options{path}; ++ croak "invalid path $options{path}" unless -d $options{path}; ++ ++ $self->{_name} = $options{name}; ++ $self->{_path} = $options{path}; ++ $self->{_passphrase} = $options{passphrase}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $package->sign( ++ $self->{_name}, ++ $self->{_path}, ++ $self->{_passphrase} ++ ) unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionUnpackpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/Unpack.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,82 @@ ++# $Id: Unpack.pm 115370 2007-01-30 09:59:07Z pixel $ ++package Youri::Submit::Action::Unpack; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Unpack - unpack package files ++ ++=head1 DESCRIPTION ++ ++This action plugin unpack package files somewhere. ++When unpack_inside_distribution_root is set, dest_directory is relative to the distribution root. ++When the package is a noarch, the wanted files are unpacked in distribution root of each archs. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Temp qw/tempdir/; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ croak "undefined package name" unless $options{name}; ++ croak "undefined source sub directory" unless $options{source_subdir}; ++ croak "undefined destination directory" unless $options{dest_directory}; ++ ++ foreach my $var ('name', 'dest_directory', 'source_subdir', 'grep_files', 'unpack_inside_distribution_root') { ++ $self->{"_$var"} = $options{$var}; ++ } ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $package->get_name eq $self->{_name} or return; ++ ++ my @dests = $self->{_unpack_inside_distribution_root} ? ++ (map { "$_/$self->{_dest_directory}" } $repository->get_distribution_roots($package, $target)) ++ : $self->{_dest_directory}; ++ my $file = $package->as_file; ++ print "Unpacking rpm $file$self->{_source_subdir} to @dests\n" if $self->{_verbose}; ++ ++ my $tempdir = tempdir(CLEANUP => 1); ++ ++ my $cmd = "rpm2cpio $file | (cd $tempdir ; cpio -id)"; ++ print "Submit::Action::Unpack: doing $cmd\n" if $self->{_verbose}; ++ if (!$self->{_test} && system($cmd) != 0) { ++ print "Submit::Action::Unpack: failed!\n" if $self->{_verbose}; ++ return; ++ } ++ ++ foreach my $dest (@dests) { ++ my $find_grep = $self->{_grep_files} ? "find | grep '$self->{_grep_files}'" : 'find'; ++ my $cmd = "cd $tempdir/$self->{_source_subdir}; $find_grep | cpio -pdu $dest"; ++ print "Submit::Action::Unpack: doing $cmd\n" if $self->{_verbose}; ++ if (!$self->{_test}) { ++ my @l = glob("$tempdir/$self->{_source_subdir}"); ++ if (@l == 1 && -d $l[0]) { ++ if (system($cmd) != 0) { ++ print "Submit::Action::Unpack: failed!\n" if $self->{_verbose}; ++ } ++ } else { ++ print "Submit::Action::Unpack: directory $self->{_source_subdir} doesn't exist in package $self->{_name}\n"; ++ } ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionUpdateMdvDbpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action/UpdateMdvDb.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,62 @@ ++# $Id$ ++package Youri::Submit::Action::UpdateMdvDb; ++ ++=head1 NAME ++ ++Youri::Submit::Action::UpdateMdvDb - Mandriva maintainers database updater ++ ++=head1 DESCRIPTION ++ ++This action plugin calls an external script to update last commit info, as ++well as add new packages, in the package maintainers database at ++<http://maint.mandriva.com/>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Action/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++ ++ # path for mdvdb-updaterep script ++ $self->{_mdvdb_updaterep} = $options{mdvdb_updaterep}; ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # only SRPMs matter ++ return unless $package->is_source(); ++ ++ unless ($self->{_test}) { ++ my $pkg_name = $package->get_name(); ++ my $pkg_media = $repository->_get_main_section($package, $target, $define); ++ $package->get_packager() =~ m/(\w[-_.\w]+\@[-_.\w]+)\W/; ++ my $pkg_commiter = $1; ++ ++ if (system($self->{_mdvdb_updaterep}, "update", $pkg_name, $pkg_media, $pkg_commiter, "youri")) { ++ print "ERROR: ".$self->{_mdvdb_updaterep}." failed for '$pkg_name', '$pkg_media', '$pkg_commiter'.\n"; ++ } else { ++ print "Updated package maintainers DB for '$pkg_name', '$pkg_media', '$pkg_commiter'.\n" if $self->{_verbose}; ++ } ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2007, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitActionpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Action.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Base.pm 631 2006-01-26 22:22:23Z guillomovitch $ ++package Youri::Submit::Action; ++ ++=head1 NAME ++ ++Youri::Submit::Action - Abstract action plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines action plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckACLpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/ACL.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,71 @@ ++# $Id: ACL.pm 4817 2007-02-09 19:39:05Z blino $ ++package Youri::Submit::Check::ACL; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++my $acl; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ acl_file => '', ++ @_ ++ ); ++ $acl = get_acl($options{acl_file}); ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $file = $package->get_full_name(); ++ my $arch = $package->get_arch(); ++ my $srpm = $package->get_canonical_name; ++ my $section = $repository->_get_section($package, $target, $define); ++ my $user = $define->{user}; ++ foreach my $t (keys %$acl) { ++ next if $target !~ /$t/; ++ foreach my $acl (@{$acl->{$t}}) { ++ my ($a, $media, $r, $users) = @$acl; ++ next if $arch !~ $a || $srpm !~ $r || $section !~ $media; ++ if ($user =~ /$users/) { ++ return ++ } else { ++ return "$user is not authorized to upload packages belonging to $srpm in section $section (authorized persons: " . join(', ', split '\|', $users) . ")"; ++ } ++ } ++ } ++ return ++} ++ ++sub get_acl { ++ my ($file) = @_; ++ my %acl; ++ open my $f, $file; ++ while (<$f>) { ++ my ($dis, $arch, $media, $regexp, $users) = split ' '; ++ push @{$acl{$dis}}, [ $arch , $media, $regexp, $users ] ++ } ++ \%acl ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckHistorypm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/History.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,61 @@ ++# $Id: History.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::History; ++ ++=head1 NAME ++ ++Youri::Submit::Check::History - Non-linear history check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose history does not include last ++available revision one. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Package; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $last_revision = ++ $repository->get_last_older_revision($package, $target, $define); ++ ++ if ($last_revision) { ++ # skip the test if last revision has been produced from another source package, as it occurs during package split/merges ++ return ++ if $last_revision->get_canonical_name() ++ ne $package->get_canonical_name(); ++ ++ my ($last_revision_number) = $last_revision->get_last_change()->[Youri::Package::CHANGE_AUTHOR] =~ /(\S+)\s*$/; ++ my %entries = ++ map { $_ => 1 } ++ map { /(\S+)\s*$/ } ++ map { $_->[Youri::Package::CHANGE_AUTHOR] } ++ $package->get_changes(); ++ unless ($entries{$last_revision_number}) { ++ push( ++ @errors, ++ "Last changelog entry $last_revision_number from last revision " . $last_revision->get_full_name() . " missing from current changelog" ++ ); ++ } ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckHostpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Host.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,63 @@ ++# $Id: Host.pm 230850 2007-10-04 20:07:25Z blino $ ++package Youri::Submit::Check::Host; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++my $host; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ host_file => '', ++ @_ ++ ); ++ $host = get_host($options{host_file}) ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $file = $package->get_file; ++ my $arch = $package->get_arch; ++ my $buildhost = $package->as_formated_string('%{buildhost}'); ++ foreach my $h (keys %$host) { ++ next if $buildhost !~ $h; ++ if ($arch =~ $host->{$h}) { ++ return ++ } ++ } ++ "Packages build on host $buildhost are not authorized for arch $arch"; ++} ++ ++sub get_host { ++ my ($file) = @_; ++ my %host; ++ open my $f, $file; ++ while (<$f>) { ++ my ($host, $arch) = split ' '; ++ $host{$host} = $arch ++ } ++ \%host ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckPrecedencepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Precedence.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,58 @@ ++# $Id: Precedence.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::Precedence; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Precedence - Release check against another check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose an older revision already exists for ++another upload target. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ _target => undef, # mandatory targets ++ @_ ++ ); ++ ++ die "undefined target" unless $options{target}; ++ ++ $self->{_target} = $options{target}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my @older_revisions = ++ $repository->get_older_revisions($package, $self->{_target}, $define); ++ if (@older_revisions) { ++ push( ++ @errors, ++ "Older revisions still exists for $self->{_target}: " . join(', ', @older_revisions) ++ ); ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckQueue_recencypm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Queue_recency.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,40 @@ ++# $Id: Queue_recency.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::Queue_recency; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Recency - Release check against current target ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose a current or newer revision already ++exists for current upload target. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @newer_revisions = ++ $repository->get_upload_newer_revisions($package, $target, $define); ++ if (@newer_revisions) { ++ return "Newer revisions already exists for $target in upload queue: " . join(', ', @newer_revisions); ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckRecencypm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Recency.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,64 @@ ++# $Id: Recency.pm 224793 2007-07-08 02:44:48Z spuk $ ++package Youri::Submit::Check::Recency; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Recency - Release check against current target ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages whose a current or newer revision already ++exists for current upload target. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my @revisions = $repository->get_revisions($package, $target, $define, undef, sub { return $_[0]->compare($package) >= 0 }); ++ if (@revisions) { ++ my $section = $repository->_get_section($package, $target, $define); ++ push( ++ @errors, ++ "Current or newer revision(s) already exists in $section for $target: " . ++ join(', ', @revisions) ++ ); ++ } ++ ++ my $defined_section = $define->{section}; ++ ++ # if the user provided a section, check also in the default section ++ if ($defined_section) { ++ $define->{section} = undef; ++ my @default_revisions = $repository->get_revisions($package, $target, $define, undef, sub { return $_[0]->compare($package) >= 0 }); ++ if (@default_revisions) { ++ my $section = $repository->_get_section($package, $target, $define); ++ push( ++ @errors, ++ "Current or newer revision(s) already exists in $section for $target: " . ++ join(', ', @default_revisions) ++ ); ++ } ++ $define->{section} = $defined_section; ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckRpmlintpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Rpmlint.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,90 @@ ++# $Id: Rpmlint.pm 234384 2008-02-12 09:42:32Z blino $ ++package Youri::Submit::Check::Rpmlint; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Rpmlint - Rpmlint-based check ++ ++=head1 DESCRIPTION ++ ++This check plugin wraps rpmlint, and reject packages triggering results ++declared as fatal. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Submit::Check::Rpmlint object. ++ ++Specific parameters: ++ ++=over ++ ++=item results $results ++ ++List of rpmlint result id considered as fatal. ++ ++=item path $path ++ ++Path to the rpmlint executable (default: /usr/bin/rpmlint) ++ ++=item config $config ++ ++Specific rpmlint configuration. ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ results => undef, ++ path => '/usr/bin/rpmlint', ++ config => '', ++ @_ ++ ); ++ ++ croak "no results to check" unless $options{results}; ++ croak "fatal should be an arrayref" unless ref $options{results} eq 'ARRAY'; ++ ++ $self->{_config} = $options{config}; ++ $self->{_path} = $options{path}; ++ $self->{_pattern} = '^(?:' . join('|', @{$options{results}}) . ')$'; ++} ++ ++sub run { ++ my ($self, $package, $_repository, $_target, $_define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $command = "$self->{_path} -f $self->{_config} " . $package->as_file; ++ open(my $RPMLINT, "$command |") or die "Can't run $command: $!"; ++ while (my $line = <$RPMLINT>) { ++ $line =~ /^[EW]: \S+ (\S+)(.*)$/ # old rpmlint format ++ || $line =~ /^\S+: [EW]: (\S+)(.*)$/ or next; # new rpmlint format ++ my ($id, $value) = ($1, $2); ++ if ($id =~ /$self->{_pattern}/o) { ++ push(@errors, "$id$value"); ++ } ++ } ++ ++ return @errors; ++} ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under ++the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckSVNpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/SVN.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,79 @@ ++# $Id: SVN.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::SVN; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ svn => '', ++ @_ ++ ); ++ $self->{_svn} = $options{svn}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $section = $repository->_get_section($package, $target, $define); ++ if ($section =~ /\/(testing|backport)$/) { ++ # FIXME, right now ignore packages in SVN for testing and backports ++ # we need to find a clean way to handle them ++ return ++ } ++ ++ $package->is_source or return; ++ my $file = $package->get_file_name; ++ my $srpm_name = $package->get_canonical_name; ++ if ($repository->package_in_svn($srpm_name)) { ++ if ($file !~ /(^|\/|$define->{prefix}_)@\d+:\Q$srpm_name/) { ++ return "package $srpm_name is in the SVN, the uploaded SRPM must look like @<svn rev>:$srpm_name-<version>-<release>.src.rpm (created with getsrpm-mdk $srpm_name)"; ++ } else { ++ print "Package $file is correct\n"; ++ } ++ } ++ return ++} ++ ++sub simple_prompt { ++ my $cred = shift; ++ my $realm = shift; ++ my $default_username = shift; ++ my $may_save = shift; ++ my $pool = shift; ++ ++ print "Enter authentication info for realm: $realm\n"; ++ print "Username: "; ++ my $username = <>; ++ chomp($username); ++ $cred->username($username); ++ print "Password: "; ++ my $password = <>; ++ chomp($password); ++ $cred->password($password); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckSectionpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Section.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,58 @@ ++# $Id: Precedence.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::Section; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Section - Check if package was submitted to the right section ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages which were submitted to a section ++different than the one where an older version already exists. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $submitted_main_section = $repository->_get_main_section($package, $target, $define); ++ ++ # undefine section, so that Repository::_get_section() of Mandriva_upload.pm ++ # finds the section from existing packages ++ my $defined_section = $define->{section}; ++ undef $define->{section}; ++ ++ my $old_main_section = $repository->_get_main_section($package, $target, $define); ++ my @older_revisions = $repository->get_older_revisions($package, $target, $define); ++ ++ # restore defined section ++ $define->{section} = $defined_section; ++ ++ if (@older_revisions && $submitted_main_section ne $old_main_section) { ++ push( ++ @errors, ++ "Section should be $old_main_section, not $submitted_main_section." ++ ); ++ } ++ ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2007, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckSourcepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Source.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,45 @@ ++# $Id: Source.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::Source; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $file = $package->as_file(); ++ if (!$package->is_source()) { ++ return "Package $file is not a source rpm"; ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckTagpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Tag.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,61 @@ ++# $Id: Tag.pm 1707 2006-10-16 16:26:42Z warly $ ++package Youri::Submit::Check::Tag; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Tag - Incorrect tag values check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect tag values, based on regular ++expressions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ tags => undef, # expected tag values ++ @_ ++ ); ++ ++ croak "no tags to check" unless $options{tags}; ++ croak "tag should be an hashref" unless ref $options{tags} eq 'HASH'; ++ ++ $self->{_tags} = $options{tags}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ foreach my $tag (keys %{$self->{_tags}}) { ++ my $value = $package->get_tag($tag); ++ if ($value !~ /$self->{_tags}->{$tag}/) { ++ push( ++ @errors, ++ "invalid value $value for tag $tag" ++ ); ++ } ++ } ++ ++ return @errors; ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckTypepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Type.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,54 @@ ++# $Id: Type.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Check::Type; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Type - Type check ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects packages with incorrect type. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ type => undef, # expected type ++ @_ ++ ); ++ ++ croak "no type to check" unless $options{type}; ++ croak "invalid type value" unless $options{type} =~ /^(?:source|binary)$/; ++ ++ $self->{_type} = $options{type}; ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @errors; ++ ++ my $type = $package->get_type(); ++ if ($type ne $self->{_type}) { ++ push(@errors, "invalid type $type"); ++ } ++ ++ return @errors; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckVersionpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check/Version.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,102 @@ ++# $Id: Version.pm 267050 2010-03-23 17:36:49Z nvigier $ ++package Youri::Submit::Check::Version; ++ ++=head1 NAME ++ ++Youri::Submit::Check::Version - Check if older version already exist in cooker (used in freeze period) ++ ++=head1 DESCRIPTION ++ ++This check plugin rejects new version of packages if they are not mentioned as authorized ++in the configuration file or in a non frozen section. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use URPM; ++use base qw/Youri::Submit::Check/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++ ++ foreach my $target (keys %options) { ++ $self->{$target} = $options{$target} ++ } ++} ++ ++sub run { ++ my ($self, $package, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $opt = $self->{$target}; ++ return if $opt->{mode} eq 'normal'; ++ my $section = $repository->_get_section($package, $target, $define); ++ my $name = $package->get_canonical_name; ++ return if $name =~ /$opt->{authorized_packages}/; ++ my $arch = $repository->get_arch($package, $target, $define); ++ return if $arch =~ /$opt->{authorized_arches}/; ++ if ($opt->{mode} eq 'version_freeze') { ++ return if $section =~ /$opt->{authorized_sections}/; ++ my $user = $define->{user}; ++ return if $user =~ /^($opt->{authorized_users})$/; ++ my ($package_version) = $package =~ /-([^-]+)-[^-]+\.src$/; ++ $define->{arch} = 'src'; ++ my @revisions = $repository->get_revisions($package, $target, $define, undef, ++ sub { ++ my ($version) = $_[0] =~ /-([^-]+)-[^-]+\.src$/; ++ URPM::ranges_overlap("== $version", "< $package_version") ++ } ++ ); ++ $define->{arch} = ''; ++ if (@revisions) { ++ return "FREEZE, package @revisions of different versions exist in $target\n"; ++ } ++ } ++ # FIXME: The following code is not working and must be reviewed. ++ elsif ($opt->{mode} eq 'freeze') { ++ my $user = $define->{user}; ++ return if (defined($opt->{authorized_users}) && $user =~ /^($opt->{authorized_users})$/); ++ # XXX: So freeze mode really only check for this exceptions? ++ if ($section !~ /$opt->{authorized_sections}/) { ++ return "FREEZE: repository $target section $section is frozen, you can still submit your packages in testing\nTo do so use your.devel --define section=<section> $target <package 1> <package 2> ... <package n>"; ++ } ++ } else { ++ # FIXME: Calls to get_source_package seems invalid nowadays. ++ # This results on $source having a null content. ++ my $source = $package->get_source_package; ++ my ($package_version) = $source =~ /-([^-]+)-[^-]+\.src\.rpm$/; ++ $define->{arch} = 'src'; ++ # FIXME: get_revisions now expects the filter as the 5th element, and not the 4th. ++ my @revisions = $repository->get_revisions($package, $target, $define, ++ sub { ++ # FIXME: Calls to get_source_package seems invalid nowadays. ++ # This results on $source_package having a null content. ++ my $source_package = $_[0]->get_source_package; ++ my ($version) = $source_package =~ /-([^-]+)-[^-]+\.src\.rpm$/; ++ print STDERR "Found version $version\n"; ++ URPM::ranges_overlap("== $version", "< $package_version") ++ } ++ ); ++ $define->{arch} = ''; ++ if (@revisions) { ++ return "FREEZE, package @revisions of different versions exist in $target\n"; ++ } ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, YOURI project ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitCheckpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Check.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Base.pm 631 2006-01-26 22:22:23Z guillomovitch $ ++package Youri::Submit::Check; ++ ++=head1 NAME ++ ++Youri::Submit::Check - Abstract check plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines check plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPluginpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Plugin.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,93 @@ ++# $Id: Plugin.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Plugin; ++ ++=head1 NAME ++ ++Youri::Submit::Plugin - Abstract youri-submit plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines youri-submit plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Submit::Plugin object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns plugin identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 run($package, $repository, $target, $define) ++ ++Execute action on given L<Youri::Package> object. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item run ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostCleanRpmsratepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/CleanRpmsrate.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,53 @@ ++# $Id: CleanRpmsrate.pm 115367 2007-01-30 09:47:04Z pixel $ ++package Youri::Submit::Post::CleanRpmsrate; ++ ++=head1 NAME ++ ++Youri::Submit::Post::CleanRpmsrate - calls clean-rpmsrate ++ ++=head1 DESCRIPTION ++ ++Calls clean-rpmsrate ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Post/; ++ ++#- inlined from MDK::Common::DataStructure ++sub uniq { my %l; $l{$_} = 1 foreach @_; grep { delete $l{$_} } @_ } ++ ++sub _init { ++} ++ ++sub run { ++ my ($self, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $root = $repository->get_install_root(); ++ my @changed = @{$repository->get_arch_changed($target)}; ++ if (grep { $_ eq 'i586' } @changed) { ++ # x86_64 uses i586 pkgs, so rpmsrate need to be rebuild ++ @changed = uniq(@changed, 'x86_64'); ++ } ++ foreach my $arch (@changed) { ++ my $rpmsrate = "$root/$target/$arch/media/media_info/rpmsrate"; ++ my @media = "$root/$target/$arch/media/main/release"; ++ system("cp", "$rpmsrate-raw", "$rpmsrate-new"); ++ system("clean-rpmsrate", "$rpmsrate-new", @media); ++ system("mv", "-f", "$rpmsrate-new", $rpmsrate); ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2007, Mandriva <blino@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostGendistribpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Gendistrib.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,66 @@ ++# $Id: Gendistrib.pm 115367 2007-01-30 09:47:04Z pixel $ ++package Youri::Submit::Post::Gendistrib; ++ ++=head1 NAME ++ ++Youri::Submit::Post::Gendistrib - calls gendistrib ++ ++=head1 DESCRIPTION ++ ++Calls gendistrib ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Post/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ user => '', ++ host => '', ++ source => '', ++ destination => '', ++ @_ ++ ); ++ ++ foreach my $var ('tmpdir', 'command') { ++ $self->{"_$var"} = $options{$var}; ++ } ++} ++ ++sub run { ++ my ($self, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $root = $repository->get_install_root(); ++ (undef, undef, my $hour) = gmtime(time); ++ # during the night, use complete hdlist rebuild ++ my $fast = '--fast'; ++ $fast = ''; # blino: don't use fast for now, it might be broken ++ if ($hour > 22 && $hour < 5) { ++ if ($hour < 4) { ++ $fast = '--blind' ++ } else { ++ $fast = '' ++ } ++ } ++ foreach my $arch (@{$repository->get_arch_changed($target)}) { ++ my $cmd = "TMPDIR=$self->{_tmpdir}/$target/$arch time $self->{_command} --nochkdep --nobadrpm $fast --noclean $root/$target/$arch"; ++ print "$cmd\n"; ++ system($cmd); ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, Mandriva <warly@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostGenhdlist2pm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post/Genhdlist2.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,82 @@ ++# $Id: Gendistrib.pm 115367 2007-01-30 09:47:04Z pixel $ ++package Youri::Submit::Post::Genhdlist2; ++ ++=head1 NAME ++ ++Youri::Submit::Post::Genhdlist2 - calls genhdlist2 ++ ++=head1 DESCRIPTION ++ ++Calls genhdlist2 ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Post/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ user => '', ++ host => '', ++ source => '', ++ destination => '', ++ @_ ++ ); ++ ++ foreach my $var ('command') { ++ $self->{"_$var"} = $options{$var}; ++ } ++} ++ ++sub run { ++ my ($self, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $root = $repository->get_install_root(); ++ my @changed = @{$repository->get_install_dir_changed($target)}; ++ if (!@changed) { ++ print "nothing to do\n"; ++ return; ++ } ++ foreach my $dir (@changed) { ++ my $file_deps = "$dir/../../media_info/file-deps"; ++ my $file_deps_option = -e $file_deps ? "--file-deps $file_deps" : ''; ++ my $cmd = "time $self->{_command} -v --versioned --allow-empty-media $file_deps_option $dir"; ++ print "$cmd\n"; ++ system($cmd) == 0 or print "ERROR: $cmd failed\n"; ++ } ++ ++ # need to redo global MD5SUM. This MD5SUM is mostly obsolete, but is still needed up to 2007.1 ++ # (and even on cooker for existing urpmi.cfg) ++ foreach my $arch (@{$repository->get_arch_changed($target)}) { ++ my $dir = "$root/$target/$arch/media/media_info"; ++ my $cmd = "cd $dir ; time md5sum hdlist_* synthesis.*"; ++ print "$cmd\n"; ++ my $m = `$cmd`; ++ open my $f, '>', "$dir/MD5SUM" or die "Can't write $dir/MD5SUM: $!\n"; ++ print $f $m; ++ ++ { ++ require MDV::Distribconf::Build; ++ my $distrib = MDV::Distribconf::Build->new("$root/$target/$arch"); ++ $distrib->loadtree or die "$root/$target/$arch does not seem to be a distribution tree\n"; ++ $distrib->parse_mediacfg; ++ $distrib->write_version($distrib->getfullpath(undef, "VERSION")); ++ print "updated $root/$target/$arch/VERSION\n"; ++ } ++ } ++ return; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, Mandriva <warly@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; ++ + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPostpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Post.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Post.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Post; ++ ++=head1 NAME ++ ++Youri::Submit::Post - Abstract post plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines post plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPreRsyncpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre/Rsync.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,87 @@ ++# $Id: Rsync.pm 267280 2010-04-01 19:57:53Z bogdano $ ++package Youri::Submit::Pre::Rsync; ++ ++=head1 NAME ++ ++Youri::Submit::Pre::Rsync - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Pre/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ user => '', ++ host => '', ++ source => '', ++ destination => '', ++ @_ ++ ); ++ ++ foreach my $var ('user', 'host', 'source', 'destination') { ++ $self->{"_$var"} = $options{$var}; ++ } ++} ++ ++sub run { ++ my ($self, $pre_packages, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ if (system("rsync --exclude '*.new' --exclude '.*' --remove-sent-files -avlPHe 'ssh -xc arcfour' $self->{_user}\@$self->{_host}:$self->{_source}/$target/ $self->{_destination}/$target/")) { ++ $self->{_error} = "Rsync command failed ($!)"; ++ return ++ } ++ my $queue = "$self->{_destination}/$target"; ++ $self->{_error} = "Reading queue directory failed"; ++ # now get the packages downloaded ++ my %packages; ++ opendir my $queuedh, "$self->{_destination}/$target/" or return "Could not open $self->{_destination}/$target"; ++ opendir my $targetdh, $queue or return "Could not open $queue"; ++ my $idx; ++ foreach my $media (readdir $targetdh) { ++ $media =~ /^\.{1,2}$/ and next; ++ print "$target - $media\n"; ++ if (-d "$queue/$media") { ++ opendir my $submediadh, "$queue/$media" or return "Could not open $queue/$media"; ++ foreach my $submedia (readdir $submediadh) { ++ $submedia =~ /^\.{1,2}$/ and next; ++ print "$target - $media - $submedia\n"; ++ opendir my $rpmdh, "$queue/$media/$submedia" or return "Could not open $queue/$media/$submedia"; ++ foreach my $rpm (readdir $rpmdh) { ++ $rpm =~ /^\.{1,2}$/ and next; ++ print "$target - $media - $submedia : $rpm\n"; ++ my $file = "$queue/$media/$submedia/$rpm"; ++ $file =~ s/\/+/\//g; ++ if ($rpm =~ /^(\d{14}\.\w+\.\w+\.\d+)_.*\.rpm$/) { ++ push @{$packages{$1}{rpms}}, { section => "$media/$submedia", file => $file }; ++ } elsif ($rpm =~ /\.rpm$/) { ++ $idx++; ++ push @{$packages{"independant_$idx"}{rpms}}, { section => "$media/$submedia", file => $file } ++ } ++ } ++ } ++ } ++ } ++ foreach my $key (keys %packages) { ++ push @$pre_packages, $packages{$key}{rpms} ++ } ++ return ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, Mandriva <warly@mandriva.com> ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitPrepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Pre.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Pre.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Pre; ++ ++=head1 NAME ++ ++Youri::Submit::Pre - Abstract pre plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines pre plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectArchivepm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Archive.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,61 @@ ++# $Id: Archive.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Reject::Install; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Archive - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Reject/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++ ++ return $self; ++} ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $rpm = $package->get_file_name(); ++ my $dest = $repository->get_reject_dir($package, $target, $define); ++ ++ # FIXME remove prefix this should be done by a function ++ $rpm =~ s/^\d{14}\.\w+\.\w+\.\d+_//; ++ print "installing file $file to $dest/$rpm\n" ;#if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest/") ++ unless -d $dest; ++ ++ # install file to new location ++ system("install -m $self->{_perms} $file $dest/$rpm"); ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectCleanpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Clean.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,36 @@ ++# $Id: Clean.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Reject::Clean; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Clean - Old revisions cleanup ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures cleanup of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Reject/; ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1 + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectInstallpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Install.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,63 @@ ++# $Id: Install.pm 4747 2007-01-30 10:02:41Z pixel $ ++package Youri::Submit::Reject::Install; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Archive - Old revisions archiving ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures archiving of old package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Reject/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ perms => 644, ++ @_ ++ ); ++ ++ $self->{_perms} = $options{perms}; ++ $self->{_verbose} = $options{verbose}; ++} ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $file = $package->get_file(); ++ my $rpm = $package->get_file_name(); ++ my $dest = $repository->get_reject_path($package, $target, $define); ++ ++ # FIXME remove prefix this should be done by a function ++ $rpm =~ s/^\d{14}\.\w+\.\w+\.\d+_//; ++ print "installing file $file to $dest/$rpm\n" if $self->{_verbose}; ++ ++ unless ($self->{_test}) { ++ # create destination dir if needed ++ system("install -d -m " . ($self->{_perms} + 111) . " $dest/") ++ unless -d $dest; ++ ++ # install file to new location ++ system("install -m $self->{_perms} $file $dest/$rpm"); ++ } ++ $package->{_file} = "$dest/$rpm"; ++ print "deleting file $file\n" if $self->{_verbose}; ++ unlink $file unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectMailpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject/Mail.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,112 @@ ++# $Id: Mail.pm 223952 2007-06-23 13:54:13Z pixel $ ++package Youri::Submit::Reject::Mail; ++ ++=head1 NAME ++ ++Youri::Submit::Action::Mail - Mail notification ++ ++=head1 DESCRIPTION ++ ++This action plugin ensures mail notification of new package revisions. ++ ++=cut ++ ++use warnings; ++use strict; ++use MIME::Entity; ++use Encode qw/from_to/; ++use Carp; ++use Youri::Package; ++use base qw/Youri::Submit::Reject/; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ mta => '/usr/sbin/sendmail', ++ to => '', ++ from => '', ++ cc => '', ++ prefix => '', ++ encoding => 'quoted-printable', ++ charset => 'iso-8859-1', ++ @_ ++ ); ++ ++ croak "undefined mail MTA" unless $options{mta}; ++ croak "invalid mail MTA $options{mta}" unless -x $options{mta}; ++ croak "undefined to" unless $options{to}; ++ if ($options{cc}) { ++ croak "cc should be an hashref" unless ref $options{cc} eq 'HASH'; ++ } ++ croak "invalid charset $options{charset}" ++ unless Encode::resolve_alias($options{charset}); ++ ++ $self->{_mta} = $options{mta}; ++ $self->{_to} = $options{to}; ++ $self->{_from} = $options{from}; ++ $self->{_cc} = $options{cc}; ++ $self->{_prefix} = $options{prefix}; ++ $self->{_encoding} = $options{encoding}; ++ $self->{_charset} = $options{charset}; ++} ++ ++sub run { ++ my ($self, $package, $errors, $repository, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $section = $repository->_get_section($package, $target, $define); ++ ++ my $subject = ++ ($self->{_prefix} ? '[' . $self->{_prefix} . '] ' : '' ) . ($section ? "$section " : '') . ++ $package->get_revision_name(); ++ my $information = $package->get_information(); ++ my $last_change = $package->get_last_change(); ++ my $author = $last_change->[Youri::Package::CHANGE_AUTHOR] if $last_change; ++ my $list = $last_change->[Youri::Package::CHANGE_TEXT] if $last_change; ++ my $content = ++ "Errors: \n\n" . join("\n", map { ++ ( "* $_", (map { " - $_" } @{$errors->{$_}}), "\n"); ++ } sort(keys %$errors)) . "\n" . ++ $information . "\n" . ++ $author . ":\n$list"; ++ ++ # ensure proper codeset conversion ++ # for informations coming from package ++ my $charset = $repository->get_package_charset(); ++ from_to($content, $charset, $self->{_charset}); ++ from_to($subject, $charset, $self->{_charset}); ++ ++ my $mail = MIME::Entity->build( ++ Type => 'text/plain', ++ Charset => $self->{_charset}, ++ Encoding => $self->{_encoding}, ++ From => $self->{_from}, ++ To => $self->{_to}, ++ Subject => $subject, ++ Data => $content, ++ ); ++ ++ if ($self->{_cc}) { ++ my $cc = $self->{_cc}->{$package->get_name()}; ++ $mail->head()->add('cc', $cc) if $cc; ++ } ++ ++ if ($self->{_test}) { ++ $mail->print(\*STDOUT); ++ } else { ++ open(MAIL, "| $self->{_mta} -t -oi -oem") or die "Can't open MTA program: $!"; ++ $mail->print(\*MAIL); ++ close MAIL; ++ } ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunklibYouriSubmitRejectpm">Added: build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm (rev 0) ++++ build_system/mdv-youri-submit/trunk/lib/Youri/Submit/Reject.pm 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,27 @@ ++# $Id: Reject.pm 4746 2007-01-30 10:01:14Z pixel $ ++package Youri::Submit::Reject; ++ ++=head1 NAME ++ ++Youri::Submit::Reject - Abstract reject plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines reject plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base qw/Youri::Submit::Plugin/; ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2006, Mandriva ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyourisubmittrunkt00distributiont">Added: build_system/mdv-youri-submit/trunk/t/00distribution.t</a> +=================================================================== +--- build_system/mdv-youri-submit/trunk/t/00distribution.t (rev 0) ++++ build_system/mdv-youri-submit/trunk/t/00distribution.t 2011-01-05 13:19:06 UTC (rev 209) +@@ -0,0 +1,15 @@ ++#!/usr/bin/perl ++# $Id: 00distribution.t 1723 2006-10-17 13:53:27Z warly $ ++ ++use Test::More; ++ ++BEGIN { ++ eval { ++ require Test::Distribution; ++ }; ++ if($@) { ++ plan skip_all => 'Test::Distribution not installed'; ++ } else { ++ import Test::Distribution only => [ qw/use pod description/ ]; ++ } ++} + + +Property changes on: build_system/mdv-youri-submit/trunk/t/00distribution.t +___________________________________________________________________ +Added: svn:executable + + * + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/307f41b8/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/307f41b8/attachment-0001.html new file mode 100644 index 000000000..49d5e4185 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/307f41b8/attachment-0001.html @@ -0,0 +1,2256 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[212] - merge trunk ( for good this time )</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>212</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 16:32:57 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- merge trunk ( for good this time )</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#identityCatDapbranchesliveMakefilePL">identity/CatDap/branches/live/Makefile.PL</a></li> +<li><a href="#identityCatDapbrancheslivecatdapyml">identity/CatDap/branches/live/catdap.yml</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControllerRootpm">identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControlleradminpm">identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControllerregisterpm">identity/CatDap/branches/live/lib/CatDap/Controller/register.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControlleruserpm">identity/CatDap/branches/live/lib/CatDap/Controller/user.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapI18Nafpo">identity/CatDap/branches/live/lib/CatDap/I18N/af.po</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapI18Nfrpo">identity/CatDap/branches/live/lib/CatDap/I18N/fr.po</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapI18Nmessagespot">identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDappm">identity/CatDap/branches/live/lib/CatDap.pm</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccounttt">identity/CatDap/branches/live/root/admin/account.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_addoctt">identity/CatDap/branches/live/root/admin/account_addoc.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_grouptt">identity/CatDap/branches/live/root/admin/account_group.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_modifytt">identity/CatDap/branches/live/root/admin/account_modify.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_promotett">identity/CatDap/branches/live/root/admin/account_promote.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadmingrouptt">identity/CatDap/branches/live/root/admin/group.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadmingroup_modifytt">identity/CatDap/branches/live/root/admin/group_modify.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminindextt">identity/CatDap/branches/live/root/admin/index.tt</a></li> +<li><a href="#identityCatDapbranchesliverootemailactivationtt">identity/CatDap/branches/live/root/email/activation.tt</a></li> +<li><a href="#identityCatDapbranchesliverootemailadminpasswordtt">identity/CatDap/branches/live/root/email/admin/password.tt</a></li> +<li><a href="#identityCatDapbranchesliverootindextt">identity/CatDap/branches/live/root/index.tt</a></li> +<li><a href="#identityCatDapbranchesliverootregisterchecktt">identity/CatDap/branches/live/root/register/check.tt</a></li> +<li><a href="#identityCatDapbranchesliverootregisterindextt">identity/CatDap/branches/live/root/register/index.tt</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatefooter">identity/CatDap/branches/live/root/template/footer</a></li> +<li><a href="#identityCatDapbranchesliveroottemplateheader">identity/CatDap/branches/live/root/template/header</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatehtml">identity/CatDap/branches/live/root/template/html</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatepre">identity/CatDap/branches/live/root/template/pre</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatewrapper">identity/CatDap/branches/live/root/template/wrapper</a></li> +<li><a href="#identityCatDapbranchesliverootuserindextt">identity/CatDap/branches/live/root/user/index.tt</a></li> +</ul> + +<h3>Property Changed</h3> +<ul> +<li><a href="#identityCatDapbrancheslive">identity/CatDap/branches/live/</a></li> +</ul> + +</div> +<div id="patch"><pre> + +<a id="identityCatDapbrancheslive">Property changes on: identity/CatDap/branches/live</a> +___________________________________________________________________ +<a id="svnmergeinfo">Modified: svn:mergeinfo</a> + - /identity/CatDap/trunk:64,66-68,210 + + /identity/CatDap/trunk:64,66-68,140-211 + +<a id="identityCatDapbranchesliveMakefilePL">Modified: identity/CatDap/branches/live/Makefile.PL</a> +=================================================================== +--- identity/CatDap/branches/live/Makefile.PL 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/Makefile.PL 2011-01-05 15:32:57 UTC (rev 212) +@@ -13,6 +13,7 @@ + requires 'Catalyst::Plugin::ConfigLoader'; + requires 'Catalyst::Plugin::Static::Simple'; + requires 'Catalyst::Plugin::I18N'; ++requires 'Catalyst::Plugin::Unicode::Encoding'; + requires 'Catalyst::Plugin::Authentication'; + requires 'Catalyst::Plugin::Authentication::Store::LDAP'; + requires 'Catalyst::Plugin::Captcha'; + +<a id="identityCatDapbrancheslivecatdapyml">Modified: identity/CatDap/branches/live/catdap.yml</a> +=================================================================== +--- identity/CatDap/branches/live/catdap.yml 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/catdap.yml 2011-01-05 15:32:57 UTC (rev 212) +@@ -11,6 +11,7 @@ + default_view: Web + + organisation: Mageia ++project_url: http://www.mageia.org/ + apptitle: Mageia Identity Management + emailfrom: noreply@mageia.org + +@@ -20,6 +21,8 @@ + password: FIXME + host: ldap.mageia.org + start_tls: 1 ++ options: ++ inet6: 1 + + # dn and password should not be required here, we rebind with credentials + # from the authenticated user using Model::LDAP::FromAuthentication +@@ -28,6 +31,10 @@ + host: ldap.mageia.org + start_tls: 1 + ++register: ++ login_blacklist: ++ - apache ++ + authentication: + default_realm: ldap + realms: +@@ -39,8 +46,10 @@ + store: + class: LDAP + ldap_server: 'ldap.mageia.org' ++ ldap_server_options: ++ inet6: 1 + start_tls: 1 +- binddn: cn=catdap,ou=System Accounts,dc=mageai,dc=org ++ binddn: cn=catdap,ou=System Accounts,dc=mageia,dc=org + bindpw: FIXME + user_basedn: "ou=people,dc=mageia,dc=org" + user_filter: '(&(objectClass=inetOrgPerson)(uid=%s))' + +<a id="identityCatDapbrancheslivelibCatDapControllerRootpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -28,7 +28,11 @@ + + sub index :Path :Args(0) { + my ( $self, $c ) = @_; +- ++ # if user is defined, redirect to /user and let the /user page handle the authentication ++ if (defined $c->user) { ++ $c->log->debug('Redirecting to /user'); ++ $c->res->redirect('/user'); ++ } + # Hello World + #$c->response->body( $c->welcome_message ); + } + +<a id="identityCatDapbrancheslivelibCatDapControlleradminpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -47,7 +47,17 @@ + my $password; + my $mesg; + my $dn; +- my $keyprefix = sprintf( "%02x%02x%02x", split /\./, $c->req->address ); ++ ++ # TODO merge this code with the one in user.pm ++ my $keyprefix; ++ if ($c->req->address =~ m/:/) { ++ my $address = $c->req->address; ++ $address =~ s/\[\]://; ++ $keyprefix = sprintf( "%06x", $address >> 104 ); # if we shift right 104 bits from 128 we have 24 bits left or 3 bytes. ++ } ++ else { ++ $keyprefix = sprintf( "%02x%02x%02x", split /\./, $c->req->address ); ++ } + if ( !defined $c->user or not $c->req->cookie('key') ) { + $c->detach('/user/login') + if ( not $c->req->param('username') + +<a id="identityCatDapbrancheslivelibCatDapControllerregisterpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/register.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/register.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/register.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -51,6 +51,20 @@ + if (! $c->validate_captcha($c->req->param('validate'))){ + push @errors, $c->loc('Incorrect validation text, please try again'); + } ++ ++ if ( ! open( my $etcpasswd, "/etc/passwd")) { ++ push @errors, $c->loc('Cannot check /etc/passwd, please warn system administrators'); ++ } else { ++ if ( grep { /^$username:/ } <$etcpasswd> ) { ++ push @errors, $c->loc('Invalid username, already used by system'); ++ } ++ close($etcpasswd); ++ } ++ ++ if ( grep /^$username$/, @{${$c->config}{'register'}{'login_blacklist'}}) { ++ push @errors, $c->loc('Username is not authorized to be used'); ++ } ++ + if ($c->request->params->{gn} !~ /^\p{IsAlnum}+$/) { + push @errors, $c->loc( + 'The first name supplied contains illegal characters' +@@ -108,7 +122,8 @@ + push @errors,$mesg->error; + $c->log->info( sprintf("Creating DN $dn failed: %s", $mesg->error) ); + $c->stash(errors => \@errors); +- #$c->stash(template => 'register/index.tt'); ++ $c->stash(template => 'register/index.tt'); ++ return ; + } + + $c->stash( + +<a id="identityCatDapbrancheslivelibCatDapControlleruserpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/user.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/user.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/user.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -55,7 +55,7 @@ + my $mesg; + my $dn; + my @errors; +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + if (! defined $c->user or not $c->req->cookie('key')) { + if (not $c->req->param('password')) { + push @errors,$c->loc('Your session has expired'); +@@ -112,6 +112,22 @@ + + } + ++sub get_keyprefix : Private { ++ my ( $self, $c ) = @_; ++ my $keyprefix; ++ if ($c->req->address =~ m/:/) { ++ my $address = $c->req->address; ++ $address =~ s/\[\]://; ++ ++ # if we shift right 104 bits from 128 we have 24 bits left or 3 bytes. ++ $keyprefix = sprintf( "%06x", $address >> 104 ); ++ } ++ else { ++ $keyprefix = sprintf( "%02x%02x%02x", split /\./, $c->req->address ); ++ } ++ return $keyprefix; ++} ++ + =head2 index + + =cut +@@ -293,7 +309,7 @@ + } else { + + # re-encrypt the new password and forward to user view +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + my $key = $c->req->cookie('key')->value; + $cipher = Crypt::CBC->new( -key => $keyprefix . $key, + -cipher => 'Blowfish' +@@ -321,7 +337,7 @@ + $c->res->redirect('/user'); + } + # cache password for next request with form data +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + my $key = Data::UUID->new->create_str(); + $cipher = Crypt::CBC->new( -key => $keyprefix . $key, + -cipher => 'Blowfish' +@@ -338,7 +354,7 @@ + } + + #Re-authenticate user +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + my $key = $c->req->cookie('key')->value; + $cipher = Crypt::CBC->new( -key => $keyprefix . $key, + -cipher => 'Blowfish' + +<a id="identityCatDapbrancheslivelibCatDapI18Nafpo">Modified: identity/CatDap/branches/live/lib/CatDap/I18N/af.po</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/I18N/af.po 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/I18N/af.po 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,45 +1,78 @@ +-#: lib/CatDap/Controller/register.pm:119 ++#: lib/CatDap/Controller/register.pm:133 + msgid "Activation" + msgstr "Aktivering" + +-#: root/user/index.tt:28 root/user/index.tt:8 ++#: root/admin/account_addoc.tt:28 root/admin/account_modify.tt:24 ++#: root/admin/group_modify.tt:18 root/user/index.tt:19 root/user/index.tt:46 + msgid "Add" + msgstr "Voeg by" + ++#: root/admin/account_modify.tt:85 ++msgid "Add ObjectClass" ++msgstr "" ++ ++#: root/admin/account_modify.tt:47 ++msgid "Add attribute" ++msgstr "" ++ ++#. (oc, dn) ++#: root/admin/account_addoc.tt:1 ++msgid "Adding objectclass %1 to dn %2" ++msgstr "" ++ + #: lib/CatDap/Controller/register.pm:49 + msgid "Addresses do not match" + msgstr "Die addresse verskil" + +-#: lib/CatDap/Controller/register.pm:75 ++#: lib/CatDap/Controller/register.pm:89 + msgid "An account already exists with this email address" + msgstr "'n Rekening met hierde epos adres bestaan reeds" + +-#: lib/CatDap/Controller/register.pm:80 ++#: lib/CatDap/Controller/register.pm:94 + msgid "An account already exists with this username" + msgstr "'n Rekening met hierdie gebruikersnaam bestaan reeds" + + #. ($errors) +-#: lib/CatDap/Controller/admin.pm:529 ++#: lib/CatDap/Controller/register.pm:145 + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process f you entered the correct email address: %1" ++"the password recovery process if you entered the correct email address. " ++"Errors %1" + msgstr "" + "Daar was 'n fout met die stuur van die aktiverings epos, maar jou rekening " + "is geskep. Probeer die wagwoord herwinnings proses as die epos adres korrek " +-"was: %1" ++"was. Foute: %1" + + #. ($errors) +-#: lib/CatDap/Controller/register.pm:131 ++#: lib/CatDap/Controller/admin.pm:539 ++#, fuzzy + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process if you entered the correct email address. " +-"Errors %1" ++"the password recovery process if you entered the correct email address: %1" + msgstr "" + "Daar was 'n fout met die stuur van die aktiverings epos, maar jou rekening " + "is geskep. Probeer die wagwoord herwinnings proses as die epos adres korrek " +-"was. Foute: %1" ++"was: %1" + +-#: root/user/firstlogin.tt:14 root/user/password.tt:18 ++#. ($errors) ++#: lib/CatDap/Controller/forgot_password.pm:105 ++msgid "An error occured sending the email, please try again later. Errors %1" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:9 root/admin/account_modify.tt:8 ++#: root/admin/group_modify.tt:5 root/user/index.tt:4 ++msgid "Attribute" ++msgstr "" ++ ++#: lib/CatDap/Controller/register.pm:56 ++msgid "Cannot check /etc/passwd, please warn system administrators" ++msgstr "" ++ ++#: root/register/index.tt:29 ++msgid "Captcha" ++msgstr "" ++ ++#: root/user/firstlogin.tt:14 root/user/password.tt:19 + msgid "Change" + msgstr "Verander" + +@@ -51,7 +84,12 @@ + msgid "Check your mail for activation instructions." + msgstr "Kyk jou epos vir aktiverings instruksies." + +-#: root/register/index.tt:34 ++#: root/forgot_password/complete.tt:5 ++#, fuzzy ++msgid "Check your mail for password reset instructions." ++msgstr "Kyk jou epos vir aktiverings instruksies." ++ ++#: root/register/index.tt:24 + msgid "Confirm Email address" + msgstr "Bevestig epos adres" + +@@ -62,10 +100,11 @@ + #. (cn) + #. (entry.cn) + #: root/email/activation.tt:1 root/email/admin/password.tt:1 ++#: root/email/forgot_password.tt:1 + msgid "Dear %1," + msgstr "Liewe %1," + +-#: root/user/index.tt:9 ++#: root/admin/account_modify.tt:27 root/user/index.tt:22 + msgid "Delete" + msgstr "Vee uit" + +@@ -73,18 +112,75 @@ + msgid "Edit" + msgstr "Wysig" + +-#: root/register/index.tt:30 ++#: root/admin/account.tt:33 root/admin/account.tt:8 ++#: root/admin/account_promote.tt:6 root/register/index.tt:20 ++msgid "Email" ++msgstr "" ++ ++#: root/forgot_password/index.tt:11 root/register/index.tt:21 + msgid "Email address" + msgstr "Epos adres" + +-#: root/register/index.tt:22 ++#: root/forgot_password/complete.tt:1 ++msgid "Email sent." ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:2 ++#, fuzzy ++msgid "Enter new password." ++msgstr "Verander wagwoord" ++ ++#: root/register/index.tt:32 ++msgid "Enter text" ++msgstr "" ++ ++#: root/admin/account.tt:34 root/admin/account_promote.tt:7 ++#, fuzzy ++msgid "First Name" ++msgstr "Voornaam" ++ ++#: root/register/index.tt:13 + msgid "First name" + msgstr "Voornaam" + ++#: lib/CatDap/Controller/forgot_password.pm:94 ++#, fuzzy ++msgid "Forgot password" ++msgstr "Huidige wagwoord" ++ ++#: root/forgot_password/index.tt:5 ++msgid "Forgot your password?" ++msgstr "" ++ ++#: root/index.tt:17 root/index.tt:18 ++#, fuzzy ++msgid "Forgotten password?" ++msgstr "Huidige wagwoord" ++ ++#: root/admin/account.tt:36 root/admin/account.tt:9 ++#: root/admin/account_promote.tt:9 ++msgid "Full Name" ++msgstr "" ++ ++#: root/admin/group.tt:27 ++msgid "Group Name" ++msgstr "" ++ ++#: root/admin/group.tt:9 ++#, fuzzy ++msgid "Group name" ++msgstr "Voornaam" ++ ++#: root/admin/account_modify.tt:2 ++msgid "Groups" ++msgstr "" ++ ++#: lib/CatDap/Controller/forgot_password.pm:48 + #: lib/CatDap/Controller/register.pm:52 + msgid "Incorrect validation text, please try again" + msgstr "Inkorrekte teks van die prentjie, probeer weer" + ++#: lib/CatDap/Controller/forgot_password.pm:45 + #: lib/CatDap/Controller/register.pm:46 + msgid "Invalid email address" + msgstr "Ongeldige epos adres" +@@ -93,39 +189,69 @@ + msgid "Invalid username" + msgstr "Ongeldige gebruikersnaam" + +-#: root/template/header:12 root/user/fake.tt:3 ++#: lib/CatDap/Controller/register.pm:59 ++msgid "Invalid username, already used by system" ++msgstr "" ++ ++#: root/template/header:10 root/user/fake.tt:3 + msgid "Log out" + msgstr "Teken uit" + +-#: root/index.tt:1 root/index.tt:17 ++#: root/index.tt:1 root/index.tt:13 + msgid "Login" + msgstr "Teken in" + +-#: root/user/firstlogin.tt:5 root/user/password.tt:9 ++#: root/forgot_password/confirm.tt:8 root/user/firstlogin.tt:5 ++#: root/user/password.tt:10 + msgid "New Password" + msgstr "Nuwe Wagwoord" + +-#: lib/CatDap/Controller/user.pm:273 ++#: lib/CatDap/Controller/user.pm:296 + msgid "New passwords dont match" + msgstr "Nuwe wagwoorde verskil" + +-#: root/index.tt:11 ++#: root/forgot_password/complete.tt:4 ++#, fuzzy ++msgid "Operation was successful." ++msgstr "Registrasie was suksesvol." ++ ++#: root/index.tt:10 + msgid "Password" + msgstr "Wagwoord" + +-#: lib/CatDap/Controller/user.pm:267 ++#: lib/CatDap/Controller/user.pm:290 + msgid "Password incorrect" + msgstr "Wagwoord inkorrek" + +-#: lib/CatDap/Controller/admin.pm:532 ++#: lib/CatDap/Controller/admin.pm:542 + msgid "Password reset and email sent" + msgstr "Wagwoord is herstel en epos gestuur" + ++#: root/register/index.tt:12 ++msgid "Personal Information" ++msgstr "" ++ + #: root/email/admin/password.tt:5 + msgid "Please click below to change your password" + msgstr "Volg die skakel onder en verander jou wagwoord" + +-#: root/index.tt:18 root/register/index.tt:43 root/register/index.tt:6 ++#: root/admin/index.tt:1 ++msgid "Please use the menus above." ++msgstr "" ++ ++#: root/admin/account_promote.tt:25 ++msgid "Primary group" ++msgstr "" ++ ++#: root/admin/account_modify.tt:71 ++msgid "Promote" ++msgstr "" ++ ++#: root/admin/account_modify.tt:62 ++msgid "Promote user to posixAccount with primary group:" ++msgstr "" ++ ++#: root/index.tt:16 root/register/index.tt:3 root/register/index.tt:35 + msgid "Register" + msgstr "Registreer" + +@@ -137,35 +263,95 @@ + msgid "Registration was successful." + msgstr "Registrasie was suksesvol." + +-#: root/user/firstlogin.tt:9 root/user/password.tt:13 ++#: root/forgot_password/confirm.tt:11 root/user/firstlogin.tt:10 ++#: root/user/password.tt:15 + msgid "Repeat New Password" + msgstr "Herhaal Nuwe Wagwoord" + +-#: root/register/index.tt:26 ++#: root/admin/account_modify.tt:1 ++#, fuzzy ++msgid "Reset password" ++msgstr "Huidige wagwoord" ++ ++#: root/admin/account.tt:22 ++msgid "Search" ++msgstr "" ++ ++#: root/admin/account.tt:4 root/admin/group.tt:5 ++msgid "Search by" ++msgstr "" ++ ++#: root/admin/account_promote.tt:4 ++msgid "Select" ++msgstr "" ++ ++#: root/forgot_password/index.tt:18 ++#, fuzzy ++msgid "Send me my password" ++msgstr "Verander wagwoord" ++ ++#: root/forgot_password/confirm.tt:16 ++#, fuzzy ++msgid "Set new password" ++msgstr "Herhaal Nuwe Wagwoord" ++ ++#: root/register/check.tt:1 ++msgid "Success" ++msgstr "" ++ ++#: root/admin/account.tt:10 root/admin/account.tt:35 ++#: root/admin/account_promote.tt:8 root/register/index.tt:16 + msgid "Surname" + msgstr "Van" + +-#: lib/CatDap/Controller/register.pm:56 ++#: lib/CatDap/Controller/register.pm:70 + msgid "The first name supplied contains illegal characters" + msgstr "Die verskafte noemnaam sluit ongeldige karakters in" + +-#: lib/CatDap/Controller/register.pm:61 ++#: lib/CatDap/Controller/register.pm:75 + msgid "The surname supplied contains illegal characters" + msgstr "Die verskafte van sluit ondeldige karakters in" + ++#: lib/CatDap/Controller/forgot_password.pm:66 ++msgid "This email address is not bound to an account" ++msgstr "" ++ + #: root/email/activation.tt:3 + msgid "To activate your account, please follow the link below." + msgstr "Om U rekening te aktiveer, volg asseblief die volgende skakel." + +-#: root/user/index.tt:13 ++#: root/email/forgot_password.tt:3 ++#, fuzzy ++msgid "To reset your password, please follow the link below." ++msgstr "Om U rekening te aktiveer, volg asseblief die volgende skakel." ++ ++#: root/admin/account_modify.tt:35 root/user/index.tt:29 + msgid "Update" + msgstr "Opdateer" + +-#: root/index.tt:7 root/register/index.tt:18 ++#: root/admin/account.tt:32 root/admin/account.tt:7 ++#: root/admin/account_promote.tt:5 root/index.tt:6 root/register/index.tt:7 ++#: root/register/index.tt:8 + msgid "Username" + msgstr "Gebruikersnaam" + ++#: lib/CatDap/Controller/register.pm:65 ++msgid "Username is not authorized to be used" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:10 root/admin/account_modify.tt:9 ++#: root/admin/group_modify.tt:6 root/user/index.tt:4 ++msgid "Value" ++msgstr "" ++ + #. (c.config.organisation) ++#: root/email/forgot_password.tt:2 ++msgid "" ++"Your %1 account has been requested to change the password. If you did not do " ++"this, or you do not want to change your password; you can just do nothing." ++msgstr "" ++ ++#. (c.config.organisation) + #: root/email/activation.tt:2 + msgid "Your %1 account has been successfully created, but requires activation." + msgstr "Jou %1 rekening is suksesvol geskep, maar aktivering is benodig" +@@ -179,14 +365,42 @@ + msgid "Your session has expired" + msgstr "Jou sessie het verstrek" + +-#: root/index.tt:17 +-msgid "or" +-msgstr "of" ++#: root/admin/account.tt:15 root/admin/group.tt:15 ++msgid "contains" ++msgstr "" + +-#: lib/CatDap/Controller/admin.pm:516 ++#: root/admin/group_modify.tt:14 ++#, fuzzy ++msgid "delete" ++msgstr "Vee uit" ++ ++#: root/admin/account.tt:17 root/admin/group.tt:17 ++msgid "greater than or equal to" ++msgstr "" ++ ++#: root/admin/account.tt:16 root/admin/group.tt:16 ++msgid "is exactly" ++msgstr "" ++ ++#: root/admin/account.tt:18 root/admin/group.tt:18 ++msgid "less than" ++msgstr "" ++ ++#: root/admin/group.tt:10 ++msgid "member" ++msgstr "" ++ ++#: lib/CatDap/Controller/admin.pm:526 + msgid "password reset" + msgstr "Wagwoord herstelling" + ++#: root/admin/account_modify.tt:53 ++msgid "with value" ++msgstr "" ++ ++#~ msgid "or" ++#~ msgstr "of" ++ + #~ msgid "Repeat" + #~ msgstr "Herhaal" + + +<a id="identityCatDapbrancheslivelibCatDapI18Nfrpo">Modified: identity/CatDap/branches/live/lib/CatDap/I18N/fr.po</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/I18N/fr.po 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/I18N/fr.po 2011-01-05 15:32:57 UTC (rev 212) +@@ -5,98 +5,202 @@ + # + msgid "" + msgstr "" +-"Project-Id-Version: PACKAGE VERSION\n" ++"Project-Id-Version: Catdap\n" + "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +-"PO-Revision-Date: 2010-10-19 21:07+0100\n" ++"PO-Revision-Date: 2010-11-04 21:09+0100\n" + "Last-Translator: Michael Scherer <misc@zarb.org>\n" +-"Language-Team: LANGUAGE <LL@li.org>\n" ++"Language-Team: LANGUAGE <mageia-i18n@mageia.org>\n" ++"Language: \n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" ++"X-Poedit-Language: French\n" ++"X-Poedit-Country: FRANCE\n" ++"X-Poedit-SourceCharset: utf-8\n" + +-#: lib/CatDap/Controller/register.pm:119 ++#: lib/CatDap/Controller/register.pm:133 + msgid "Activation" +-msgstr "" ++msgstr "Activation" + +-#: root/user/index.tt:28 root/user/index.tt:8 ++#: root/admin/account_addoc.tt:28 root/admin/account_modify.tt:24 ++#: root/admin/group_modify.tt:18 root/user/index.tt:19 root/user/index.tt:46 + msgid "Add" ++msgstr "Ajouter" ++ ++#: root/admin/account_modify.tt:85 ++msgid "Add ObjectClass" + msgstr "" + ++#: root/admin/account_modify.tt:47 ++msgid "Add attribute" ++msgstr "" ++ ++#. (oc, dn) ++#: root/admin/account_addoc.tt:1 ++msgid "Adding objectclass %1 to dn %2" ++msgstr "" ++ + #: lib/CatDap/Controller/register.pm:49 + msgid "Addresses do not match" + msgstr "Les adresses ne correspondent pas" + +-#: lib/CatDap/Controller/register.pm:75 ++#: lib/CatDap/Controller/register.pm:89 + msgid "An account already exists with this email address" +-msgstr "" ++msgstr "Un compte existe déjà avec cet email" + +-#: lib/CatDap/Controller/register.pm:80 ++#: lib/CatDap/Controller/register.pm:94 + msgid "An account already exists with this username" + msgstr "Un compte existe déjà pour ce nom d'utilisateur" + + #. ($errors) +-#: lib/CatDap/Controller/admin.pm:529 ++#: lib/CatDap/Controller/register.pm:145 + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process f you entered the correct email address: %1" ++"the password recovery process if you entered the correct email address. " ++"Errors %1" + msgstr "" ++"Une erreur est arrivé lors de l'envoi du mail, mais votre compte a été crée. " ++"Vous pouvez utiliser la fonction de réinitialisation du mot de passe si " ++"votre adresse est correcte. Erreurs %1" + + #. ($errors) +-#: lib/CatDap/Controller/register.pm:131 ++#: lib/CatDap/Controller/admin.pm:539 ++#, fuzzy + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process if you entered the correct email address. " +-"Errors %1" ++"the password recovery process if you entered the correct email address: %1" + msgstr "" ++"Une erreur est arrivé lors de l'envoi du mail, mais votre compte a été crée. " ++"Vous pouvez utiliser la fonction de réinitialisation du mot de passe si " ++"votre adresse est correcte : %1" + +-#: root/user/firstlogin.tt:14 root/user/password.tt:18 +-msgid "Change" ++#. ($errors) ++#: lib/CatDap/Controller/forgot_password.pm:105 ++msgid "An error occured sending the email, please try again later. Errors %1" + msgstr "" + ++#: root/admin/account_addoc.tt:9 root/admin/account_modify.tt:8 ++#: root/admin/group_modify.tt:5 root/user/index.tt:4 ++msgid "Attribute" ++msgstr "" ++ ++#: lib/CatDap/Controller/register.pm:56 ++msgid "Cannot check /etc/passwd, please warn system administrators" ++msgstr "" ++ ++#: root/register/index.tt:29 ++msgid "Captcha" ++msgstr "" ++ ++#: root/user/firstlogin.tt:14 root/user/password.tt:19 ++msgid "Change" ++msgstr "Changer" ++ + #: root/user/fake.tt:2 +-#, fuzzy + msgid "Change password" +-msgstr "Mot de passe" ++msgstr "Changer le mot de passe" + + #: root/register/complete.tt:5 + msgid "Check your mail for activation instructions." +-msgstr "" ++msgstr "Vérifier votre boite mail pour les instructions d'activation" + +-#: root/register/index.tt:34 ++#: root/forgot_password/complete.tt:5 ++#, fuzzy ++msgid "Check your mail for password reset instructions." ++msgstr "Vérifier votre boite mail pour les instructions d'activation" ++ ++#: root/register/index.tt:24 + msgid "Confirm Email address" +-msgstr "" ++msgstr "Confirmer l'adresse email" + + #: root/user/password.tt:5 + msgid "Current password" +-msgstr "" ++msgstr "Mot de passe actuel" + + #. (cn) + #. (entry.cn) + #: root/email/activation.tt:1 root/email/admin/password.tt:1 +-#, fuzzy ++#: root/email/forgot_password.tt:1 + msgid "Dear %1," +-msgstr "Cher(e)" ++msgstr "Cher(e) %1," + +-#: root/user/index.tt:9 ++#: root/admin/account_modify.tt:27 root/user/index.tt:22 + msgid "Delete" +-msgstr "" ++msgstr "Supprimer" + + #: root/user/fake.tt:1 + msgid "Edit" ++msgstr "Éditer" ++ ++#: root/admin/account.tt:33 root/admin/account.tt:8 ++#: root/admin/account_promote.tt:6 root/register/index.tt:20 ++msgid "Email" + msgstr "" + +-#: root/register/index.tt:30 ++#: root/forgot_password/index.tt:11 root/register/index.tt:21 + msgid "Email address" +-msgstr "Adresse de messagerie" ++msgstr "Adresse email" + +-#: root/register/index.tt:22 ++#: root/forgot_password/complete.tt:1 ++msgid "Email sent." ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:2 ++#, fuzzy ++msgid "Enter new password." ++msgstr "Changer le mot de passe" ++ ++#: root/register/index.tt:32 ++msgid "Enter text" ++msgstr "" ++ ++#: root/admin/account.tt:34 root/admin/account_promote.tt:7 ++#, fuzzy ++msgid "First Name" ++msgstr "Prénom" ++ ++#: root/register/index.tt:13 + msgid "First name" + msgstr "Prénom" + ++#: lib/CatDap/Controller/forgot_password.pm:94 ++#, fuzzy ++msgid "Forgot password" ++msgstr "Mot de passe actuel" ++ ++#: root/forgot_password/index.tt:5 ++msgid "Forgot your password?" ++msgstr "" ++ ++#: root/index.tt:17 root/index.tt:18 ++#, fuzzy ++msgid "Forgotten password?" ++msgstr "Mot de passe actuel" ++ ++#: root/admin/account.tt:36 root/admin/account.tt:9 ++#: root/admin/account_promote.tt:9 ++msgid "Full Name" ++msgstr "" ++ ++#: root/admin/group.tt:27 ++msgid "Group Name" ++msgstr "" ++ ++#: root/admin/group.tt:9 ++#, fuzzy ++msgid "Group name" ++msgstr "Prénom" ++ ++#: root/admin/account_modify.tt:2 ++msgid "Groups" ++msgstr "" ++ ++#: lib/CatDap/Controller/forgot_password.pm:48 + #: lib/CatDap/Controller/register.pm:52 + msgid "Incorrect validation text, please try again" +-msgstr "" ++msgstr "Texte de validation incorrect, merci de tester à nouveau" + ++#: lib/CatDap/Controller/forgot_password.pm:45 + #: lib/CatDap/Controller/register.pm:46 + msgid "Invalid email address" + msgstr "Adresse mail invalide" +@@ -105,105 +209,218 @@ + msgid "Invalid username" + msgstr "Nom d'utilisateur invalide" + +-#: root/template/header:12 root/user/fake.tt:3 +-msgid "Log out" ++#: lib/CatDap/Controller/register.pm:59 ++msgid "Invalid username, already used by system" + msgstr "" + +-#: root/index.tt:1 root/index.tt:17 ++#: root/template/header:10 root/user/fake.tt:3 ++msgid "Log out" ++msgstr "Se déconnecter" ++ ++#: root/index.tt:1 root/index.tt:13 + msgid "Login" + msgstr "Login" + +-#: root/user/firstlogin.tt:5 root/user/password.tt:9 +-#, fuzzy ++#: root/forgot_password/confirm.tt:8 root/user/firstlogin.tt:5 ++#: root/user/password.tt:10 + msgid "New Password" +-msgstr "Mot de passe" ++msgstr "Nouveau mot de passe" + +-#: lib/CatDap/Controller/user.pm:273 +-#, fuzzy ++#: lib/CatDap/Controller/user.pm:296 + msgid "New passwords dont match" +-msgstr "Les adresses ne correspondent pas" ++msgstr "Les mot de passes ne correspondent pas" + +-#: root/index.tt:11 ++#: root/forgot_password/complete.tt:4 ++#, fuzzy ++msgid "Operation was successful." ++msgstr "L'enregistrement a réussi" ++ ++#: root/index.tt:10 + msgid "Password" + msgstr "Mot de passe" + +-#: lib/CatDap/Controller/user.pm:267 +-#, fuzzy ++#: lib/CatDap/Controller/user.pm:290 + msgid "Password incorrect" +-msgstr "Mot de passe" ++msgstr "Mot de passe incorrect" + +-#: lib/CatDap/Controller/admin.pm:532 ++#: lib/CatDap/Controller/admin.pm:542 + msgid "Password reset and email sent" ++msgstr "Mot de passe réinitialiser, email envoyé" ++ ++#: root/register/index.tt:12 ++msgid "Personal Information" + msgstr "" + + #: root/email/admin/password.tt:5 + msgid "Please click below to change your password" ++msgstr "Cliquer ici pour changer votre mot de passe" ++ ++#: root/admin/index.tt:1 ++msgid "Please use the menus above." + msgstr "" + +-#: root/index.tt:18 root/register/index.tt:43 root/register/index.tt:6 ++#: root/admin/account_promote.tt:25 ++msgid "Primary group" ++msgstr "" ++ ++#: root/admin/account_modify.tt:71 ++msgid "Promote" ++msgstr "" ++ ++#: root/admin/account_modify.tt:62 ++msgid "Promote user to posixAccount with primary group:" ++msgstr "" ++ ++#: root/index.tt:16 root/register/index.tt:3 root/register/index.tt:35 + msgid "Register" + msgstr "S'enregistrer" + + #: root/register/complete.tt:1 + msgid "Registration completed" +-msgstr "" ++msgstr "Enregistrement terminé" + + #: root/register/complete.tt:4 + msgid "Registration was successful." +-msgstr "" ++msgstr "L'enregistrement a réussi" + +-#: root/user/firstlogin.tt:9 root/user/password.tt:13 ++#: root/forgot_password/confirm.tt:11 root/user/firstlogin.tt:10 ++#: root/user/password.tt:15 + msgid "Repeat New Password" ++msgstr "Répéter le nouveau de passe" ++ ++#: root/admin/account_modify.tt:1 ++#, fuzzy ++msgid "Reset password" ++msgstr "Mot de passe actuel" ++ ++#: root/admin/account.tt:22 ++msgid "Search" + msgstr "" + +-#: root/register/index.tt:26 ++#: root/admin/account.tt:4 root/admin/group.tt:5 ++msgid "Search by" ++msgstr "" ++ ++#: root/admin/account_promote.tt:4 ++msgid "Select" ++msgstr "" ++ ++#: root/forgot_password/index.tt:18 ++#, fuzzy ++msgid "Send me my password" ++msgstr "Changer le mot de passe" ++ ++#: root/forgot_password/confirm.tt:16 ++#, fuzzy ++msgid "Set new password" ++msgstr "Répéter le nouveau de passe" ++ ++#: root/register/check.tt:1 ++msgid "Success" ++msgstr "" ++ ++#: root/admin/account.tt:10 root/admin/account.tt:35 ++#: root/admin/account_promote.tt:8 root/register/index.tt:16 + msgid "Surname" +-msgstr "Surnom" ++msgstr "Nom" + +-#: lib/CatDap/Controller/register.pm:56 ++#: lib/CatDap/Controller/register.pm:70 + msgid "The first name supplied contains illegal characters" +-msgstr "" ++msgstr "Le prénom proposé contient des caractères interdits" + +-#: lib/CatDap/Controller/register.pm:61 ++#: lib/CatDap/Controller/register.pm:75 + msgid "The surname supplied contains illegal characters" ++msgstr "Le nom proposé contient des caractères interdits" ++ ++#: lib/CatDap/Controller/forgot_password.pm:66 ++msgid "This email address is not bound to an account" + msgstr "" + + #: root/email/activation.tt:3 +-#, fuzzy + msgid "To activate your account, please follow the link below." + msgstr "Pour activer votre compte, merci de suivre le lien ci dessous." + +-#: root/user/index.tt:13 ++#: root/email/forgot_password.tt:3 ++#, fuzzy ++msgid "To reset your password, please follow the link below." ++msgstr "Pour activer votre compte, merci de suivre le lien ci dessous." ++ ++#: root/admin/account_modify.tt:35 root/user/index.tt:29 + msgid "Update" +-msgstr "" ++msgstr "Mettre à jour" + +-#: root/index.tt:7 root/register/index.tt:18 ++#: root/admin/account.tt:32 root/admin/account.tt:7 ++#: root/admin/account_promote.tt:5 root/index.tt:6 root/register/index.tt:7 ++#: root/register/index.tt:8 + msgid "Username" + msgstr "Nom d'utilisateur" + ++#: lib/CatDap/Controller/register.pm:65 ++msgid "Username is not authorized to be used" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:10 root/admin/account_modify.tt:9 ++#: root/admin/group_modify.tt:6 root/user/index.tt:4 ++msgid "Value" ++msgstr "" ++ + #. (c.config.organisation) ++#: root/email/forgot_password.tt:2 ++msgid "" ++"Your %1 account has been requested to change the password. If you did not do " ++"this, or you do not want to change your password; you can just do nothing." ++msgstr "" ++ ++#. (c.config.organisation) + #: root/email/activation.tt:2 + msgid "Your %1 account has been successfully created, but requires activation." +-msgstr "" ++msgstr "Votre compte %1 a été crée mais requiert d'être activé" + + #. (c.user.username) + #: root/email/admin/password.tt:3 + msgid "Your password was reset by %1" +-msgstr "" ++msgstr "Votre mot de passe a été réinitialisé par %1" + + #: lib/CatDap/Controller/user.pm:61 + msgid "Your session has expired" ++msgstr "Votre session a expiré" ++ ++#: root/admin/account.tt:15 root/admin/group.tt:15 ++msgid "contains" + msgstr "" + +-#: root/index.tt:17 +-msgid "or" +-msgstr "ou" ++#: root/admin/group_modify.tt:14 ++#, fuzzy ++msgid "delete" ++msgstr "Supprimer" + +-#: lib/CatDap/Controller/admin.pm:516 +-#, fuzzy ++#: root/admin/account.tt:17 root/admin/group.tt:17 ++msgid "greater than or equal to" ++msgstr "" ++ ++#: root/admin/account.tt:16 root/admin/group.tt:16 ++msgid "is exactly" ++msgstr "" ++ ++#: root/admin/account.tt:18 root/admin/group.tt:18 ++msgid "less than" ++msgstr "" ++ ++#: root/admin/group.tt:10 ++msgid "member" ++msgstr "" ++ ++#: lib/CatDap/Controller/admin.pm:526 + msgid "password reset" +-msgstr "Mot de passe" ++msgstr "réinitialisation du mot de passe" + ++#: root/admin/account_modify.tt:53 ++msgid "with value" ++msgstr "" ++ ++#~ msgid "or" ++#~ msgstr "ou" ++ + #~ msgid "Mageia Identity Activation" + #~ msgstr "Activation de l'identité Mageia" + + +<a id="identityCatDapbrancheslivelibCatDapI18Nmessagespot">Modified: identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot 2011-01-05 15:32:57 UTC (rev 212) +@@ -15,37 +15,67 @@ + "Content-Type: text/plain; charset=CHARSET\n" + "Content-Transfer-Encoding: 8bit\n" + +-#: lib/CatDap/Controller/register.pm:119 ++#: lib/CatDap/Controller/register.pm:133 + msgid "Activation" + msgstr "" + +-#: root/user/index.tt:28 root/user/index.tt:8 ++#: root/admin/account_addoc.tt:28 root/admin/account_modify.tt:24 root/admin/group_modify.tt:18 root/user/index.tt:19 root/user/index.tt:46 + msgid "Add" + msgstr "" + ++#: root/admin/account_modify.tt:85 ++msgid "Add ObjectClass" ++msgstr "" ++ ++#: root/admin/account_modify.tt:47 ++msgid "Add attribute" ++msgstr "" ++ ++#. (oc, dn) ++#: root/admin/account_addoc.tt:1 ++msgid "Adding objectclass %1 to dn %2" ++msgstr "" ++ + #: lib/CatDap/Controller/register.pm:49 + msgid "Addresses do not match" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:75 ++#: lib/CatDap/Controller/register.pm:89 + msgid "An account already exists with this email address" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:80 ++#: lib/CatDap/Controller/register.pm:94 + msgid "An account already exists with this username" + msgstr "" + + #. ($errors) +-#: lib/CatDap/Controller/admin.pm:529 +-msgid "An error occured sending the email, but your account was created. Please try the password recovery process f you entered the correct email address: %1" ++#: lib/CatDap/Controller/register.pm:145 ++msgid "An error occured sending the email, but your account was created. Please try the password recovery process if you entered the correct email address. Errors %1" + msgstr "" + + #. ($errors) +-#: lib/CatDap/Controller/register.pm:131 +-msgid "An error occured sending the email, but your account was created. Please try the password recovery process if you entered the correct email address. Errors %1" ++#: lib/CatDap/Controller/admin.pm:539 ++msgid "An error occured sending the email, but your account was created. Please try the password recovery process if you entered the correct email address: %1" + msgstr "" + +-#: root/user/firstlogin.tt:14 root/user/password.tt:18 ++#. ($errors) ++#: lib/CatDap/Controller/forgot_password.pm:105 ++msgid "An error occured sending the email, please try again later. Errors %1" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:9 root/admin/account_modify.tt:8 root/admin/group_modify.tt:5 root/user/index.tt:4 ++msgid "Attribute" ++msgstr "" ++ ++#: lib/CatDap/Controller/register.pm:56 ++msgid "Cannot check /etc/passwd, please warn system administrators" ++msgstr "" ++ ++#: root/register/index.tt:29 ++msgid "Captcha" ++msgstr "" ++ ++#: root/user/firstlogin.tt:14 root/user/password.tt:19 + msgid "Change" + msgstr "" + +@@ -57,7 +87,11 @@ + msgid "Check your mail for activation instructions." + msgstr "" + +-#: root/register/index.tt:34 ++#: root/forgot_password/complete.tt:5 ++msgid "Check your mail for password reset instructions." ++msgstr "" ++ ++#: root/register/index.tt:24 + msgid "Confirm Email address" + msgstr "" + +@@ -67,11 +101,11 @@ + + #. (cn) + #. (entry.cn) +-#: root/email/activation.tt:1 root/email/admin/password.tt:1 ++#: root/email/activation.tt:1 root/email/admin/password.tt:1 root/email/forgot_password.tt:1 + msgid "Dear %1," + msgstr "" + +-#: root/user/index.tt:9 ++#: root/admin/account_modify.tt:27 root/user/index.tt:22 + msgid "Delete" + msgstr "" + +@@ -79,19 +113,67 @@ + msgid "Edit" + msgstr "" + +-#: root/register/index.tt:30 ++#: root/admin/account.tt:33 root/admin/account.tt:8 root/admin/account_promote.tt:6 root/register/index.tt:20 ++msgid "Email" ++msgstr "" ++ ++#: root/forgot_password/index.tt:11 root/register/index.tt:21 + msgid "Email address" + msgstr "" + +-#: root/register/index.tt:22 ++#: root/forgot_password/complete.tt:1 ++msgid "Email sent." ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:2 ++msgid "Enter new password." ++msgstr "" ++ ++#: root/register/index.tt:32 ++msgid "Enter text" ++msgstr "" ++ ++#: root/admin/account.tt:34 root/admin/account_promote.tt:7 ++msgid "First Name" ++msgstr "" ++ ++#: root/register/index.tt:13 + msgid "First name" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:52 ++#: lib/CatDap/Controller/forgot_password.pm:94 ++msgid "Forgot password" ++msgstr "" ++ ++#: root/forgot_password/index.tt:5 ++msgid "Forgot your password?" ++msgstr "" ++ ++#: root/index.tt:17 root/index.tt:18 ++msgid "Forgotten password?" ++msgstr "" ++ ++#: root/admin/account.tt:36 root/admin/account.tt:9 root/admin/account_promote.tt:9 ++msgid "Full Name" ++msgstr "" ++ ++#: root/admin/group.tt:27 ++msgid "Group Name" ++msgstr "" ++ ++#: root/admin/group.tt:9 ++msgid "Group name" ++msgstr "" ++ ++#: root/admin/account_modify.tt:2 ++msgid "Groups" ++msgstr "" ++ ++#: lib/CatDap/Controller/forgot_password.pm:48 lib/CatDap/Controller/register.pm:52 + msgid "Incorrect validation text, please try again" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:46 ++#: lib/CatDap/Controller/forgot_password.pm:45 lib/CatDap/Controller/register.pm:46 + msgid "Invalid email address" + msgstr "" + +@@ -99,39 +181,67 @@ + msgid "Invalid username" + msgstr "" + +-#: root/template/header:12 root/user/fake.tt:3 ++#: lib/CatDap/Controller/register.pm:59 ++msgid "Invalid username, already used by system" ++msgstr "" ++ ++#: root/template/header:10 root/user/fake.tt:3 + msgid "Log out" + msgstr "" + +-#: root/index.tt:1 root/index.tt:17 ++#: root/index.tt:1 root/index.tt:13 + msgid "Login" + msgstr "" + +-#: root/user/firstlogin.tt:5 root/user/password.tt:9 ++#: root/forgot_password/confirm.tt:8 root/user/firstlogin.tt:5 root/user/password.tt:10 + msgid "New Password" + msgstr "" + +-#: lib/CatDap/Controller/user.pm:273 ++#: lib/CatDap/Controller/user.pm:296 + msgid "New passwords dont match" + msgstr "" + +-#: root/index.tt:11 ++#: root/forgot_password/complete.tt:4 ++msgid "Operation was successful." ++msgstr "" ++ ++#: root/index.tt:10 + msgid "Password" + msgstr "" + +-#: lib/CatDap/Controller/user.pm:267 ++#: lib/CatDap/Controller/user.pm:290 + msgid "Password incorrect" + msgstr "" + +-#: lib/CatDap/Controller/admin.pm:532 ++#: lib/CatDap/Controller/admin.pm:542 + msgid "Password reset and email sent" + msgstr "" + ++#: root/register/index.tt:12 ++msgid "Personal Information" ++msgstr "" ++ + #: root/email/admin/password.tt:5 + msgid "Please click below to change your password" + msgstr "" + +-#: root/index.tt:18 root/register/index.tt:43 root/register/index.tt:6 ++#: root/admin/index.tt:1 ++msgid "Please use the menus above." ++msgstr "" ++ ++#: root/admin/account_promote.tt:25 ++msgid "Primary group" ++msgstr "" ++ ++#: root/admin/account_modify.tt:71 ++msgid "Promote" ++msgstr "" ++ ++#: root/admin/account_modify.tt:62 ++msgid "Promote user to posixAccount with primary group:" ++msgstr "" ++ ++#: root/index.tt:16 root/register/index.tt:3 root/register/index.tt:35 + msgid "Register" + msgstr "" + +@@ -143,35 +253,84 @@ + msgid "Registration was successful." + msgstr "" + +-#: root/user/firstlogin.tt:9 root/user/password.tt:13 ++#: root/forgot_password/confirm.tt:11 root/user/firstlogin.tt:10 root/user/password.tt:15 + msgid "Repeat New Password" + msgstr "" + +-#: root/register/index.tt:26 ++#: root/admin/account_modify.tt:1 ++msgid "Reset password" ++msgstr "" ++ ++#: root/admin/account.tt:22 ++msgid "Search" ++msgstr "" ++ ++#: root/admin/account.tt:4 root/admin/group.tt:5 ++msgid "Search by" ++msgstr "" ++ ++#: root/admin/account_promote.tt:4 ++msgid "Select" ++msgstr "" ++ ++#: root/forgot_password/index.tt:18 ++msgid "Send me my password" ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:16 ++msgid "Set new password" ++msgstr "" ++ ++#: root/register/check.tt:1 ++msgid "Success" ++msgstr "" ++ ++#: root/admin/account.tt:10 root/admin/account.tt:35 root/admin/account_promote.tt:8 root/register/index.tt:16 + msgid "Surname" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:56 ++#: lib/CatDap/Controller/register.pm:70 + msgid "The first name supplied contains illegal characters" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:61 ++#: lib/CatDap/Controller/register.pm:75 + msgid "The surname supplied contains illegal characters" + msgstr "" + ++#: lib/CatDap/Controller/forgot_password.pm:66 ++msgid "This email address is not bound to an account" ++msgstr "" ++ + #: root/email/activation.tt:3 + msgid "To activate your account, please follow the link below." + msgstr "" + +-#: root/user/index.tt:13 ++#: root/email/forgot_password.tt:3 ++msgid "To reset your password, please follow the link below." ++msgstr "" ++ ++#: root/admin/account_modify.tt:35 root/user/index.tt:29 + msgid "Update" + msgstr "" + +-#: root/index.tt:7 root/register/index.tt:18 ++#: root/admin/account.tt:32 root/admin/account.tt:7 root/admin/account_promote.tt:5 root/index.tt:6 root/register/index.tt:7 root/register/index.tt:8 + msgid "Username" + msgstr "" + ++#: lib/CatDap/Controller/register.pm:65 ++msgid "Username is not authorized to be used" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:10 root/admin/account_modify.tt:9 root/admin/group_modify.tt:6 root/user/index.tt:4 ++msgid "Value" ++msgstr "" ++ + #. (c.config.organisation) ++#: root/email/forgot_password.tt:2 ++msgid "Your %1 account has been requested to change the password. If you did not do this, or you do not want to change your password; you can just do nothing." ++msgstr "" ++ ++#. (c.config.organisation) + #: root/email/activation.tt:2 + msgid "Your %1 account has been successfully created, but requires activation." + msgstr "" +@@ -185,10 +344,34 @@ + msgid "Your session has expired" + msgstr "" + +-#: root/index.tt:17 +-msgid "or" ++#: root/admin/account.tt:15 root/admin/group.tt:15 ++msgid "contains" + msgstr "" + +-#: lib/CatDap/Controller/admin.pm:516 ++#: root/admin/group_modify.tt:14 ++msgid "delete" ++msgstr "" ++ ++#: root/admin/account.tt:17 root/admin/group.tt:17 ++msgid "greater than or equal to" ++msgstr "" ++ ++#: root/admin/account.tt:16 root/admin/group.tt:16 ++msgid "is exactly" ++msgstr "" ++ ++#: root/admin/account.tt:18 root/admin/group.tt:18 ++msgid "less than" ++msgstr "" ++ ++#: root/admin/group.tt:10 ++msgid "member" ++msgstr "" ++ ++#: lib/CatDap/Controller/admin.pm:526 + msgid "password reset" + msgstr "" ++ ++#: root/admin/account_modify.tt:53 ++msgid "with value" ++msgstr "" + +<a id="identityCatDapbrancheslivelibCatDappm">Modified: identity/CatDap/branches/live/lib/CatDap.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -22,6 +22,7 @@ + Authentication + Authorization::Roles + I18N ++ Unicode::Encoding + /; + + extends 'Catalyst'; + +<a id="identityCatDapbranchesliverootadminaccounttt">Modified: identity/CatDap/branches/live/root/admin/account.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,24 +1,25 @@ + <form method="post" action=""> + <table> + <tr> +- <td>Search by</td> ++ <td>[% l('Search by') %]</td> + <td> + <select name="attribute"> +- <option value="uid">Username</option> +- <option value="mail">Email</option> +- <option value="cn">Full Name</option> +- <option value="sn">Surname</option> ++ <option value="uid">[% l('Username') %]</option> ++ <option value="mail">[% l('Email') %]</option> ++ <option value="cn">[% l('Full Name') %]</option> ++ <option value="sn">[% l('Surname') %]</option> + </select> + </td> + <!-- td> + <select name="matchtype"> +- <option value="substring">contains</option> +- <option value="exact">is exactly</option> +- <option value="gte">greater than or equal to</option> +- <option value="lt">less than</option> ++ <option value="substring">[% l('contains') %]</option> ++ <option value="exact">[% l('is exactly') %]</option> ++ <option value="gte">[% l('greater than or equal to') %]</option> ++ <option value="lt">[% l('less than') %]</option> + </select> + </td --> +- <td><input name="value" value="" /></td> ++ <td><input type="text" name="value" value="" /></td> ++ <td><button type="submit" value="[% l('Search') %]">[% l('Search') %]</button></td> + </tr> + </table> + </form> +@@ -28,11 +29,11 @@ + [% IF entries %] + <table border=0> + <tr> +- <th>Username</th> +- <th>Email</th> +- <th>First Name</th> +- <th>Surname</td> +- <th>Full Name</td> ++ <th>[% l('Username') %]</th> ++ <th>[% l('Email') %]</th> ++ <th>[% l('First Name') %]</th> ++ <th>[% l('Surname') %]</td> ++ <th>[% l('Full Name') %]</td> + </tr> + [% FOREACH entry IN entries %] + <tr> + +<a id="identityCatDapbranchesliverootadminaccount_addoctt">Modified: identity/CatDap/branches/live/root/admin/account_addoc.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_addoc.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_addoc.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,4 @@ +-Adding objectclass [% oc %] to dn [% dn %] ++[% l('Adding objectclass [_1] to dn [_2]', oc, dn) %] + + <form method="post" action=""> + <input type="hidden" name="dn" value="[% dn %]" /> +@@ -6,8 +6,8 @@ + <input type="hidden" name="objectclass" value="[% oc %]" /> + <table> + <tr> +- <th>Attribute</th> +- <th>Value</th> ++ <th>[% l('Attribute') %]</th> ++ <th>[% l('Value') %]</th> + </tr> + [% FOREACH attr IN must %] + [% IF attr != "objectClass" %] +@@ -25,6 +25,6 @@ + </tr> + [% END %] + </table> +- <p><input type="submit" value="Add" /></p> ++ <p><input type="submit" value="[% l('Add') %]" /></p> + + </form> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootadminaccount_grouptt">Modified: identity/CatDap/branches/live/root/admin/account_group.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_group.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_group.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,4 @@ +-<h2>Add user [% uid %] to a new group</h2> ++<h2>[% l('Add user [_1] to a new group, uid) %]</h2> + + <form method="post" action=""> + <input type='hidden' name='uid' value='[% uid %]' /> +@@ -8,12 +8,12 @@ + <option value='[% group.cn %]'>[% group.cn %]</option> + [% END %] + </select> +- <input type='submit' value='Add' /> ++ <input type='submit' value='[% l('Add') %]' /> + </form> + + <hr /> + +-<h2>Delete user [% uid %] from an existing group:</h2> ++<h2>[% l('Delete user [_1] from an existing group:', uid) %] </h2> + + <form method="post" action=""> + <input type='hidden' name='uid' value='[% uid %]' /> +@@ -23,7 +23,7 @@ + <option value='[% group.cn %]'>[% group.cn %]</option> + [% END %] + </select> +- <input type='submit' value='Delete' /> ++ <input type='submit' value='[% l('Delete') %]' /> + </form> + + <hr /> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootadminaccount_modifytt">Modified: identity/CatDap/branches/live/root/admin/account_modify.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_modify.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_modify.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,12 +1,12 @@ +-<a href="[% c.uri_for('/admin/password') %]/[% uid %]">Reset password</a> +-<a href="[% c.uri_for('/admin/account_group') %]/[% uid %]">Groups</a> ++<a href="[% c.uri_for('/admin/password') %]/[% uid %]">[% l('Reset password') %]</a> ++<a href="[% c.uri_for('/admin/account_group') %]/[% uid %]">[% l('Groups') %]</a> + + <form method="post" action=""> + <input type='hidden' name='operation' value='replace' /> + <table border=0> + <tr> +- <th>Attribute</th> +- <th>Value</th> ++ <th>[% l('Attribute') %]</th> ++ <th>[% l('Value') %]</th> + </tr> + [% FOREACH attr IN values %] + <tr> +@@ -21,10 +21,10 @@ + <br/> + [% END %] + [% IF attr.addable AND attr.editable %] +- <a href="[% c.uri_for('/admin/account_edit') %]/add/[% attr.name %]">Add</a> ++ <a href="[% c.uri_for('/admin/account_edit') %]/add/[% attr.name %]">[% l('Add') %]</a> + [% END %] + [% IF attr.removable AND attr.editable %] +- <a href="[% c.uri_for('/admin/account_modifydel') %]/[% uid %]/[% attr.name %]/[% val %]">Delete</a> ++ <a href="[% c.uri_for('/admin/account_modifydel') %]/[% uid %]/[% attr.name %]/[% val %]">[% l('Delete') %]</a> + [% END %] + [% END %] + </td> +@@ -32,7 +32,7 @@ + [% END %] + <tr> + <td colspan=2 align=center> +- <input type='Submit' value='Update'> ++ <input type='Submit' value='[% l('Update') %]'> + </td> + </tr> + </table> +@@ -44,13 +44,13 @@ + <input type="hidden" name="operation" value="add" /> + + <p> +- Add attribute ++ [% l('Add attribute') %] + <select name='attribute'> + [% FOREACH attr IN may %] + <option value="[% attr %]">[% attr %]</option> + [% END %] + </select> +- with value ++ [% l('with value') %] + <input name="value" value="" /> + <input type="submit" value="Add" /> + </p> +@@ -59,7 +59,7 @@ + <hr /> + + [% IF groups %] +-<p>Promote user to posixAccount with primary group: </p> ++<p>[% l('Promote user to posixAccount with primary group:') %] </p> + + <form method="post" action="[% c.uri_for('/admin/account_promote') %]"> + <input type="hidden" name="dn" value="[% dn %]" /> +@@ -68,7 +68,7 @@ + <option value="[% group.gidNumber %]">[% group.name %]</option> + [% END %] + </select> +- <input type="submit" value="Promote" /> ++ <input type="submit" value="[% l('Promote') %]" /> + </form> + [% END %] + +@@ -82,7 +82,7 @@ + <option value='[% oc %]'>[% oc %]</option> + [% END %] + </select> +- <input type="submit" value="Add ObjectClass" /> ++ <input type="submit" value="[% l('Add ObjectClass') %]" /> + </form> + + <hr /> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootadminaccount_promotett">Modified: identity/CatDap/branches/live/root/admin/account_promote.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_promote.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_promote.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,12 +1,12 @@ + <form method="post" action=""> + <table border=0> + <tr> +- <th>Select</th> +- <th>Username</th> +- <th>Email</th> +- <th>First Name</th> +- <th>Surname</td> +- <th>Full Name</td> ++ <th>[% l('Select') %]</th> ++ <th>[% l('Username') %]</th> ++ <th>[% l('Email') %]</th> ++ <th>[% l('First Name') %]</th> ++ <th>[% l('Surname') %]</td> ++ <th>[% l('Full Name') %]</td> + </tr> + [% FOREACH entry IN entries %] + <tr> +@@ -22,7 +22,7 @@ + + <table border=0> + <tr> +- <td>Primary group</td> ++ <td>[% l('Primary group') %]</td> + <td> + <select name="gid"> + [% FOREACH group IN groups %] + +<a id="identityCatDapbranchesliverootadmingrouptt">Modified: identity/CatDap/branches/live/root/admin/group.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/group.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/group.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -2,20 +2,20 @@ + <table> + <tr> + <td> +-Search by ++[% l('Search by') %] + </td> + <td> + <select name="attribute"> +-<option value="cn">Group name</option> +-<option value="member">member</option> ++<option value="cn">[% l('Group name') %]</option> ++<option value="member">[% l('member') %]</option> + </select> + </td> + <!-- td> + <select name="matchtype"> +-<option value="substring">contains</option> +-<option value="exact">is exactly</option> +-<option value="gte">greater than or equal to</option> +-<option value="lt">less than</option> ++<option value="substring">[% l('contains') %]</option> ++<option value="exact">[% l('is exactly') %]</option> ++<option value="gte">[% l('greater than or equal to') %]</option> ++<option value="lt">[% l('less than') %]</option> + </select> + </td --> + <td><input name='value'></td> +@@ -24,7 +24,7 @@ + [% IF entries %] + <table border=0> + <tr> +-<th>Group Name</th> ++<th>[% l('Group Name') %]</th> + </tr> + [% FOREACH entry IN entries %] + <tr> + +<a id="identityCatDapbranchesliverootadmingroup_modifytt">Modified: identity/CatDap/branches/live/root/admin/group_modify.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/group_modify.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/group_modify.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -2,8 +2,8 @@ + <input type='hidden' name='dn' value='[% group.dn %]'> + <table> + <tr> +- <th>Attribute</th> +- <th>Value</th> ++ <th>[% l('Attribute') %]</th> ++ <th>[% l('Value') %]</th> + </tr> + [% FOREACH attr IN group.attributes %] + <tr> +@@ -11,11 +11,11 @@ + <td> + [% FOREACH value IN group.get_value(attr) %] + [% value %] +- <a href="[% c.uri_for('/admin/group_modify') %]/delete/[% group.dn %]/[% attr %]/[% value %]">delete</a> ++ <a href="[% c.uri_for('/admin/group_modify') %]/delete/[% group.dn %]/[% attr %]/[% value %]">[% l('delete') %]</a> + <br/> + [% END %] + <input name="[% attr %]" value="" /> +- <input type="submit" value="Add" /> ++ <input type="submit" value="[% l('Add') %]" /> + </td> + </tr> + [% END %] + +<a id="identityCatDapbranchesliverootadminindextt">Modified: identity/CatDap/branches/live/root/admin/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1 +1 @@ +-<p>Please use the menus above.</p> +\ No newline at end of file ++<p>[% l('Please use the menus above.') %]</p> + +<a id="identityCatDapbranchesliverootemailactivationtt">Modified: identity/CatDap/branches/live/root/email/activation.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/email/activation.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/email/activation.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -4,4 +4,4 @@ + [% url %] + + -- +-http://mageia.org/ +\ No newline at end of file ++[% c.config.project_url %] + +<a id="identityCatDapbranchesliverootemailadminpasswordtt">Modified: identity/CatDap/branches/live/root/email/admin/password.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/email/admin/password.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/email/admin/password.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -7,4 +7,4 @@ + [% url %] + + -- +-http://mageia.org/ +\ No newline at end of file ++[% c.config.project_url %] + +<a id="identityCatDapbranchesliverootindextt">Modified: identity/CatDap/branches/live/root/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,21 +1,22 @@ + <h1>[% l('Login') %]</h1> + ++<div id="login_form"> + <form method="post" action="/user"> ++ <div id="login_form_inputs"> ++ <label for="username_">[% l('Username : ') %]</label> ++ <input id="username_" type="text" name="username" value="[% c.user.username %]" /> ++ <br /> + +- <p> +- <label for="username_">[% l('Username') %]</label> +- <input id="username_" type="text" name="username" value="[% c.user.username %]" /> +- </p> +- +- <p> +- <label for="password_">[% l('Password') %]</label> +- <input id="password_" type="password" name="password" /> +- </p> +- +- <p><input type="submit" value="[% l('Login') %]" /> +- [% l('or') %] +- <a href="/register">[% l('Register') %]</a></p> +- +- <p>@todo [% l('Forgotten password?') %]</p> +- ++ <label for="password_">[% l('Password : ') %]</label> ++ <input id="password_" type="password" name="password" /> ++ <br /> ++ </div> ++ <div id="login_form_line"> ++ <span><a href="/register">[% l('Register') %]</a> | ++ @todo [% l('Forgotten password?') %] ++ <!--<a href="/forgot_password">[% l('Forgotten password?') %]</a> --> ++ </span> ++ <button type="submit" value="[% l('Login') %]" >[% l('Login') %]</button> ++ </div> + </form> ++</div> + +<a id="identityCatDapbranchesliverootregisterchecktt">Modified: identity/CatDap/branches/live/root/register/check.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/register/check.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/register/check.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,4 @@ +-<h2>Success</h2> ++<h2>[% l('Success') %]</h2> + <p> + [% message %] + </p> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootregisterindextt">Modified: identity/CatDap/branches/live/root/register/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/register/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/register/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,48 +1,37 @@ +-[% MACRO l(text, args) BLOCK; +- c.localize(text, args); +-END; %] + + + <h2>[% l('Register') %]</h2> + +-<p class="error"> +- [% FOREACH error IN errors %] +- [% error %]<br/> +- [% END %] +-</p> +- ++<div id="input_form"> + <form method="post" action="/register/check"> ++ <h3>[% l('Username') %]</h3> ++ <label for="uid_">[% l('Username') %]</label><br /> ++ <input id="uid_" type="text" name="uid" value="[% c.request.params.uid %]" /><br /> + +- <p> +- <label for="uid_">[% l('Username') %]</label> +- <input id="uid_" type="text" name="uid" value="[% c.request.params.uid %]" /> +- </p> ++ <p> ++ <h3>[% l('Personal Information') %]</h3> ++ <label for="gn_">[% l('First name') %]</label><br/> ++ <input id="gn_" type="text" name="gn" value="[% c.request.params.gn %]" /><br /> + +- <p> +- <label for="gn_">[% l('First name') %]</label> +- <input id="gn_" type="text" name="gn" value="[% c.request.params.gn %]" /> +- </p> ++ <label for="sn_">[% l('Surname') %]</label><br/> ++ <input id="sn_" type="text" name="sn" value="[% c.request.params.sn %]" /><br /> ++ </p> ++ <p> ++ <h3>[% l('Email') %]</h3> ++ <label for="mail1_">[% l('Email address') %]</label><br/> ++ <input id="mail1_" type="text" name="mail1" value="[% c.request.params.mail1 %]" /><br /> + +- <p> +- <label for="sn_">[% l('Surname') %]</label> +- <input id="sn_" type="text" name="sn" value="[% c.request.params.sn %]" /> +- </p> ++ <label for="mail2_">[% l('Confirm Email address') %]</label><br/> ++ <input id="mail2_" type="text" name="mail2" value="[% c.request.params.mail2 %]" /><br /> ++ </p> + +- <p> +- <label for="mail1_">[% l('Email address') %]</label> +- <input id="mail1_" type="text" name="mail1" value="[% c.request.params.mail1 %]" /> +- </p> ++ <p> ++ <h3>[% l('Captcha') %]</h3> + +- <p> +- <label for="mail2_">[% l('Confirm Email address') %]</label> +- <input id="mail2_" type="text" name="mail2" value="[% c.request.params.mail2 %]" /> +- </p> +- +- <p> +- <img src="/register/captcha" /> +- <input type="text" name="validate" /> +- </p> +- +- <p><input type="submit" value="[% l('Register') %]" /></p> +- +-</form> +\ No newline at end of file ++ <img src="/register/captcha" /><br /> ++ <label for="test">[% l('Enter text') %]</label><br/> ++ <input type="text" name="validate" /><br/> ++ </p> ++ <button type="submit" value="[% l('Register') %]">[% l('Register') %]</button> ++</form> ++</div> + +<a id="identityCatDapbranchesliveroottemplatefooter">Modified: identity/CatDap/branches/live/root/template/footer</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/footer 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/footer 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,5 @@ +-<p>2010 <a href="http://mageia.org/">Mageia.org</a> ++<div class="hnav"> ++<div align=center><p>2010 <a href="http://mageia.org/">Mageia.org</a> + | <a href="http://mageia.org/policies/privacy/">Privacy policy</a> + | <a href="http://mageia.org/faq/accounts/">Mageia user accounts FAQ</a> +- </p> +\ No newline at end of file ++</p></div></div> + +<a id="identityCatDapbranchesliveroottemplateheader">Modified: identity/CatDap/branches/live/root/template/header</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/header 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/header 2011-01-05 15:32:57 UTC (rev 212) +@@ -8,8 +8,6 @@ + [% IF c.user.username %] + <li><strong><a href="[% c.uri_for("/user") %]">[% c.user.username %]</a></strong></li> + <li><a href="/user/logout">[% l('Log out') %]</a></li> +- [% ELSE %] +- <li><a href="/">[% l('Login') %]</a></li> + [% END %] + </ul> + </div> + +<a id="identityCatDapbranchesliveroottemplatehtml">Modified: identity/CatDap/branches/live/root/template/html</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/html 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/html 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,17 +1,17 @@ + <?xml version="1.0" encoding="utf-8"?> + <!DOCTYPE html> +-<html lang="en" dir="ltr"> ++<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr"> + <head> + <meta charset="utf-8" /> + <title>[% template.title or site.title or c.config.apptitle %]</title> +- <meta content="description" value="Mageia.org online user account panel" /> +- <meta content="keywords" value="mageia, user, account, password" /> +- <meta content="robots" value="index,nofollow" /> +- <link rel="stylesheet" type="text/css" href="/static/style/yui/reset-fonts-grids.css"> +- <link rel="stylesheet" type="text/css" href="/static/style/yui/base-min.css"> ++ <meta name="description" content="Mageia.org online user account panel" /> ++ <meta name="keywords" content="mageia, user, account, password" /> ++ <meta name="robots" content="index,nofollow" /> ++ <link rel="stylesheet" type="text/css" href="/static/style/yui/reset-fonts-grids.css" /> ++ <link rel="stylesheet" type="text/css" href="/static/style/yui/base-min.css" /> + <link rel="stylesheet" type="text/css" href="/static/style/ttsite.css" /> + </head> + <body> + [% content %] + </body> +-</html> +\ No newline at end of file ++</html> + +<a id="identityCatDapbranchesliveroottemplatepre">Modified: identity/CatDap/branches/live/root/template/pre</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/pre 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/pre 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,3 +1,3 @@ +-[% MACRO l(text, args) BLOCK; ++[%- MACRO l(text, args) BLOCK; + c.localize(text, args); +-END; %] ++END; -%] + +<a id="identityCatDapbranchesliveroottemplatewrapper">Modified: identity/CatDap/branches/live/root/template/wrapper</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/wrapper 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/wrapper 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,7 +1,4 @@ +-[% MACRO l(text, args) BLOCK; +- c.localize(text, args); +-END; %] +-[% IF template.name.match('\.(css|js|txt)'); ++[%- IF template.name.match('\.(css|js|txt)'); + debug("Passing page through as text: $template.name"); + content; + ELSE; + +<a id="identityCatDapbranchesliverootuserindextt">Modified: identity/CatDap/branches/live/root/user/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/user/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/user/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,30 +1,34 @@ ++<div id="input_form"> + <form method="post" action=""> +- <table border=0> +- <tr><th>Attribute</th><th>Value</th></tr> ++ <table> ++ <tr><th>[% l('Attribute') %]</th><th>[% l('Value') %]</th><th></th></tr> + [% FOREACH attr IN values %] + <tr> + <td>[% attr.name %]</td> + <td> + [% FOREACH val IN attr.values %] +- [% IF attr.editable %]<input type=hidden name="[% attr.name %]_old" value="[% val %]"> +- <input name="[% attr.name %]_new" value="[% val %]"> ++ [% IF attr.editable %]<input type="hidden" name="[% attr.name %]_old" value="[% val %]" /> ++ <input name="[% attr.name %]_new" value="[% val %]" /> + [% ELSE %] + [% val %] + <br/> + [% END %] ++ </td> ++ <td> + [% IF attr.addable AND attr.editable %] +- <a href="/user/add/[% attr.name %]">[% l('Add') %]</a> ++ <button type="button" onclick="location='/user/add/[% attr.name %]'">[% l('Add') %]</button> + [% END %] + [% IF attr.removable AND attr.editable %] +- <a href="/user/delete/[% attr.name %]/[% val %]">[% l('Delete') %]</a> ++ <button type="button" onclick="location='/user/delete/[% attr.name %]/[% val %]'">[% l('Delete') %]</button> + [% END %] + [% END %] + </td> + </tr> + [% END %] ++ <tr> ++ <td colspan="3" style="text-align:center;"><button type="Submit" value="[% l('Update') %]">[% l('Update') %]</button></td> ++ </tr> + </table> +- +- <p><input type="Submit" value="[% l('Update') %]" /></p> + </form> + + <hr /> +@@ -35,9 +39,11 @@ + [% FOREACH attr IN may %] + <option value="[% attr %]">[% attr %]</option> + [% END %] ++ </select> + + <input name="value" value="" /> + +- <input type="submit" value="[% l('Add') %]" /> ++ <button type="submit" value="[% l('Add') %]">[% l('Add') %]</button> + </p> + </form> ++</div> + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/307f41b8/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/307f41b8/attachment.html new file mode 100644 index 000000000..49d5e4185 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/307f41b8/attachment.html @@ -0,0 +1,2256 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[212] - merge trunk ( for good this time )</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>212</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 16:32:57 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- merge trunk ( for good this time )</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#identityCatDapbranchesliveMakefilePL">identity/CatDap/branches/live/Makefile.PL</a></li> +<li><a href="#identityCatDapbrancheslivecatdapyml">identity/CatDap/branches/live/catdap.yml</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControllerRootpm">identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControlleradminpm">identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControllerregisterpm">identity/CatDap/branches/live/lib/CatDap/Controller/register.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapControlleruserpm">identity/CatDap/branches/live/lib/CatDap/Controller/user.pm</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapI18Nafpo">identity/CatDap/branches/live/lib/CatDap/I18N/af.po</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapI18Nfrpo">identity/CatDap/branches/live/lib/CatDap/I18N/fr.po</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDapI18Nmessagespot">identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot</a></li> +<li><a href="#identityCatDapbrancheslivelibCatDappm">identity/CatDap/branches/live/lib/CatDap.pm</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccounttt">identity/CatDap/branches/live/root/admin/account.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_addoctt">identity/CatDap/branches/live/root/admin/account_addoc.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_grouptt">identity/CatDap/branches/live/root/admin/account_group.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_modifytt">identity/CatDap/branches/live/root/admin/account_modify.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminaccount_promotett">identity/CatDap/branches/live/root/admin/account_promote.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadmingrouptt">identity/CatDap/branches/live/root/admin/group.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadmingroup_modifytt">identity/CatDap/branches/live/root/admin/group_modify.tt</a></li> +<li><a href="#identityCatDapbranchesliverootadminindextt">identity/CatDap/branches/live/root/admin/index.tt</a></li> +<li><a href="#identityCatDapbranchesliverootemailactivationtt">identity/CatDap/branches/live/root/email/activation.tt</a></li> +<li><a href="#identityCatDapbranchesliverootemailadminpasswordtt">identity/CatDap/branches/live/root/email/admin/password.tt</a></li> +<li><a href="#identityCatDapbranchesliverootindextt">identity/CatDap/branches/live/root/index.tt</a></li> +<li><a href="#identityCatDapbranchesliverootregisterchecktt">identity/CatDap/branches/live/root/register/check.tt</a></li> +<li><a href="#identityCatDapbranchesliverootregisterindextt">identity/CatDap/branches/live/root/register/index.tt</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatefooter">identity/CatDap/branches/live/root/template/footer</a></li> +<li><a href="#identityCatDapbranchesliveroottemplateheader">identity/CatDap/branches/live/root/template/header</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatehtml">identity/CatDap/branches/live/root/template/html</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatepre">identity/CatDap/branches/live/root/template/pre</a></li> +<li><a href="#identityCatDapbranchesliveroottemplatewrapper">identity/CatDap/branches/live/root/template/wrapper</a></li> +<li><a href="#identityCatDapbranchesliverootuserindextt">identity/CatDap/branches/live/root/user/index.tt</a></li> +</ul> + +<h3>Property Changed</h3> +<ul> +<li><a href="#identityCatDapbrancheslive">identity/CatDap/branches/live/</a></li> +</ul> + +</div> +<div id="patch"><pre> + +<a id="identityCatDapbrancheslive">Property changes on: identity/CatDap/branches/live</a> +___________________________________________________________________ +<a id="svnmergeinfo">Modified: svn:mergeinfo</a> + - /identity/CatDap/trunk:64,66-68,210 + + /identity/CatDap/trunk:64,66-68,140-211 + +<a id="identityCatDapbranchesliveMakefilePL">Modified: identity/CatDap/branches/live/Makefile.PL</a> +=================================================================== +--- identity/CatDap/branches/live/Makefile.PL 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/Makefile.PL 2011-01-05 15:32:57 UTC (rev 212) +@@ -13,6 +13,7 @@ + requires 'Catalyst::Plugin::ConfigLoader'; + requires 'Catalyst::Plugin::Static::Simple'; + requires 'Catalyst::Plugin::I18N'; ++requires 'Catalyst::Plugin::Unicode::Encoding'; + requires 'Catalyst::Plugin::Authentication'; + requires 'Catalyst::Plugin::Authentication::Store::LDAP'; + requires 'Catalyst::Plugin::Captcha'; + +<a id="identityCatDapbrancheslivecatdapyml">Modified: identity/CatDap/branches/live/catdap.yml</a> +=================================================================== +--- identity/CatDap/branches/live/catdap.yml 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/catdap.yml 2011-01-05 15:32:57 UTC (rev 212) +@@ -11,6 +11,7 @@ + default_view: Web + + organisation: Mageia ++project_url: http://www.mageia.org/ + apptitle: Mageia Identity Management + emailfrom: noreply@mageia.org + +@@ -20,6 +21,8 @@ + password: FIXME + host: ldap.mageia.org + start_tls: 1 ++ options: ++ inet6: 1 + + # dn and password should not be required here, we rebind with credentials + # from the authenticated user using Model::LDAP::FromAuthentication +@@ -28,6 +31,10 @@ + host: ldap.mageia.org + start_tls: 1 + ++register: ++ login_blacklist: ++ - apache ++ + authentication: + default_realm: ldap + realms: +@@ -39,8 +46,10 @@ + store: + class: LDAP + ldap_server: 'ldap.mageia.org' ++ ldap_server_options: ++ inet6: 1 + start_tls: 1 +- binddn: cn=catdap,ou=System Accounts,dc=mageai,dc=org ++ binddn: cn=catdap,ou=System Accounts,dc=mageia,dc=org + bindpw: FIXME + user_basedn: "ou=people,dc=mageia,dc=org" + user_filter: '(&(objectClass=inetOrgPerson)(uid=%s))' + +<a id="identityCatDapbrancheslivelibCatDapControllerRootpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/Root.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -28,7 +28,11 @@ + + sub index :Path :Args(0) { + my ( $self, $c ) = @_; +- ++ # if user is defined, redirect to /user and let the /user page handle the authentication ++ if (defined $c->user) { ++ $c->log->debug('Redirecting to /user'); ++ $c->res->redirect('/user'); ++ } + # Hello World + #$c->response->body( $c->welcome_message ); + } + +<a id="identityCatDapbrancheslivelibCatDapControlleradminpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/admin.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -47,7 +47,17 @@ + my $password; + my $mesg; + my $dn; +- my $keyprefix = sprintf( "%02x%02x%02x", split /\./, $c->req->address ); ++ ++ # TODO merge this code with the one in user.pm ++ my $keyprefix; ++ if ($c->req->address =~ m/:/) { ++ my $address = $c->req->address; ++ $address =~ s/\[\]://; ++ $keyprefix = sprintf( "%06x", $address >> 104 ); # if we shift right 104 bits from 128 we have 24 bits left or 3 bytes. ++ } ++ else { ++ $keyprefix = sprintf( "%02x%02x%02x", split /\./, $c->req->address ); ++ } + if ( !defined $c->user or not $c->req->cookie('key') ) { + $c->detach('/user/login') + if ( not $c->req->param('username') + +<a id="identityCatDapbrancheslivelibCatDapControllerregisterpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/register.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/register.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/register.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -51,6 +51,20 @@ + if (! $c->validate_captcha($c->req->param('validate'))){ + push @errors, $c->loc('Incorrect validation text, please try again'); + } ++ ++ if ( ! open( my $etcpasswd, "/etc/passwd")) { ++ push @errors, $c->loc('Cannot check /etc/passwd, please warn system administrators'); ++ } else { ++ if ( grep { /^$username:/ } <$etcpasswd> ) { ++ push @errors, $c->loc('Invalid username, already used by system'); ++ } ++ close($etcpasswd); ++ } ++ ++ if ( grep /^$username$/, @{${$c->config}{'register'}{'login_blacklist'}}) { ++ push @errors, $c->loc('Username is not authorized to be used'); ++ } ++ + if ($c->request->params->{gn} !~ /^\p{IsAlnum}+$/) { + push @errors, $c->loc( + 'The first name supplied contains illegal characters' +@@ -108,7 +122,8 @@ + push @errors,$mesg->error; + $c->log->info( sprintf("Creating DN $dn failed: %s", $mesg->error) ); + $c->stash(errors => \@errors); +- #$c->stash(template => 'register/index.tt'); ++ $c->stash(template => 'register/index.tt'); ++ return ; + } + + $c->stash( + +<a id="identityCatDapbrancheslivelibCatDapControlleruserpm">Modified: identity/CatDap/branches/live/lib/CatDap/Controller/user.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/Controller/user.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/Controller/user.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -55,7 +55,7 @@ + my $mesg; + my $dn; + my @errors; +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + if (! defined $c->user or not $c->req->cookie('key')) { + if (not $c->req->param('password')) { + push @errors,$c->loc('Your session has expired'); +@@ -112,6 +112,22 @@ + + } + ++sub get_keyprefix : Private { ++ my ( $self, $c ) = @_; ++ my $keyprefix; ++ if ($c->req->address =~ m/:/) { ++ my $address = $c->req->address; ++ $address =~ s/\[\]://; ++ ++ # if we shift right 104 bits from 128 we have 24 bits left or 3 bytes. ++ $keyprefix = sprintf( "%06x", $address >> 104 ); ++ } ++ else { ++ $keyprefix = sprintf( "%02x%02x%02x", split /\./, $c->req->address ); ++ } ++ return $keyprefix; ++} ++ + =head2 index + + =cut +@@ -293,7 +309,7 @@ + } else { + + # re-encrypt the new password and forward to user view +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + my $key = $c->req->cookie('key')->value; + $cipher = Crypt::CBC->new( -key => $keyprefix . $key, + -cipher => 'Blowfish' +@@ -321,7 +337,7 @@ + $c->res->redirect('/user'); + } + # cache password for next request with form data +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + my $key = Data::UUID->new->create_str(); + $cipher = Crypt::CBC->new( -key => $keyprefix . $key, + -cipher => 'Blowfish' +@@ -338,7 +354,7 @@ + } + + #Re-authenticate user +- my $keyprefix = sprintf("%02x%02x%02x",split /\./,$c->req->address); ++ my $keyprefix = $self->get_keyprefix($c); + my $key = $c->req->cookie('key')->value; + $cipher = Crypt::CBC->new( -key => $keyprefix . $key, + -cipher => 'Blowfish' + +<a id="identityCatDapbrancheslivelibCatDapI18Nafpo">Modified: identity/CatDap/branches/live/lib/CatDap/I18N/af.po</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/I18N/af.po 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/I18N/af.po 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,45 +1,78 @@ +-#: lib/CatDap/Controller/register.pm:119 ++#: lib/CatDap/Controller/register.pm:133 + msgid "Activation" + msgstr "Aktivering" + +-#: root/user/index.tt:28 root/user/index.tt:8 ++#: root/admin/account_addoc.tt:28 root/admin/account_modify.tt:24 ++#: root/admin/group_modify.tt:18 root/user/index.tt:19 root/user/index.tt:46 + msgid "Add" + msgstr "Voeg by" + ++#: root/admin/account_modify.tt:85 ++msgid "Add ObjectClass" ++msgstr "" ++ ++#: root/admin/account_modify.tt:47 ++msgid "Add attribute" ++msgstr "" ++ ++#. (oc, dn) ++#: root/admin/account_addoc.tt:1 ++msgid "Adding objectclass %1 to dn %2" ++msgstr "" ++ + #: lib/CatDap/Controller/register.pm:49 + msgid "Addresses do not match" + msgstr "Die addresse verskil" + +-#: lib/CatDap/Controller/register.pm:75 ++#: lib/CatDap/Controller/register.pm:89 + msgid "An account already exists with this email address" + msgstr "'n Rekening met hierde epos adres bestaan reeds" + +-#: lib/CatDap/Controller/register.pm:80 ++#: lib/CatDap/Controller/register.pm:94 + msgid "An account already exists with this username" + msgstr "'n Rekening met hierdie gebruikersnaam bestaan reeds" + + #. ($errors) +-#: lib/CatDap/Controller/admin.pm:529 ++#: lib/CatDap/Controller/register.pm:145 + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process f you entered the correct email address: %1" ++"the password recovery process if you entered the correct email address. " ++"Errors %1" + msgstr "" + "Daar was 'n fout met die stuur van die aktiverings epos, maar jou rekening " + "is geskep. Probeer die wagwoord herwinnings proses as die epos adres korrek " +-"was: %1" ++"was. Foute: %1" + + #. ($errors) +-#: lib/CatDap/Controller/register.pm:131 ++#: lib/CatDap/Controller/admin.pm:539 ++#, fuzzy + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process if you entered the correct email address. " +-"Errors %1" ++"the password recovery process if you entered the correct email address: %1" + msgstr "" + "Daar was 'n fout met die stuur van die aktiverings epos, maar jou rekening " + "is geskep. Probeer die wagwoord herwinnings proses as die epos adres korrek " +-"was. Foute: %1" ++"was: %1" + +-#: root/user/firstlogin.tt:14 root/user/password.tt:18 ++#. ($errors) ++#: lib/CatDap/Controller/forgot_password.pm:105 ++msgid "An error occured sending the email, please try again later. Errors %1" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:9 root/admin/account_modify.tt:8 ++#: root/admin/group_modify.tt:5 root/user/index.tt:4 ++msgid "Attribute" ++msgstr "" ++ ++#: lib/CatDap/Controller/register.pm:56 ++msgid "Cannot check /etc/passwd, please warn system administrators" ++msgstr "" ++ ++#: root/register/index.tt:29 ++msgid "Captcha" ++msgstr "" ++ ++#: root/user/firstlogin.tt:14 root/user/password.tt:19 + msgid "Change" + msgstr "Verander" + +@@ -51,7 +84,12 @@ + msgid "Check your mail for activation instructions." + msgstr "Kyk jou epos vir aktiverings instruksies." + +-#: root/register/index.tt:34 ++#: root/forgot_password/complete.tt:5 ++#, fuzzy ++msgid "Check your mail for password reset instructions." ++msgstr "Kyk jou epos vir aktiverings instruksies." ++ ++#: root/register/index.tt:24 + msgid "Confirm Email address" + msgstr "Bevestig epos adres" + +@@ -62,10 +100,11 @@ + #. (cn) + #. (entry.cn) + #: root/email/activation.tt:1 root/email/admin/password.tt:1 ++#: root/email/forgot_password.tt:1 + msgid "Dear %1," + msgstr "Liewe %1," + +-#: root/user/index.tt:9 ++#: root/admin/account_modify.tt:27 root/user/index.tt:22 + msgid "Delete" + msgstr "Vee uit" + +@@ -73,18 +112,75 @@ + msgid "Edit" + msgstr "Wysig" + +-#: root/register/index.tt:30 ++#: root/admin/account.tt:33 root/admin/account.tt:8 ++#: root/admin/account_promote.tt:6 root/register/index.tt:20 ++msgid "Email" ++msgstr "" ++ ++#: root/forgot_password/index.tt:11 root/register/index.tt:21 + msgid "Email address" + msgstr "Epos adres" + +-#: root/register/index.tt:22 ++#: root/forgot_password/complete.tt:1 ++msgid "Email sent." ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:2 ++#, fuzzy ++msgid "Enter new password." ++msgstr "Verander wagwoord" ++ ++#: root/register/index.tt:32 ++msgid "Enter text" ++msgstr "" ++ ++#: root/admin/account.tt:34 root/admin/account_promote.tt:7 ++#, fuzzy ++msgid "First Name" ++msgstr "Voornaam" ++ ++#: root/register/index.tt:13 + msgid "First name" + msgstr "Voornaam" + ++#: lib/CatDap/Controller/forgot_password.pm:94 ++#, fuzzy ++msgid "Forgot password" ++msgstr "Huidige wagwoord" ++ ++#: root/forgot_password/index.tt:5 ++msgid "Forgot your password?" ++msgstr "" ++ ++#: root/index.tt:17 root/index.tt:18 ++#, fuzzy ++msgid "Forgotten password?" ++msgstr "Huidige wagwoord" ++ ++#: root/admin/account.tt:36 root/admin/account.tt:9 ++#: root/admin/account_promote.tt:9 ++msgid "Full Name" ++msgstr "" ++ ++#: root/admin/group.tt:27 ++msgid "Group Name" ++msgstr "" ++ ++#: root/admin/group.tt:9 ++#, fuzzy ++msgid "Group name" ++msgstr "Voornaam" ++ ++#: root/admin/account_modify.tt:2 ++msgid "Groups" ++msgstr "" ++ ++#: lib/CatDap/Controller/forgot_password.pm:48 + #: lib/CatDap/Controller/register.pm:52 + msgid "Incorrect validation text, please try again" + msgstr "Inkorrekte teks van die prentjie, probeer weer" + ++#: lib/CatDap/Controller/forgot_password.pm:45 + #: lib/CatDap/Controller/register.pm:46 + msgid "Invalid email address" + msgstr "Ongeldige epos adres" +@@ -93,39 +189,69 @@ + msgid "Invalid username" + msgstr "Ongeldige gebruikersnaam" + +-#: root/template/header:12 root/user/fake.tt:3 ++#: lib/CatDap/Controller/register.pm:59 ++msgid "Invalid username, already used by system" ++msgstr "" ++ ++#: root/template/header:10 root/user/fake.tt:3 + msgid "Log out" + msgstr "Teken uit" + +-#: root/index.tt:1 root/index.tt:17 ++#: root/index.tt:1 root/index.tt:13 + msgid "Login" + msgstr "Teken in" + +-#: root/user/firstlogin.tt:5 root/user/password.tt:9 ++#: root/forgot_password/confirm.tt:8 root/user/firstlogin.tt:5 ++#: root/user/password.tt:10 + msgid "New Password" + msgstr "Nuwe Wagwoord" + +-#: lib/CatDap/Controller/user.pm:273 ++#: lib/CatDap/Controller/user.pm:296 + msgid "New passwords dont match" + msgstr "Nuwe wagwoorde verskil" + +-#: root/index.tt:11 ++#: root/forgot_password/complete.tt:4 ++#, fuzzy ++msgid "Operation was successful." ++msgstr "Registrasie was suksesvol." ++ ++#: root/index.tt:10 + msgid "Password" + msgstr "Wagwoord" + +-#: lib/CatDap/Controller/user.pm:267 ++#: lib/CatDap/Controller/user.pm:290 + msgid "Password incorrect" + msgstr "Wagwoord inkorrek" + +-#: lib/CatDap/Controller/admin.pm:532 ++#: lib/CatDap/Controller/admin.pm:542 + msgid "Password reset and email sent" + msgstr "Wagwoord is herstel en epos gestuur" + ++#: root/register/index.tt:12 ++msgid "Personal Information" ++msgstr "" ++ + #: root/email/admin/password.tt:5 + msgid "Please click below to change your password" + msgstr "Volg die skakel onder en verander jou wagwoord" + +-#: root/index.tt:18 root/register/index.tt:43 root/register/index.tt:6 ++#: root/admin/index.tt:1 ++msgid "Please use the menus above." ++msgstr "" ++ ++#: root/admin/account_promote.tt:25 ++msgid "Primary group" ++msgstr "" ++ ++#: root/admin/account_modify.tt:71 ++msgid "Promote" ++msgstr "" ++ ++#: root/admin/account_modify.tt:62 ++msgid "Promote user to posixAccount with primary group:" ++msgstr "" ++ ++#: root/index.tt:16 root/register/index.tt:3 root/register/index.tt:35 + msgid "Register" + msgstr "Registreer" + +@@ -137,35 +263,95 @@ + msgid "Registration was successful." + msgstr "Registrasie was suksesvol." + +-#: root/user/firstlogin.tt:9 root/user/password.tt:13 ++#: root/forgot_password/confirm.tt:11 root/user/firstlogin.tt:10 ++#: root/user/password.tt:15 + msgid "Repeat New Password" + msgstr "Herhaal Nuwe Wagwoord" + +-#: root/register/index.tt:26 ++#: root/admin/account_modify.tt:1 ++#, fuzzy ++msgid "Reset password" ++msgstr "Huidige wagwoord" ++ ++#: root/admin/account.tt:22 ++msgid "Search" ++msgstr "" ++ ++#: root/admin/account.tt:4 root/admin/group.tt:5 ++msgid "Search by" ++msgstr "" ++ ++#: root/admin/account_promote.tt:4 ++msgid "Select" ++msgstr "" ++ ++#: root/forgot_password/index.tt:18 ++#, fuzzy ++msgid "Send me my password" ++msgstr "Verander wagwoord" ++ ++#: root/forgot_password/confirm.tt:16 ++#, fuzzy ++msgid "Set new password" ++msgstr "Herhaal Nuwe Wagwoord" ++ ++#: root/register/check.tt:1 ++msgid "Success" ++msgstr "" ++ ++#: root/admin/account.tt:10 root/admin/account.tt:35 ++#: root/admin/account_promote.tt:8 root/register/index.tt:16 + msgid "Surname" + msgstr "Van" + +-#: lib/CatDap/Controller/register.pm:56 ++#: lib/CatDap/Controller/register.pm:70 + msgid "The first name supplied contains illegal characters" + msgstr "Die verskafte noemnaam sluit ongeldige karakters in" + +-#: lib/CatDap/Controller/register.pm:61 ++#: lib/CatDap/Controller/register.pm:75 + msgid "The surname supplied contains illegal characters" + msgstr "Die verskafte van sluit ondeldige karakters in" + ++#: lib/CatDap/Controller/forgot_password.pm:66 ++msgid "This email address is not bound to an account" ++msgstr "" ++ + #: root/email/activation.tt:3 + msgid "To activate your account, please follow the link below." + msgstr "Om U rekening te aktiveer, volg asseblief die volgende skakel." + +-#: root/user/index.tt:13 ++#: root/email/forgot_password.tt:3 ++#, fuzzy ++msgid "To reset your password, please follow the link below." ++msgstr "Om U rekening te aktiveer, volg asseblief die volgende skakel." ++ ++#: root/admin/account_modify.tt:35 root/user/index.tt:29 + msgid "Update" + msgstr "Opdateer" + +-#: root/index.tt:7 root/register/index.tt:18 ++#: root/admin/account.tt:32 root/admin/account.tt:7 ++#: root/admin/account_promote.tt:5 root/index.tt:6 root/register/index.tt:7 ++#: root/register/index.tt:8 + msgid "Username" + msgstr "Gebruikersnaam" + ++#: lib/CatDap/Controller/register.pm:65 ++msgid "Username is not authorized to be used" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:10 root/admin/account_modify.tt:9 ++#: root/admin/group_modify.tt:6 root/user/index.tt:4 ++msgid "Value" ++msgstr "" ++ + #. (c.config.organisation) ++#: root/email/forgot_password.tt:2 ++msgid "" ++"Your %1 account has been requested to change the password. If you did not do " ++"this, or you do not want to change your password; you can just do nothing." ++msgstr "" ++ ++#. (c.config.organisation) + #: root/email/activation.tt:2 + msgid "Your %1 account has been successfully created, but requires activation." + msgstr "Jou %1 rekening is suksesvol geskep, maar aktivering is benodig" +@@ -179,14 +365,42 @@ + msgid "Your session has expired" + msgstr "Jou sessie het verstrek" + +-#: root/index.tt:17 +-msgid "or" +-msgstr "of" ++#: root/admin/account.tt:15 root/admin/group.tt:15 ++msgid "contains" ++msgstr "" + +-#: lib/CatDap/Controller/admin.pm:516 ++#: root/admin/group_modify.tt:14 ++#, fuzzy ++msgid "delete" ++msgstr "Vee uit" ++ ++#: root/admin/account.tt:17 root/admin/group.tt:17 ++msgid "greater than or equal to" ++msgstr "" ++ ++#: root/admin/account.tt:16 root/admin/group.tt:16 ++msgid "is exactly" ++msgstr "" ++ ++#: root/admin/account.tt:18 root/admin/group.tt:18 ++msgid "less than" ++msgstr "" ++ ++#: root/admin/group.tt:10 ++msgid "member" ++msgstr "" ++ ++#: lib/CatDap/Controller/admin.pm:526 + msgid "password reset" + msgstr "Wagwoord herstelling" + ++#: root/admin/account_modify.tt:53 ++msgid "with value" ++msgstr "" ++ ++#~ msgid "or" ++#~ msgstr "of" ++ + #~ msgid "Repeat" + #~ msgstr "Herhaal" + + +<a id="identityCatDapbrancheslivelibCatDapI18Nfrpo">Modified: identity/CatDap/branches/live/lib/CatDap/I18N/fr.po</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/I18N/fr.po 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/I18N/fr.po 2011-01-05 15:32:57 UTC (rev 212) +@@ -5,98 +5,202 @@ + # + msgid "" + msgstr "" +-"Project-Id-Version: PACKAGE VERSION\n" ++"Project-Id-Version: Catdap\n" + "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +-"PO-Revision-Date: 2010-10-19 21:07+0100\n" ++"PO-Revision-Date: 2010-11-04 21:09+0100\n" + "Last-Translator: Michael Scherer <misc@zarb.org>\n" +-"Language-Team: LANGUAGE <LL@li.org>\n" ++"Language-Team: LANGUAGE <mageia-i18n@mageia.org>\n" ++"Language: \n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" ++"X-Poedit-Language: French\n" ++"X-Poedit-Country: FRANCE\n" ++"X-Poedit-SourceCharset: utf-8\n" + +-#: lib/CatDap/Controller/register.pm:119 ++#: lib/CatDap/Controller/register.pm:133 + msgid "Activation" +-msgstr "" ++msgstr "Activation" + +-#: root/user/index.tt:28 root/user/index.tt:8 ++#: root/admin/account_addoc.tt:28 root/admin/account_modify.tt:24 ++#: root/admin/group_modify.tt:18 root/user/index.tt:19 root/user/index.tt:46 + msgid "Add" ++msgstr "Ajouter" ++ ++#: root/admin/account_modify.tt:85 ++msgid "Add ObjectClass" + msgstr "" + ++#: root/admin/account_modify.tt:47 ++msgid "Add attribute" ++msgstr "" ++ ++#. (oc, dn) ++#: root/admin/account_addoc.tt:1 ++msgid "Adding objectclass %1 to dn %2" ++msgstr "" ++ + #: lib/CatDap/Controller/register.pm:49 + msgid "Addresses do not match" + msgstr "Les adresses ne correspondent pas" + +-#: lib/CatDap/Controller/register.pm:75 ++#: lib/CatDap/Controller/register.pm:89 + msgid "An account already exists with this email address" +-msgstr "" ++msgstr "Un compte existe déjà avec cet email" + +-#: lib/CatDap/Controller/register.pm:80 ++#: lib/CatDap/Controller/register.pm:94 + msgid "An account already exists with this username" + msgstr "Un compte existe déjà pour ce nom d'utilisateur" + + #. ($errors) +-#: lib/CatDap/Controller/admin.pm:529 ++#: lib/CatDap/Controller/register.pm:145 + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process f you entered the correct email address: %1" ++"the password recovery process if you entered the correct email address. " ++"Errors %1" + msgstr "" ++"Une erreur est arrivé lors de l'envoi du mail, mais votre compte a été crée. " ++"Vous pouvez utiliser la fonction de réinitialisation du mot de passe si " ++"votre adresse est correcte. Erreurs %1" + + #. ($errors) +-#: lib/CatDap/Controller/register.pm:131 ++#: lib/CatDap/Controller/admin.pm:539 ++#, fuzzy + msgid "" + "An error occured sending the email, but your account was created. Please try " +-"the password recovery process if you entered the correct email address. " +-"Errors %1" ++"the password recovery process if you entered the correct email address: %1" + msgstr "" ++"Une erreur est arrivé lors de l'envoi du mail, mais votre compte a été crée. " ++"Vous pouvez utiliser la fonction de réinitialisation du mot de passe si " ++"votre adresse est correcte : %1" + +-#: root/user/firstlogin.tt:14 root/user/password.tt:18 +-msgid "Change" ++#. ($errors) ++#: lib/CatDap/Controller/forgot_password.pm:105 ++msgid "An error occured sending the email, please try again later. Errors %1" + msgstr "" + ++#: root/admin/account_addoc.tt:9 root/admin/account_modify.tt:8 ++#: root/admin/group_modify.tt:5 root/user/index.tt:4 ++msgid "Attribute" ++msgstr "" ++ ++#: lib/CatDap/Controller/register.pm:56 ++msgid "Cannot check /etc/passwd, please warn system administrators" ++msgstr "" ++ ++#: root/register/index.tt:29 ++msgid "Captcha" ++msgstr "" ++ ++#: root/user/firstlogin.tt:14 root/user/password.tt:19 ++msgid "Change" ++msgstr "Changer" ++ + #: root/user/fake.tt:2 +-#, fuzzy + msgid "Change password" +-msgstr "Mot de passe" ++msgstr "Changer le mot de passe" + + #: root/register/complete.tt:5 + msgid "Check your mail for activation instructions." +-msgstr "" ++msgstr "Vérifier votre boite mail pour les instructions d'activation" + +-#: root/register/index.tt:34 ++#: root/forgot_password/complete.tt:5 ++#, fuzzy ++msgid "Check your mail for password reset instructions." ++msgstr "Vérifier votre boite mail pour les instructions d'activation" ++ ++#: root/register/index.tt:24 + msgid "Confirm Email address" +-msgstr "" ++msgstr "Confirmer l'adresse email" + + #: root/user/password.tt:5 + msgid "Current password" +-msgstr "" ++msgstr "Mot de passe actuel" + + #. (cn) + #. (entry.cn) + #: root/email/activation.tt:1 root/email/admin/password.tt:1 +-#, fuzzy ++#: root/email/forgot_password.tt:1 + msgid "Dear %1," +-msgstr "Cher(e)" ++msgstr "Cher(e) %1," + +-#: root/user/index.tt:9 ++#: root/admin/account_modify.tt:27 root/user/index.tt:22 + msgid "Delete" +-msgstr "" ++msgstr "Supprimer" + + #: root/user/fake.tt:1 + msgid "Edit" ++msgstr "Éditer" ++ ++#: root/admin/account.tt:33 root/admin/account.tt:8 ++#: root/admin/account_promote.tt:6 root/register/index.tt:20 ++msgid "Email" + msgstr "" + +-#: root/register/index.tt:30 ++#: root/forgot_password/index.tt:11 root/register/index.tt:21 + msgid "Email address" +-msgstr "Adresse de messagerie" ++msgstr "Adresse email" + +-#: root/register/index.tt:22 ++#: root/forgot_password/complete.tt:1 ++msgid "Email sent." ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:2 ++#, fuzzy ++msgid "Enter new password." ++msgstr "Changer le mot de passe" ++ ++#: root/register/index.tt:32 ++msgid "Enter text" ++msgstr "" ++ ++#: root/admin/account.tt:34 root/admin/account_promote.tt:7 ++#, fuzzy ++msgid "First Name" ++msgstr "Prénom" ++ ++#: root/register/index.tt:13 + msgid "First name" + msgstr "Prénom" + ++#: lib/CatDap/Controller/forgot_password.pm:94 ++#, fuzzy ++msgid "Forgot password" ++msgstr "Mot de passe actuel" ++ ++#: root/forgot_password/index.tt:5 ++msgid "Forgot your password?" ++msgstr "" ++ ++#: root/index.tt:17 root/index.tt:18 ++#, fuzzy ++msgid "Forgotten password?" ++msgstr "Mot de passe actuel" ++ ++#: root/admin/account.tt:36 root/admin/account.tt:9 ++#: root/admin/account_promote.tt:9 ++msgid "Full Name" ++msgstr "" ++ ++#: root/admin/group.tt:27 ++msgid "Group Name" ++msgstr "" ++ ++#: root/admin/group.tt:9 ++#, fuzzy ++msgid "Group name" ++msgstr "Prénom" ++ ++#: root/admin/account_modify.tt:2 ++msgid "Groups" ++msgstr "" ++ ++#: lib/CatDap/Controller/forgot_password.pm:48 + #: lib/CatDap/Controller/register.pm:52 + msgid "Incorrect validation text, please try again" +-msgstr "" ++msgstr "Texte de validation incorrect, merci de tester à nouveau" + ++#: lib/CatDap/Controller/forgot_password.pm:45 + #: lib/CatDap/Controller/register.pm:46 + msgid "Invalid email address" + msgstr "Adresse mail invalide" +@@ -105,105 +209,218 @@ + msgid "Invalid username" + msgstr "Nom d'utilisateur invalide" + +-#: root/template/header:12 root/user/fake.tt:3 +-msgid "Log out" ++#: lib/CatDap/Controller/register.pm:59 ++msgid "Invalid username, already used by system" + msgstr "" + +-#: root/index.tt:1 root/index.tt:17 ++#: root/template/header:10 root/user/fake.tt:3 ++msgid "Log out" ++msgstr "Se déconnecter" ++ ++#: root/index.tt:1 root/index.tt:13 + msgid "Login" + msgstr "Login" + +-#: root/user/firstlogin.tt:5 root/user/password.tt:9 +-#, fuzzy ++#: root/forgot_password/confirm.tt:8 root/user/firstlogin.tt:5 ++#: root/user/password.tt:10 + msgid "New Password" +-msgstr "Mot de passe" ++msgstr "Nouveau mot de passe" + +-#: lib/CatDap/Controller/user.pm:273 +-#, fuzzy ++#: lib/CatDap/Controller/user.pm:296 + msgid "New passwords dont match" +-msgstr "Les adresses ne correspondent pas" ++msgstr "Les mot de passes ne correspondent pas" + +-#: root/index.tt:11 ++#: root/forgot_password/complete.tt:4 ++#, fuzzy ++msgid "Operation was successful." ++msgstr "L'enregistrement a réussi" ++ ++#: root/index.tt:10 + msgid "Password" + msgstr "Mot de passe" + +-#: lib/CatDap/Controller/user.pm:267 +-#, fuzzy ++#: lib/CatDap/Controller/user.pm:290 + msgid "Password incorrect" +-msgstr "Mot de passe" ++msgstr "Mot de passe incorrect" + +-#: lib/CatDap/Controller/admin.pm:532 ++#: lib/CatDap/Controller/admin.pm:542 + msgid "Password reset and email sent" ++msgstr "Mot de passe réinitialiser, email envoyé" ++ ++#: root/register/index.tt:12 ++msgid "Personal Information" + msgstr "" + + #: root/email/admin/password.tt:5 + msgid "Please click below to change your password" ++msgstr "Cliquer ici pour changer votre mot de passe" ++ ++#: root/admin/index.tt:1 ++msgid "Please use the menus above." + msgstr "" + +-#: root/index.tt:18 root/register/index.tt:43 root/register/index.tt:6 ++#: root/admin/account_promote.tt:25 ++msgid "Primary group" ++msgstr "" ++ ++#: root/admin/account_modify.tt:71 ++msgid "Promote" ++msgstr "" ++ ++#: root/admin/account_modify.tt:62 ++msgid "Promote user to posixAccount with primary group:" ++msgstr "" ++ ++#: root/index.tt:16 root/register/index.tt:3 root/register/index.tt:35 + msgid "Register" + msgstr "S'enregistrer" + + #: root/register/complete.tt:1 + msgid "Registration completed" +-msgstr "" ++msgstr "Enregistrement terminé" + + #: root/register/complete.tt:4 + msgid "Registration was successful." +-msgstr "" ++msgstr "L'enregistrement a réussi" + +-#: root/user/firstlogin.tt:9 root/user/password.tt:13 ++#: root/forgot_password/confirm.tt:11 root/user/firstlogin.tt:10 ++#: root/user/password.tt:15 + msgid "Repeat New Password" ++msgstr "Répéter le nouveau de passe" ++ ++#: root/admin/account_modify.tt:1 ++#, fuzzy ++msgid "Reset password" ++msgstr "Mot de passe actuel" ++ ++#: root/admin/account.tt:22 ++msgid "Search" + msgstr "" + +-#: root/register/index.tt:26 ++#: root/admin/account.tt:4 root/admin/group.tt:5 ++msgid "Search by" ++msgstr "" ++ ++#: root/admin/account_promote.tt:4 ++msgid "Select" ++msgstr "" ++ ++#: root/forgot_password/index.tt:18 ++#, fuzzy ++msgid "Send me my password" ++msgstr "Changer le mot de passe" ++ ++#: root/forgot_password/confirm.tt:16 ++#, fuzzy ++msgid "Set new password" ++msgstr "Répéter le nouveau de passe" ++ ++#: root/register/check.tt:1 ++msgid "Success" ++msgstr "" ++ ++#: root/admin/account.tt:10 root/admin/account.tt:35 ++#: root/admin/account_promote.tt:8 root/register/index.tt:16 + msgid "Surname" +-msgstr "Surnom" ++msgstr "Nom" + +-#: lib/CatDap/Controller/register.pm:56 ++#: lib/CatDap/Controller/register.pm:70 + msgid "The first name supplied contains illegal characters" +-msgstr "" ++msgstr "Le prénom proposé contient des caractères interdits" + +-#: lib/CatDap/Controller/register.pm:61 ++#: lib/CatDap/Controller/register.pm:75 + msgid "The surname supplied contains illegal characters" ++msgstr "Le nom proposé contient des caractères interdits" ++ ++#: lib/CatDap/Controller/forgot_password.pm:66 ++msgid "This email address is not bound to an account" + msgstr "" + + #: root/email/activation.tt:3 +-#, fuzzy + msgid "To activate your account, please follow the link below." + msgstr "Pour activer votre compte, merci de suivre le lien ci dessous." + +-#: root/user/index.tt:13 ++#: root/email/forgot_password.tt:3 ++#, fuzzy ++msgid "To reset your password, please follow the link below." ++msgstr "Pour activer votre compte, merci de suivre le lien ci dessous." ++ ++#: root/admin/account_modify.tt:35 root/user/index.tt:29 + msgid "Update" +-msgstr "" ++msgstr "Mettre à jour" + +-#: root/index.tt:7 root/register/index.tt:18 ++#: root/admin/account.tt:32 root/admin/account.tt:7 ++#: root/admin/account_promote.tt:5 root/index.tt:6 root/register/index.tt:7 ++#: root/register/index.tt:8 + msgid "Username" + msgstr "Nom d'utilisateur" + ++#: lib/CatDap/Controller/register.pm:65 ++msgid "Username is not authorized to be used" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:10 root/admin/account_modify.tt:9 ++#: root/admin/group_modify.tt:6 root/user/index.tt:4 ++msgid "Value" ++msgstr "" ++ + #. (c.config.organisation) ++#: root/email/forgot_password.tt:2 ++msgid "" ++"Your %1 account has been requested to change the password. If you did not do " ++"this, or you do not want to change your password; you can just do nothing." ++msgstr "" ++ ++#. (c.config.organisation) + #: root/email/activation.tt:2 + msgid "Your %1 account has been successfully created, but requires activation." +-msgstr "" ++msgstr "Votre compte %1 a été crée mais requiert d'être activé" + + #. (c.user.username) + #: root/email/admin/password.tt:3 + msgid "Your password was reset by %1" +-msgstr "" ++msgstr "Votre mot de passe a été réinitialisé par %1" + + #: lib/CatDap/Controller/user.pm:61 + msgid "Your session has expired" ++msgstr "Votre session a expiré" ++ ++#: root/admin/account.tt:15 root/admin/group.tt:15 ++msgid "contains" + msgstr "" + +-#: root/index.tt:17 +-msgid "or" +-msgstr "ou" ++#: root/admin/group_modify.tt:14 ++#, fuzzy ++msgid "delete" ++msgstr "Supprimer" + +-#: lib/CatDap/Controller/admin.pm:516 +-#, fuzzy ++#: root/admin/account.tt:17 root/admin/group.tt:17 ++msgid "greater than or equal to" ++msgstr "" ++ ++#: root/admin/account.tt:16 root/admin/group.tt:16 ++msgid "is exactly" ++msgstr "" ++ ++#: root/admin/account.tt:18 root/admin/group.tt:18 ++msgid "less than" ++msgstr "" ++ ++#: root/admin/group.tt:10 ++msgid "member" ++msgstr "" ++ ++#: lib/CatDap/Controller/admin.pm:526 + msgid "password reset" +-msgstr "Mot de passe" ++msgstr "réinitialisation du mot de passe" + ++#: root/admin/account_modify.tt:53 ++msgid "with value" ++msgstr "" ++ ++#~ msgid "or" ++#~ msgstr "ou" ++ + #~ msgid "Mageia Identity Activation" + #~ msgstr "Activation de l'identité Mageia" + + +<a id="identityCatDapbrancheslivelibCatDapI18Nmessagespot">Modified: identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap/I18N/messages.pot 2011-01-05 15:32:57 UTC (rev 212) +@@ -15,37 +15,67 @@ + "Content-Type: text/plain; charset=CHARSET\n" + "Content-Transfer-Encoding: 8bit\n" + +-#: lib/CatDap/Controller/register.pm:119 ++#: lib/CatDap/Controller/register.pm:133 + msgid "Activation" + msgstr "" + +-#: root/user/index.tt:28 root/user/index.tt:8 ++#: root/admin/account_addoc.tt:28 root/admin/account_modify.tt:24 root/admin/group_modify.tt:18 root/user/index.tt:19 root/user/index.tt:46 + msgid "Add" + msgstr "" + ++#: root/admin/account_modify.tt:85 ++msgid "Add ObjectClass" ++msgstr "" ++ ++#: root/admin/account_modify.tt:47 ++msgid "Add attribute" ++msgstr "" ++ ++#. (oc, dn) ++#: root/admin/account_addoc.tt:1 ++msgid "Adding objectclass %1 to dn %2" ++msgstr "" ++ + #: lib/CatDap/Controller/register.pm:49 + msgid "Addresses do not match" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:75 ++#: lib/CatDap/Controller/register.pm:89 + msgid "An account already exists with this email address" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:80 ++#: lib/CatDap/Controller/register.pm:94 + msgid "An account already exists with this username" + msgstr "" + + #. ($errors) +-#: lib/CatDap/Controller/admin.pm:529 +-msgid "An error occured sending the email, but your account was created. Please try the password recovery process f you entered the correct email address: %1" ++#: lib/CatDap/Controller/register.pm:145 ++msgid "An error occured sending the email, but your account was created. Please try the password recovery process if you entered the correct email address. Errors %1" + msgstr "" + + #. ($errors) +-#: lib/CatDap/Controller/register.pm:131 +-msgid "An error occured sending the email, but your account was created. Please try the password recovery process if you entered the correct email address. Errors %1" ++#: lib/CatDap/Controller/admin.pm:539 ++msgid "An error occured sending the email, but your account was created. Please try the password recovery process if you entered the correct email address: %1" + msgstr "" + +-#: root/user/firstlogin.tt:14 root/user/password.tt:18 ++#. ($errors) ++#: lib/CatDap/Controller/forgot_password.pm:105 ++msgid "An error occured sending the email, please try again later. Errors %1" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:9 root/admin/account_modify.tt:8 root/admin/group_modify.tt:5 root/user/index.tt:4 ++msgid "Attribute" ++msgstr "" ++ ++#: lib/CatDap/Controller/register.pm:56 ++msgid "Cannot check /etc/passwd, please warn system administrators" ++msgstr "" ++ ++#: root/register/index.tt:29 ++msgid "Captcha" ++msgstr "" ++ ++#: root/user/firstlogin.tt:14 root/user/password.tt:19 + msgid "Change" + msgstr "" + +@@ -57,7 +87,11 @@ + msgid "Check your mail for activation instructions." + msgstr "" + +-#: root/register/index.tt:34 ++#: root/forgot_password/complete.tt:5 ++msgid "Check your mail for password reset instructions." ++msgstr "" ++ ++#: root/register/index.tt:24 + msgid "Confirm Email address" + msgstr "" + +@@ -67,11 +101,11 @@ + + #. (cn) + #. (entry.cn) +-#: root/email/activation.tt:1 root/email/admin/password.tt:1 ++#: root/email/activation.tt:1 root/email/admin/password.tt:1 root/email/forgot_password.tt:1 + msgid "Dear %1," + msgstr "" + +-#: root/user/index.tt:9 ++#: root/admin/account_modify.tt:27 root/user/index.tt:22 + msgid "Delete" + msgstr "" + +@@ -79,19 +113,67 @@ + msgid "Edit" + msgstr "" + +-#: root/register/index.tt:30 ++#: root/admin/account.tt:33 root/admin/account.tt:8 root/admin/account_promote.tt:6 root/register/index.tt:20 ++msgid "Email" ++msgstr "" ++ ++#: root/forgot_password/index.tt:11 root/register/index.tt:21 + msgid "Email address" + msgstr "" + +-#: root/register/index.tt:22 ++#: root/forgot_password/complete.tt:1 ++msgid "Email sent." ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:2 ++msgid "Enter new password." ++msgstr "" ++ ++#: root/register/index.tt:32 ++msgid "Enter text" ++msgstr "" ++ ++#: root/admin/account.tt:34 root/admin/account_promote.tt:7 ++msgid "First Name" ++msgstr "" ++ ++#: root/register/index.tt:13 + msgid "First name" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:52 ++#: lib/CatDap/Controller/forgot_password.pm:94 ++msgid "Forgot password" ++msgstr "" ++ ++#: root/forgot_password/index.tt:5 ++msgid "Forgot your password?" ++msgstr "" ++ ++#: root/index.tt:17 root/index.tt:18 ++msgid "Forgotten password?" ++msgstr "" ++ ++#: root/admin/account.tt:36 root/admin/account.tt:9 root/admin/account_promote.tt:9 ++msgid "Full Name" ++msgstr "" ++ ++#: root/admin/group.tt:27 ++msgid "Group Name" ++msgstr "" ++ ++#: root/admin/group.tt:9 ++msgid "Group name" ++msgstr "" ++ ++#: root/admin/account_modify.tt:2 ++msgid "Groups" ++msgstr "" ++ ++#: lib/CatDap/Controller/forgot_password.pm:48 lib/CatDap/Controller/register.pm:52 + msgid "Incorrect validation text, please try again" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:46 ++#: lib/CatDap/Controller/forgot_password.pm:45 lib/CatDap/Controller/register.pm:46 + msgid "Invalid email address" + msgstr "" + +@@ -99,39 +181,67 @@ + msgid "Invalid username" + msgstr "" + +-#: root/template/header:12 root/user/fake.tt:3 ++#: lib/CatDap/Controller/register.pm:59 ++msgid "Invalid username, already used by system" ++msgstr "" ++ ++#: root/template/header:10 root/user/fake.tt:3 + msgid "Log out" + msgstr "" + +-#: root/index.tt:1 root/index.tt:17 ++#: root/index.tt:1 root/index.tt:13 + msgid "Login" + msgstr "" + +-#: root/user/firstlogin.tt:5 root/user/password.tt:9 ++#: root/forgot_password/confirm.tt:8 root/user/firstlogin.tt:5 root/user/password.tt:10 + msgid "New Password" + msgstr "" + +-#: lib/CatDap/Controller/user.pm:273 ++#: lib/CatDap/Controller/user.pm:296 + msgid "New passwords dont match" + msgstr "" + +-#: root/index.tt:11 ++#: root/forgot_password/complete.tt:4 ++msgid "Operation was successful." ++msgstr "" ++ ++#: root/index.tt:10 + msgid "Password" + msgstr "" + +-#: lib/CatDap/Controller/user.pm:267 ++#: lib/CatDap/Controller/user.pm:290 + msgid "Password incorrect" + msgstr "" + +-#: lib/CatDap/Controller/admin.pm:532 ++#: lib/CatDap/Controller/admin.pm:542 + msgid "Password reset and email sent" + msgstr "" + ++#: root/register/index.tt:12 ++msgid "Personal Information" ++msgstr "" ++ + #: root/email/admin/password.tt:5 + msgid "Please click below to change your password" + msgstr "" + +-#: root/index.tt:18 root/register/index.tt:43 root/register/index.tt:6 ++#: root/admin/index.tt:1 ++msgid "Please use the menus above." ++msgstr "" ++ ++#: root/admin/account_promote.tt:25 ++msgid "Primary group" ++msgstr "" ++ ++#: root/admin/account_modify.tt:71 ++msgid "Promote" ++msgstr "" ++ ++#: root/admin/account_modify.tt:62 ++msgid "Promote user to posixAccount with primary group:" ++msgstr "" ++ ++#: root/index.tt:16 root/register/index.tt:3 root/register/index.tt:35 + msgid "Register" + msgstr "" + +@@ -143,35 +253,84 @@ + msgid "Registration was successful." + msgstr "" + +-#: root/user/firstlogin.tt:9 root/user/password.tt:13 ++#: root/forgot_password/confirm.tt:11 root/user/firstlogin.tt:10 root/user/password.tt:15 + msgid "Repeat New Password" + msgstr "" + +-#: root/register/index.tt:26 ++#: root/admin/account_modify.tt:1 ++msgid "Reset password" ++msgstr "" ++ ++#: root/admin/account.tt:22 ++msgid "Search" ++msgstr "" ++ ++#: root/admin/account.tt:4 root/admin/group.tt:5 ++msgid "Search by" ++msgstr "" ++ ++#: root/admin/account_promote.tt:4 ++msgid "Select" ++msgstr "" ++ ++#: root/forgot_password/index.tt:18 ++msgid "Send me my password" ++msgstr "" ++ ++#: root/forgot_password/confirm.tt:16 ++msgid "Set new password" ++msgstr "" ++ ++#: root/register/check.tt:1 ++msgid "Success" ++msgstr "" ++ ++#: root/admin/account.tt:10 root/admin/account.tt:35 root/admin/account_promote.tt:8 root/register/index.tt:16 + msgid "Surname" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:56 ++#: lib/CatDap/Controller/register.pm:70 + msgid "The first name supplied contains illegal characters" + msgstr "" + +-#: lib/CatDap/Controller/register.pm:61 ++#: lib/CatDap/Controller/register.pm:75 + msgid "The surname supplied contains illegal characters" + msgstr "" + ++#: lib/CatDap/Controller/forgot_password.pm:66 ++msgid "This email address is not bound to an account" ++msgstr "" ++ + #: root/email/activation.tt:3 + msgid "To activate your account, please follow the link below." + msgstr "" + +-#: root/user/index.tt:13 ++#: root/email/forgot_password.tt:3 ++msgid "To reset your password, please follow the link below." ++msgstr "" ++ ++#: root/admin/account_modify.tt:35 root/user/index.tt:29 + msgid "Update" + msgstr "" + +-#: root/index.tt:7 root/register/index.tt:18 ++#: root/admin/account.tt:32 root/admin/account.tt:7 root/admin/account_promote.tt:5 root/index.tt:6 root/register/index.tt:7 root/register/index.tt:8 + msgid "Username" + msgstr "" + ++#: lib/CatDap/Controller/register.pm:65 ++msgid "Username is not authorized to be used" ++msgstr "" ++ ++#: root/admin/account_addoc.tt:10 root/admin/account_modify.tt:9 root/admin/group_modify.tt:6 root/user/index.tt:4 ++msgid "Value" ++msgstr "" ++ + #. (c.config.organisation) ++#: root/email/forgot_password.tt:2 ++msgid "Your %1 account has been requested to change the password. If you did not do this, or you do not want to change your password; you can just do nothing." ++msgstr "" ++ ++#. (c.config.organisation) + #: root/email/activation.tt:2 + msgid "Your %1 account has been successfully created, but requires activation." + msgstr "" +@@ -185,10 +344,34 @@ + msgid "Your session has expired" + msgstr "" + +-#: root/index.tt:17 +-msgid "or" ++#: root/admin/account.tt:15 root/admin/group.tt:15 ++msgid "contains" + msgstr "" + +-#: lib/CatDap/Controller/admin.pm:516 ++#: root/admin/group_modify.tt:14 ++msgid "delete" ++msgstr "" ++ ++#: root/admin/account.tt:17 root/admin/group.tt:17 ++msgid "greater than or equal to" ++msgstr "" ++ ++#: root/admin/account.tt:16 root/admin/group.tt:16 ++msgid "is exactly" ++msgstr "" ++ ++#: root/admin/account.tt:18 root/admin/group.tt:18 ++msgid "less than" ++msgstr "" ++ ++#: root/admin/group.tt:10 ++msgid "member" ++msgstr "" ++ ++#: lib/CatDap/Controller/admin.pm:526 + msgid "password reset" + msgstr "" ++ ++#: root/admin/account_modify.tt:53 ++msgid "with value" ++msgstr "" + +<a id="identityCatDapbrancheslivelibCatDappm">Modified: identity/CatDap/branches/live/lib/CatDap.pm</a> +=================================================================== +--- identity/CatDap/branches/live/lib/CatDap.pm 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/lib/CatDap.pm 2011-01-05 15:32:57 UTC (rev 212) +@@ -22,6 +22,7 @@ + Authentication + Authorization::Roles + I18N ++ Unicode::Encoding + /; + + extends 'Catalyst'; + +<a id="identityCatDapbranchesliverootadminaccounttt">Modified: identity/CatDap/branches/live/root/admin/account.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,24 +1,25 @@ + <form method="post" action=""> + <table> + <tr> +- <td>Search by</td> ++ <td>[% l('Search by') %]</td> + <td> + <select name="attribute"> +- <option value="uid">Username</option> +- <option value="mail">Email</option> +- <option value="cn">Full Name</option> +- <option value="sn">Surname</option> ++ <option value="uid">[% l('Username') %]</option> ++ <option value="mail">[% l('Email') %]</option> ++ <option value="cn">[% l('Full Name') %]</option> ++ <option value="sn">[% l('Surname') %]</option> + </select> + </td> + <!-- td> + <select name="matchtype"> +- <option value="substring">contains</option> +- <option value="exact">is exactly</option> +- <option value="gte">greater than or equal to</option> +- <option value="lt">less than</option> ++ <option value="substring">[% l('contains') %]</option> ++ <option value="exact">[% l('is exactly') %]</option> ++ <option value="gte">[% l('greater than or equal to') %]</option> ++ <option value="lt">[% l('less than') %]</option> + </select> + </td --> +- <td><input name="value" value="" /></td> ++ <td><input type="text" name="value" value="" /></td> ++ <td><button type="submit" value="[% l('Search') %]">[% l('Search') %]</button></td> + </tr> + </table> + </form> +@@ -28,11 +29,11 @@ + [% IF entries %] + <table border=0> + <tr> +- <th>Username</th> +- <th>Email</th> +- <th>First Name</th> +- <th>Surname</td> +- <th>Full Name</td> ++ <th>[% l('Username') %]</th> ++ <th>[% l('Email') %]</th> ++ <th>[% l('First Name') %]</th> ++ <th>[% l('Surname') %]</td> ++ <th>[% l('Full Name') %]</td> + </tr> + [% FOREACH entry IN entries %] + <tr> + +<a id="identityCatDapbranchesliverootadminaccount_addoctt">Modified: identity/CatDap/branches/live/root/admin/account_addoc.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_addoc.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_addoc.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,4 @@ +-Adding objectclass [% oc %] to dn [% dn %] ++[% l('Adding objectclass [_1] to dn [_2]', oc, dn) %] + + <form method="post" action=""> + <input type="hidden" name="dn" value="[% dn %]" /> +@@ -6,8 +6,8 @@ + <input type="hidden" name="objectclass" value="[% oc %]" /> + <table> + <tr> +- <th>Attribute</th> +- <th>Value</th> ++ <th>[% l('Attribute') %]</th> ++ <th>[% l('Value') %]</th> + </tr> + [% FOREACH attr IN must %] + [% IF attr != "objectClass" %] +@@ -25,6 +25,6 @@ + </tr> + [% END %] + </table> +- <p><input type="submit" value="Add" /></p> ++ <p><input type="submit" value="[% l('Add') %]" /></p> + + </form> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootadminaccount_grouptt">Modified: identity/CatDap/branches/live/root/admin/account_group.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_group.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_group.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,4 @@ +-<h2>Add user [% uid %] to a new group</h2> ++<h2>[% l('Add user [_1] to a new group, uid) %]</h2> + + <form method="post" action=""> + <input type='hidden' name='uid' value='[% uid %]' /> +@@ -8,12 +8,12 @@ + <option value='[% group.cn %]'>[% group.cn %]</option> + [% END %] + </select> +- <input type='submit' value='Add' /> ++ <input type='submit' value='[% l('Add') %]' /> + </form> + + <hr /> + +-<h2>Delete user [% uid %] from an existing group:</h2> ++<h2>[% l('Delete user [_1] from an existing group:', uid) %] </h2> + + <form method="post" action=""> + <input type='hidden' name='uid' value='[% uid %]' /> +@@ -23,7 +23,7 @@ + <option value='[% group.cn %]'>[% group.cn %]</option> + [% END %] + </select> +- <input type='submit' value='Delete' /> ++ <input type='submit' value='[% l('Delete') %]' /> + </form> + + <hr /> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootadminaccount_modifytt">Modified: identity/CatDap/branches/live/root/admin/account_modify.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_modify.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_modify.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,12 +1,12 @@ +-<a href="[% c.uri_for('/admin/password') %]/[% uid %]">Reset password</a> +-<a href="[% c.uri_for('/admin/account_group') %]/[% uid %]">Groups</a> ++<a href="[% c.uri_for('/admin/password') %]/[% uid %]">[% l('Reset password') %]</a> ++<a href="[% c.uri_for('/admin/account_group') %]/[% uid %]">[% l('Groups') %]</a> + + <form method="post" action=""> + <input type='hidden' name='operation' value='replace' /> + <table border=0> + <tr> +- <th>Attribute</th> +- <th>Value</th> ++ <th>[% l('Attribute') %]</th> ++ <th>[% l('Value') %]</th> + </tr> + [% FOREACH attr IN values %] + <tr> +@@ -21,10 +21,10 @@ + <br/> + [% END %] + [% IF attr.addable AND attr.editable %] +- <a href="[% c.uri_for('/admin/account_edit') %]/add/[% attr.name %]">Add</a> ++ <a href="[% c.uri_for('/admin/account_edit') %]/add/[% attr.name %]">[% l('Add') %]</a> + [% END %] + [% IF attr.removable AND attr.editable %] +- <a href="[% c.uri_for('/admin/account_modifydel') %]/[% uid %]/[% attr.name %]/[% val %]">Delete</a> ++ <a href="[% c.uri_for('/admin/account_modifydel') %]/[% uid %]/[% attr.name %]/[% val %]">[% l('Delete') %]</a> + [% END %] + [% END %] + </td> +@@ -32,7 +32,7 @@ + [% END %] + <tr> + <td colspan=2 align=center> +- <input type='Submit' value='Update'> ++ <input type='Submit' value='[% l('Update') %]'> + </td> + </tr> + </table> +@@ -44,13 +44,13 @@ + <input type="hidden" name="operation" value="add" /> + + <p> +- Add attribute ++ [% l('Add attribute') %] + <select name='attribute'> + [% FOREACH attr IN may %] + <option value="[% attr %]">[% attr %]</option> + [% END %] + </select> +- with value ++ [% l('with value') %] + <input name="value" value="" /> + <input type="submit" value="Add" /> + </p> +@@ -59,7 +59,7 @@ + <hr /> + + [% IF groups %] +-<p>Promote user to posixAccount with primary group: </p> ++<p>[% l('Promote user to posixAccount with primary group:') %] </p> + + <form method="post" action="[% c.uri_for('/admin/account_promote') %]"> + <input type="hidden" name="dn" value="[% dn %]" /> +@@ -68,7 +68,7 @@ + <option value="[% group.gidNumber %]">[% group.name %]</option> + [% END %] + </select> +- <input type="submit" value="Promote" /> ++ <input type="submit" value="[% l('Promote') %]" /> + </form> + [% END %] + +@@ -82,7 +82,7 @@ + <option value='[% oc %]'>[% oc %]</option> + [% END %] + </select> +- <input type="submit" value="Add ObjectClass" /> ++ <input type="submit" value="[% l('Add ObjectClass') %]" /> + </form> + + <hr /> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootadminaccount_promotett">Modified: identity/CatDap/branches/live/root/admin/account_promote.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/account_promote.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/account_promote.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,12 +1,12 @@ + <form method="post" action=""> + <table border=0> + <tr> +- <th>Select</th> +- <th>Username</th> +- <th>Email</th> +- <th>First Name</th> +- <th>Surname</td> +- <th>Full Name</td> ++ <th>[% l('Select') %]</th> ++ <th>[% l('Username') %]</th> ++ <th>[% l('Email') %]</th> ++ <th>[% l('First Name') %]</th> ++ <th>[% l('Surname') %]</td> ++ <th>[% l('Full Name') %]</td> + </tr> + [% FOREACH entry IN entries %] + <tr> +@@ -22,7 +22,7 @@ + + <table border=0> + <tr> +- <td>Primary group</td> ++ <td>[% l('Primary group') %]</td> + <td> + <select name="gid"> + [% FOREACH group IN groups %] + +<a id="identityCatDapbranchesliverootadmingrouptt">Modified: identity/CatDap/branches/live/root/admin/group.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/group.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/group.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -2,20 +2,20 @@ + <table> + <tr> + <td> +-Search by ++[% l('Search by') %] + </td> + <td> + <select name="attribute"> +-<option value="cn">Group name</option> +-<option value="member">member</option> ++<option value="cn">[% l('Group name') %]</option> ++<option value="member">[% l('member') %]</option> + </select> + </td> + <!-- td> + <select name="matchtype"> +-<option value="substring">contains</option> +-<option value="exact">is exactly</option> +-<option value="gte">greater than or equal to</option> +-<option value="lt">less than</option> ++<option value="substring">[% l('contains') %]</option> ++<option value="exact">[% l('is exactly') %]</option> ++<option value="gte">[% l('greater than or equal to') %]</option> ++<option value="lt">[% l('less than') %]</option> + </select> + </td --> + <td><input name='value'></td> +@@ -24,7 +24,7 @@ + [% IF entries %] + <table border=0> + <tr> +-<th>Group Name</th> ++<th>[% l('Group Name') %]</th> + </tr> + [% FOREACH entry IN entries %] + <tr> + +<a id="identityCatDapbranchesliverootadmingroup_modifytt">Modified: identity/CatDap/branches/live/root/admin/group_modify.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/group_modify.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/group_modify.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -2,8 +2,8 @@ + <input type='hidden' name='dn' value='[% group.dn %]'> + <table> + <tr> +- <th>Attribute</th> +- <th>Value</th> ++ <th>[% l('Attribute') %]</th> ++ <th>[% l('Value') %]</th> + </tr> + [% FOREACH attr IN group.attributes %] + <tr> +@@ -11,11 +11,11 @@ + <td> + [% FOREACH value IN group.get_value(attr) %] + [% value %] +- <a href="[% c.uri_for('/admin/group_modify') %]/delete/[% group.dn %]/[% attr %]/[% value %]">delete</a> ++ <a href="[% c.uri_for('/admin/group_modify') %]/delete/[% group.dn %]/[% attr %]/[% value %]">[% l('delete') %]</a> + <br/> + [% END %] + <input name="[% attr %]" value="" /> +- <input type="submit" value="Add" /> ++ <input type="submit" value="[% l('Add') %]" /> + </td> + </tr> + [% END %] + +<a id="identityCatDapbranchesliverootadminindextt">Modified: identity/CatDap/branches/live/root/admin/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/admin/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/admin/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1 +1 @@ +-<p>Please use the menus above.</p> +\ No newline at end of file ++<p>[% l('Please use the menus above.') %]</p> + +<a id="identityCatDapbranchesliverootemailactivationtt">Modified: identity/CatDap/branches/live/root/email/activation.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/email/activation.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/email/activation.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -4,4 +4,4 @@ + [% url %] + + -- +-http://mageia.org/ +\ No newline at end of file ++[% c.config.project_url %] + +<a id="identityCatDapbranchesliverootemailadminpasswordtt">Modified: identity/CatDap/branches/live/root/email/admin/password.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/email/admin/password.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/email/admin/password.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -7,4 +7,4 @@ + [% url %] + + -- +-http://mageia.org/ +\ No newline at end of file ++[% c.config.project_url %] + +<a id="identityCatDapbranchesliverootindextt">Modified: identity/CatDap/branches/live/root/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,21 +1,22 @@ + <h1>[% l('Login') %]</h1> + ++<div id="login_form"> + <form method="post" action="/user"> ++ <div id="login_form_inputs"> ++ <label for="username_">[% l('Username : ') %]</label> ++ <input id="username_" type="text" name="username" value="[% c.user.username %]" /> ++ <br /> + +- <p> +- <label for="username_">[% l('Username') %]</label> +- <input id="username_" type="text" name="username" value="[% c.user.username %]" /> +- </p> +- +- <p> +- <label for="password_">[% l('Password') %]</label> +- <input id="password_" type="password" name="password" /> +- </p> +- +- <p><input type="submit" value="[% l('Login') %]" /> +- [% l('or') %] +- <a href="/register">[% l('Register') %]</a></p> +- +- <p>@todo [% l('Forgotten password?') %]</p> +- ++ <label for="password_">[% l('Password : ') %]</label> ++ <input id="password_" type="password" name="password" /> ++ <br /> ++ </div> ++ <div id="login_form_line"> ++ <span><a href="/register">[% l('Register') %]</a> | ++ @todo [% l('Forgotten password?') %] ++ <!--<a href="/forgot_password">[% l('Forgotten password?') %]</a> --> ++ </span> ++ <button type="submit" value="[% l('Login') %]" >[% l('Login') %]</button> ++ </div> + </form> ++</div> + +<a id="identityCatDapbranchesliverootregisterchecktt">Modified: identity/CatDap/branches/live/root/register/check.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/register/check.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/register/check.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,4 @@ +-<h2>Success</h2> ++<h2>[% l('Success') %]</h2> + <p> + [% message %] + </p> +\ No newline at end of file + +<a id="identityCatDapbranchesliverootregisterindextt">Modified: identity/CatDap/branches/live/root/register/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/register/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/register/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,48 +1,37 @@ +-[% MACRO l(text, args) BLOCK; +- c.localize(text, args); +-END; %] + + + <h2>[% l('Register') %]</h2> + +-<p class="error"> +- [% FOREACH error IN errors %] +- [% error %]<br/> +- [% END %] +-</p> +- ++<div id="input_form"> + <form method="post" action="/register/check"> ++ <h3>[% l('Username') %]</h3> ++ <label for="uid_">[% l('Username') %]</label><br /> ++ <input id="uid_" type="text" name="uid" value="[% c.request.params.uid %]" /><br /> + +- <p> +- <label for="uid_">[% l('Username') %]</label> +- <input id="uid_" type="text" name="uid" value="[% c.request.params.uid %]" /> +- </p> ++ <p> ++ <h3>[% l('Personal Information') %]</h3> ++ <label for="gn_">[% l('First name') %]</label><br/> ++ <input id="gn_" type="text" name="gn" value="[% c.request.params.gn %]" /><br /> + +- <p> +- <label for="gn_">[% l('First name') %]</label> +- <input id="gn_" type="text" name="gn" value="[% c.request.params.gn %]" /> +- </p> ++ <label for="sn_">[% l('Surname') %]</label><br/> ++ <input id="sn_" type="text" name="sn" value="[% c.request.params.sn %]" /><br /> ++ </p> ++ <p> ++ <h3>[% l('Email') %]</h3> ++ <label for="mail1_">[% l('Email address') %]</label><br/> ++ <input id="mail1_" type="text" name="mail1" value="[% c.request.params.mail1 %]" /><br /> + +- <p> +- <label for="sn_">[% l('Surname') %]</label> +- <input id="sn_" type="text" name="sn" value="[% c.request.params.sn %]" /> +- </p> ++ <label for="mail2_">[% l('Confirm Email address') %]</label><br/> ++ <input id="mail2_" type="text" name="mail2" value="[% c.request.params.mail2 %]" /><br /> ++ </p> + +- <p> +- <label for="mail1_">[% l('Email address') %]</label> +- <input id="mail1_" type="text" name="mail1" value="[% c.request.params.mail1 %]" /> +- </p> ++ <p> ++ <h3>[% l('Captcha') %]</h3> + +- <p> +- <label for="mail2_">[% l('Confirm Email address') %]</label> +- <input id="mail2_" type="text" name="mail2" value="[% c.request.params.mail2 %]" /> +- </p> +- +- <p> +- <img src="/register/captcha" /> +- <input type="text" name="validate" /> +- </p> +- +- <p><input type="submit" value="[% l('Register') %]" /></p> +- +-</form> +\ No newline at end of file ++ <img src="/register/captcha" /><br /> ++ <label for="test">[% l('Enter text') %]</label><br/> ++ <input type="text" name="validate" /><br/> ++ </p> ++ <button type="submit" value="[% l('Register') %]">[% l('Register') %]</button> ++</form> ++</div> + +<a id="identityCatDapbranchesliveroottemplatefooter">Modified: identity/CatDap/branches/live/root/template/footer</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/footer 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/footer 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,4 +1,5 @@ +-<p>2010 <a href="http://mageia.org/">Mageia.org</a> ++<div class="hnav"> ++<div align=center><p>2010 <a href="http://mageia.org/">Mageia.org</a> + | <a href="http://mageia.org/policies/privacy/">Privacy policy</a> + | <a href="http://mageia.org/faq/accounts/">Mageia user accounts FAQ</a> +- </p> +\ No newline at end of file ++</p></div></div> + +<a id="identityCatDapbranchesliveroottemplateheader">Modified: identity/CatDap/branches/live/root/template/header</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/header 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/header 2011-01-05 15:32:57 UTC (rev 212) +@@ -8,8 +8,6 @@ + [% IF c.user.username %] + <li><strong><a href="[% c.uri_for("/user") %]">[% c.user.username %]</a></strong></li> + <li><a href="/user/logout">[% l('Log out') %]</a></li> +- [% ELSE %] +- <li><a href="/">[% l('Login') %]</a></li> + [% END %] + </ul> + </div> + +<a id="identityCatDapbranchesliveroottemplatehtml">Modified: identity/CatDap/branches/live/root/template/html</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/html 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/html 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,17 +1,17 @@ + <?xml version="1.0" encoding="utf-8"?> + <!DOCTYPE html> +-<html lang="en" dir="ltr"> ++<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr"> + <head> + <meta charset="utf-8" /> + <title>[% template.title or site.title or c.config.apptitle %]</title> +- <meta content="description" value="Mageia.org online user account panel" /> +- <meta content="keywords" value="mageia, user, account, password" /> +- <meta content="robots" value="index,nofollow" /> +- <link rel="stylesheet" type="text/css" href="/static/style/yui/reset-fonts-grids.css"> +- <link rel="stylesheet" type="text/css" href="/static/style/yui/base-min.css"> ++ <meta name="description" content="Mageia.org online user account panel" /> ++ <meta name="keywords" content="mageia, user, account, password" /> ++ <meta name="robots" content="index,nofollow" /> ++ <link rel="stylesheet" type="text/css" href="/static/style/yui/reset-fonts-grids.css" /> ++ <link rel="stylesheet" type="text/css" href="/static/style/yui/base-min.css" /> + <link rel="stylesheet" type="text/css" href="/static/style/ttsite.css" /> + </head> + <body> + [% content %] + </body> +-</html> +\ No newline at end of file ++</html> + +<a id="identityCatDapbranchesliveroottemplatepre">Modified: identity/CatDap/branches/live/root/template/pre</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/pre 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/pre 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,3 +1,3 @@ +-[% MACRO l(text, args) BLOCK; ++[%- MACRO l(text, args) BLOCK; + c.localize(text, args); +-END; %] ++END; -%] + +<a id="identityCatDapbranchesliveroottemplatewrapper">Modified: identity/CatDap/branches/live/root/template/wrapper</a> +=================================================================== +--- identity/CatDap/branches/live/root/template/wrapper 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/template/wrapper 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,7 +1,4 @@ +-[% MACRO l(text, args) BLOCK; +- c.localize(text, args); +-END; %] +-[% IF template.name.match('\.(css|js|txt)'); ++[%- IF template.name.match('\.(css|js|txt)'); + debug("Passing page through as text: $template.name"); + content; + ELSE; + +<a id="identityCatDapbranchesliverootuserindextt">Modified: identity/CatDap/branches/live/root/user/index.tt</a> +=================================================================== +--- identity/CatDap/branches/live/root/user/index.tt 2011-01-05 15:09:20 UTC (rev 211) ++++ identity/CatDap/branches/live/root/user/index.tt 2011-01-05 15:32:57 UTC (rev 212) +@@ -1,30 +1,34 @@ ++<div id="input_form"> + <form method="post" action=""> +- <table border=0> +- <tr><th>Attribute</th><th>Value</th></tr> ++ <table> ++ <tr><th>[% l('Attribute') %]</th><th>[% l('Value') %]</th><th></th></tr> + [% FOREACH attr IN values %] + <tr> + <td>[% attr.name %]</td> + <td> + [% FOREACH val IN attr.values %] +- [% IF attr.editable %]<input type=hidden name="[% attr.name %]_old" value="[% val %]"> +- <input name="[% attr.name %]_new" value="[% val %]"> ++ [% IF attr.editable %]<input type="hidden" name="[% attr.name %]_old" value="[% val %]" /> ++ <input name="[% attr.name %]_new" value="[% val %]" /> + [% ELSE %] + [% val %] + <br/> + [% END %] ++ </td> ++ <td> + [% IF attr.addable AND attr.editable %] +- <a href="/user/add/[% attr.name %]">[% l('Add') %]</a> ++ <button type="button" onclick="location='/user/add/[% attr.name %]'">[% l('Add') %]</button> + [% END %] + [% IF attr.removable AND attr.editable %] +- <a href="/user/delete/[% attr.name %]/[% val %]">[% l('Delete') %]</a> ++ <button type="button" onclick="location='/user/delete/[% attr.name %]/[% val %]'">[% l('Delete') %]</button> + [% END %] + [% END %] + </td> + </tr> + [% END %] ++ <tr> ++ <td colspan="3" style="text-align:center;"><button type="Submit" value="[% l('Update') %]">[% l('Update') %]</button></td> ++ </tr> + </table> +- +- <p><input type="Submit" value="[% l('Update') %]" /></p> + </form> + + <hr /> +@@ -35,9 +39,11 @@ + [% FOREACH attr IN may %] + <option value="[% attr %]">[% attr %]</option> + [% END %] ++ </select> + + <input name="value" value="" /> + +- <input type="submit" value="[% l('Add') %]" /> ++ <button type="submit" value="[% l('Add') %]">[% l('Add') %]</button> + </p> + </form> ++</div> + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/643d1b25/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/643d1b25/attachment-0001.html new file mode 100644 index 000000000..e9ebff1b7 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/643d1b25/attachment-0001.html @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[207] version 1.9.2</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>207</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 00:43:39 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>version 1.9.2</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#build_systemrepsystrunkCHANGES">build_system/repsys/trunk/CHANGES</a></li> +<li><a href="#build_systemrepsystrunkrepsys">build_system/repsys/trunk/repsys</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemrepsystrunkCHANGES">Modified: build_system/repsys/trunk/CHANGES</a> +=================================================================== +--- build_system/repsys/trunk/CHANGES 2011-01-04 23:34:58 UTC (rev 206) ++++ build_system/repsys/trunk/CHANGES 2011-01-04 23:43:39 UTC (rev 207) +@@ -1,3 +1,6 @@ ++* 1.9.2-binrepo ++- add .xz files in binrepo ++ + * 1.9.1-binrepo + - fix problem with python threads on 2010.1 + + +<a id="build_systemrepsystrunkrepsys">Modified: build_system/repsys/trunk/repsys</a> +=================================================================== +--- build_system/repsys/trunk/repsys 2011-01-04 23:34:58 UTC (rev 206) ++++ build_system/repsys/trunk/repsys 2011-01-04 23:43:39 UTC (rev 207) +@@ -4,7 +4,7 @@ + import getopt + import sys + +-VERSION="1.9.1-binrepo" ++VERSION="1.9.2-binrepo" + + HELP = """\ + Usage: repsys COMMAND [COMMAND ARGUMENTS] + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/643d1b25/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/643d1b25/attachment.html new file mode 100644 index 000000000..e9ebff1b7 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/643d1b25/attachment.html @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[207] version 1.9.2</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>207</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 00:43:39 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>version 1.9.2</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#build_systemrepsystrunkCHANGES">build_system/repsys/trunk/CHANGES</a></li> +<li><a href="#build_systemrepsystrunkrepsys">build_system/repsys/trunk/repsys</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemrepsystrunkCHANGES">Modified: build_system/repsys/trunk/CHANGES</a> +=================================================================== +--- build_system/repsys/trunk/CHANGES 2011-01-04 23:34:58 UTC (rev 206) ++++ build_system/repsys/trunk/CHANGES 2011-01-04 23:43:39 UTC (rev 207) +@@ -1,3 +1,6 @@ ++* 1.9.2-binrepo ++- add .xz files in binrepo ++ + * 1.9.1-binrepo + - fix problem with python threads on 2010.1 + + +<a id="build_systemrepsystrunkrepsys">Modified: build_system/repsys/trunk/repsys</a> +=================================================================== +--- build_system/repsys/trunk/repsys 2011-01-04 23:34:58 UTC (rev 206) ++++ build_system/repsys/trunk/repsys 2011-01-04 23:43:39 UTC (rev 207) +@@ -4,7 +4,7 @@ + import getopt + import sys + +-VERSION="1.9.1-binrepo" ++VERSION="1.9.2-binrepo" + + HELP = """\ + Usage: repsys COMMAND [COMMAND ARGUMENTS] + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/6a4d43b3/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/6a4d43b3/attachment-0001.html new file mode 100644 index 000000000..e2fa9ed73 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/6a4d43b3/attachment-0001.html @@ -0,0 +1,77 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[206] add .xz files belonging in binrepo (patch from tmb)</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>206</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 00:34:58 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add .xz files belonging in binrepo (patch from tmb)</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#build_systemrepsystrunkRepSysbinrepopy">build_system/repsys/trunk/RepSys/binrepo.py</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemrepsystrunkRepSysbinrepopy">Modified: build_system/repsys/trunk/RepSys/binrepo.py</a> +=================================================================== +--- build_system/repsys/trunk/RepSys/binrepo.py 2011-01-04 16:17:04 UTC (rev 205) ++++ build_system/repsys/trunk/RepSys/binrepo.py 2011-01-04 23:34:58 UTC (rev 206) +@@ -107,7 +107,7 @@ + raw = config.get("binrepo", "upload-match", + "\.(7z|Z|bin|bz2|cpio|db|deb|egg|gem|gz|jar|jisp|lzma|"\ + "pdf|pgn\\.gz|pk3|rpm|rpm|run|sdz|smzip|tar|tbz|"\ +- "tbz2|tgz|ttf|uqm|wad|war|xar|xpi|zip)$") ++ "tbz2|tgz|ttf|uqm|wad|war|xar|xpi|xz|zip)$") + maxsize = config.getint("binrepo", "upload-match-size", "1048576") # 1MiB + expr = re.compile(raw) + name = os.path.basename(path) + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/6a4d43b3/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/6a4d43b3/attachment.html new file mode 100644 index 000000000..e2fa9ed73 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/6a4d43b3/attachment.html @@ -0,0 +1,77 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[206] add .xz files belonging in binrepo (patch from tmb)</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>206</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 00:34:58 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add .xz files belonging in binrepo (patch from tmb)</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#build_systemrepsystrunkRepSysbinrepopy">build_system/repsys/trunk/RepSys/binrepo.py</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemrepsystrunkRepSysbinrepopy">Modified: build_system/repsys/trunk/RepSys/binrepo.py</a> +=================================================================== +--- build_system/repsys/trunk/RepSys/binrepo.py 2011-01-04 16:17:04 UTC (rev 205) ++++ build_system/repsys/trunk/RepSys/binrepo.py 2011-01-04 23:34:58 UTC (rev 206) +@@ -107,7 +107,7 @@ + raw = config.get("binrepo", "upload-match", + "\.(7z|Z|bin|bz2|cpio|db|deb|egg|gem|gz|jar|jisp|lzma|"\ + "pdf|pgn\\.gz|pk3|rpm|rpm|run|sdz|smzip|tar|tbz|"\ +- "tbz2|tgz|ttf|uqm|wad|war|xar|xpi|zip)$") ++ "tbz2|tgz|ttf|uqm|wad|war|xar|xpi|xz|zip)$") + maxsize = config.getint("binrepo", "upload-match-size", "1048576") # 1MiB + expr = re.compile(raw) + name = os.path.basename(path) + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/6f9d880c/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/6f9d880c/attachment-0001.html new file mode 100644 index 000000000..0af6a0b32 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/6f9d880c/attachment-0001.html @@ -0,0 +1,135 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[655] - deploy trunk as a test instance, as asked several time on irc</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>655</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 19:12:50 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- deploy trunk as a test instance, as asked several time on irc</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulescatdapmanifestsinitpp">puppet/modules/catdap/manifests/init.pp</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulescatdapmanifestsinitpp">Modified: puppet/modules/catdap/manifests/init.pp</a> +=================================================================== +--- puppet/modules/catdap/manifests/init.pp 2011-01-05 13:41:16 UTC (rev 654) ++++ puppet/modules/catdap/manifests/init.pp 2011-01-05 18:12:50 UTC (rev 655) +@@ -1,7 +1,6 @@ + class catdap { + +- $catdap_location = "/var/www/identity" +- $catdap_vhost = "identity.$domain" ++ $upstream_svn = "svn://svn.mageia.org/svn/soft/identity/CatDap/" + + # TODO switch to a proper rpm packaging + $rpm_requirement = ['perl-Catalyst-Runtime',"perl-FCGI", 'perl-Catalyst-Plugin-Authorization-Roles', +@@ -17,27 +16,41 @@ + ensure => installed + } + +- subversion::snapshot { $catdap_location: +- source => "svn://svn.mageia.org/svn/soft/identity/CatDap/branches/live" +- } +- + $ldap_password = extlookup('catdap_ldap','x') + +- file { "$catdap_location/catdap_local.yml": +- ensure => present, +- owner => root, +- group => apache, +- mode => 640, +- content => template("catdap/catdap_local.yml"), +- require => Subversion::Snapshot[$catdap_location] ++ ++ ++ define catdap_snapshot($location, $svn_location) { ++ file { "$location/catdap_local.yml": ++ ensure => present, ++ owner => root, ++ group => apache, ++ mode => 640, ++ content => template("catdap/catdap_local.yml"), ++ require => Subversion::Snapshot[$location], ++ } ++ ++ subversion::snapshot { $location: ++ source => $svn_location ++ } ++ ++ apache::vhost_catalyst_app { $name: ++ script => "$location/script/catdap_fastcgi.pl", ++ location => $location, ++ use_ssl => true, ++ } ++ ++ apache::vhost_redirect_ssl { $name: } + } + +- apache::vhost_catalyst_app { $catdap_vhost: +- script => "$catdap_location/script/catdap_fastcgi.pl", +- location => $catdap_location, +- use_ssl => true, ++ catdap_snapshot { "identity.$domain": ++ location => "/var/www/identity", ++ svn_location => "$upstream_svn/branches/live" + } + +- apache::vhost_redirect_ssl { $catdap_vhost: } ++ catdap_snapshot { "identity-trunk.$domain": ++ location => "/var/www/identity-trunk", ++ svn_location => "$upstream_svn/trunk" ++ } + + } + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/6f9d880c/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/6f9d880c/attachment.html new file mode 100644 index 000000000..0af6a0b32 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/6f9d880c/attachment.html @@ -0,0 +1,135 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[655] - deploy trunk as a test instance, as asked several time on irc</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>655</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 19:12:50 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- deploy trunk as a test instance, as asked several time on irc</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulescatdapmanifestsinitpp">puppet/modules/catdap/manifests/init.pp</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulescatdapmanifestsinitpp">Modified: puppet/modules/catdap/manifests/init.pp</a> +=================================================================== +--- puppet/modules/catdap/manifests/init.pp 2011-01-05 13:41:16 UTC (rev 654) ++++ puppet/modules/catdap/manifests/init.pp 2011-01-05 18:12:50 UTC (rev 655) +@@ -1,7 +1,6 @@ + class catdap { + +- $catdap_location = "/var/www/identity" +- $catdap_vhost = "identity.$domain" ++ $upstream_svn = "svn://svn.mageia.org/svn/soft/identity/CatDap/" + + # TODO switch to a proper rpm packaging + $rpm_requirement = ['perl-Catalyst-Runtime',"perl-FCGI", 'perl-Catalyst-Plugin-Authorization-Roles', +@@ -17,27 +16,41 @@ + ensure => installed + } + +- subversion::snapshot { $catdap_location: +- source => "svn://svn.mageia.org/svn/soft/identity/CatDap/branches/live" +- } +- + $ldap_password = extlookup('catdap_ldap','x') + +- file { "$catdap_location/catdap_local.yml": +- ensure => present, +- owner => root, +- group => apache, +- mode => 640, +- content => template("catdap/catdap_local.yml"), +- require => Subversion::Snapshot[$catdap_location] ++ ++ ++ define catdap_snapshot($location, $svn_location) { ++ file { "$location/catdap_local.yml": ++ ensure => present, ++ owner => root, ++ group => apache, ++ mode => 640, ++ content => template("catdap/catdap_local.yml"), ++ require => Subversion::Snapshot[$location], ++ } ++ ++ subversion::snapshot { $location: ++ source => $svn_location ++ } ++ ++ apache::vhost_catalyst_app { $name: ++ script => "$location/script/catdap_fastcgi.pl", ++ location => $location, ++ use_ssl => true, ++ } ++ ++ apache::vhost_redirect_ssl { $name: } + } + +- apache::vhost_catalyst_app { $catdap_vhost: +- script => "$catdap_location/script/catdap_fastcgi.pl", +- location => $catdap_location, +- use_ssl => true, ++ catdap_snapshot { "identity.$domain": ++ location => "/var/www/identity", ++ svn_location => "$upstream_svn/branches/live" + } + +- apache::vhost_redirect_ssl { $catdap_vhost: } ++ catdap_snapshot { "identity-trunk.$domain": ++ location => "/var/www/identity-trunk", ++ svn_location => "$upstream_svn/trunk" ++ } + + } + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/797a51f6/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/797a51f6/attachment-0001.html new file mode 100644 index 000000000..0274c6c96 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/797a51f6/attachment-0001.html @@ -0,0 +1,11434 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[210] add mandriva version of youri-core, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/core/trunk/ at revision 271600</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>210</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 14:23:45 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add mandriva version of youri-core, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/core/trunk/ at revision 271600</pre> + +<h3>Added Paths</h3> +<ul> +<li>build_system/mdv-youri-core/</li> +<li>build_system/mdv-youri-core/branches/</li> +<li>build_system/mdv-youri-core/tags/</li> +<li>build_system/mdv-youri-core/trunk/</li> +<li><a href="#build_systemmdvyouricoretrunkChangeLog">build_system/mdv-youri-core/trunk/ChangeLog</a></li> +<li><a href="#build_systemmdvyouricoretrunkMANIFESTSKIP">build_system/mdv-youri-core/trunk/MANIFEST.SKIP</a></li> +<li><a href="#build_systemmdvyouricoretrunkMakefilePL">build_system/mdv-youri-core/trunk/Makefile.PL</a></li> +<li><a href="#build_systemmdvyouricoretrunkREADME">build_system/mdv-youri-core/trunk/README</a></li> +<li><a href="#build_systemmdvyouricoretrunkTODO">build_system/mdv-youri-core/trunk/TODO</a></li> +<li>build_system/mdv-youri-core/trunk/bin/</li> +<li><a href="#build_systemmdvyouricoretrunkbinfillbugzilla">build_system/mdv-youri-core/trunk/bin/fillbugzilla</a></li> +<li>build_system/mdv-youri-core/trunk/cgi/</li> +<li><a href="#build_systemmdvyouricoretrunkcgimaintainerscgi">build_system/mdv-youri-core/trunk/cgi/maintainers.cgi</a></li> +<li>build_system/mdv-youri-core/trunk/etc/</li> +<li>build_system/mdv-youri-core/trunk/etc/bash_completion.d/</li> +<li><a href="#build_systemmdvyouricoretrunketcbash_completiondyouri">build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri</a></li> +<li><a href="#build_systemmdvyouricoretrunketccheckconf">build_system/mdv-youri-core/trunk/etc/check.conf</a></li> +<li><a href="#build_systemmdvyouricoretrunketcuploadconf">build_system/mdv-youri-core/trunk/etc/upload.conf</a></li> +<li>build_system/mdv-youri-core/trunk/lib/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriBugzillapm">build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputAgepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceIurtpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceLBDpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildSourcepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputConflictspm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputDependenciespm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputMandrivaConflictspm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputMissingpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputOrphanspm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputRpmlintpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputSignaturepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceCPANpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceDebianpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFedorapm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFreshmeatpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGNOMEpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGentoopm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceNetBSDpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceRAApm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceSourceforgepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourcepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatespm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencesFilepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencespm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverBugzillapm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverCGIpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatHTMLpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatRSSpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatTextpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFilepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatHTMLpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatTextpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckResultsetDBIpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckResultsetIteratorpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckResultsetpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriConfigpm">build_system/mdv-youri-core/trunk/lib/Youri/Config.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Media/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriMediaURPMpm">build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriMediapm">build_system/mdv-youri-core/trunk/lib/Youri/Media.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Package/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageRPMpm">build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageRPM4pm">build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageTestpm">build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageURPMpm">build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackagepm">build_system/mdv-youri-core/trunk/lib/Youri/Package.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Repository/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositoryMandriva_uploadpm">build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositoryMandriva_upload_prepm">build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositoryPLFpm">build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositorypm">build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriUtilspm">build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm</a></li> +<li>build_system/mdv-youri-core/trunk/t/</li> +<li><a href="#build_systemmdvyouricoretrunkt00distributiont">build_system/mdv-youri-core/trunk/t/00distribution.t</a></li> +<li><a href="#build_systemmdvyouricoretrunktcowsay30311mdv20070noarchrpm">build_system/mdv-youri-core/trunk/t/cowsay-3.03-11mdv2007.0.noarch.rpm</a></li> +<li>build_system/mdv-youri-core/trunk/t/gpghome/</li> +<li><a href="#build_systemmdvyouricoretrunktgpghomepubringgpg">build_system/mdv-youri-core/trunk/t/gpghome/pubring.gpg</a></li> +<li><a href="#build_systemmdvyouricoretrunktgpghomesecringgpg">build_system/mdv-youri-core/trunk/t/gpghome/secring.gpg</a></li> +<li><a href="#build_systemmdvyouricoretrunktgpghometrustdbgpg">build_system/mdv-youri-core/trunk/t/gpghome/trustdb.gpg</a></li> +<li><a href="#build_systemmdvyouricoretrunktpackaget">build_system/mdv-youri-core/trunk/t/package.t</a></li> +<li><a href="#build_systemmdvyouricoretrunktversiont">build_system/mdv-youri-core/trunk/t/version.t</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemmdvyouricoretrunkChangeLog">Added: build_system/mdv-youri-core/trunk/ChangeLog</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/ChangeLog (rev 0) ++++ build_system/mdv-youri-core/trunk/ChangeLog 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,2 @@ ++2006-04-23 Guillaume Rousse <guillomovitch@zarb.org> 0.9 ++ * initial release + +<a id="build_systemmdvyouricoretrunkMANIFESTSKIP">Added: build_system/mdv-youri-core/trunk/MANIFEST.SKIP</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/MANIFEST.SKIP (rev 0) ++++ build_system/mdv-youri-core/trunk/MANIFEST.SKIP 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,14 @@ ++CVS/.* ++\.svn/.* ++^cover_db/ ++^blib/ ++\.bak$ ++\.swp$ ++\.tar$ ++\.tgz$ ++\.tar\.gz$ ++\.SKIP$ ++~$ ++^pm_to_blib$ ++^Makefile$ ++^Makefile\.old$ + +<a id="build_systemmdvyouricoretrunkMakefilePL">Added: build_system/mdv-youri-core/trunk/Makefile.PL</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/Makefile.PL (rev 0) ++++ build_system/mdv-youri-core/trunk/Makefile.PL 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,31 @@ ++# $Id: Makefile.PL 1724 2006-10-17 13:55:27Z warly $ ++use ExtUtils::MakeMaker; ++ ++WriteMakefile( ++ NAME => 'youri-core', ++ VERSION => 0.9, ++ AUTHOR => 'Youri project <youri@zarb.org>', ++ PREREQ_PM => { ++ 'AppConfig' => 0, ++ 'YAML' => 0, ++ 'Pod::Simple::HTMLBatch' => 0, ++ 'Test::Exception' => 0, ++ 'Exception' => 0, ++ 'RPM4' => 0, ++ 'URPM' => 0 ++ } ++); ++ ++package MY; ++ ++sub top_targets { ++ my ($self) = @_; ++ my $top_targets = $self->SUPER::top_targets(@_); ++ $top_targets =~ s/all :: pure_all manifypods/all :: pure_all manifypods htmlifypods/; ++ $top_targets .= <<'EOF'; ++htmlifypods : $(TO_INST_PM) ++ if [ ! -d blib/html ]; then mkdir blib/html; fi ++ perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go lib blib/html ++EOF ++ return $top_targets; ++} + +<a id="build_systemmdvyouricoretrunkREADME">Added: build_system/mdv-youri-core/trunk/README</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/README (rev 0) ++++ build_system/mdv-youri-core/trunk/README 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,33 @@ ++youri-core ++---------- ++ ++Youri core libraries. ++ ++Description ++----------- ++YOURI stands for "Youri Offers an Upload & Repository Infrastucture". It aims ++to build tools making management of a coherent set of packages easier. ++ ++This package provides basic components used by other youri programs. ++ ++Installation ++------------ ++To install, just use: ++perl Makefile.PL ++make ++make test ++ ++Copyright and License ++--------------------- ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under ++the same terms as Perl itself. ++ ++Authors ++------- ++Guillaume Rousse <guillomovitch@zarb.org>, ++Pascal Terjan <pterjan@zarb.org> ++Damien Krotkine <dams@zarb.org> ++Olivier Thauvin <nanardon@zarb.org> ++Ville Skytt\xE4 <ville.skytta@iki.fi> + +<a id="build_systemmdvyouricoretrunkTODO">Added: build_system/mdv-youri-core/trunk/TODO</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/TODO (rev 0) ++++ build_system/mdv-youri-core/trunk/TODO 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,7 @@ ++1.0 Goals ++========= ++ ++library: ++- API-based bugzilla interface, instead of SQL-based one ++- more generic check-specific options handling in medias (don't use a ++specific attribute for each of them) + +<a id="build_systemmdvyouricoretrunkbinfillbugzilla">Added: build_system/mdv-youri-core/trunk/bin/fillbugzilla</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/bin/fillbugzilla (rev 0) ++++ build_system/mdv-youri-core/trunk/bin/fillbugzilla 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,81 @@ ++#!/usr/bin/perl ++# fillbugzilla ++# copyright (c) 2002 Guillaume Rousse <guillomovitch@zarb.org> ++# $Id: fillbugzilla 1179 2006-08-05 08:30:57Z warly $ ++ ++use strict; ++use warnings; ++use Getopt::Long; ++use Bugzilla; ++use Mail::Sendmail; ++ ++# constants ++my $name = "fillbugzilla"; ++my $version = "1.0"; ++ ++# command-line parameters ++my ($base, $user, $pass, $project, $mode, $help); ++GetOptions( ++ "base=s" => \$base, ++ "user=s" => \$user, ++ "pass=s" => \$pass, ++ "mode=s" => \$mode, ++ "help" => \$help, ++); ++ ++# mandatory argument ++die usage() unless ($base && $user && $pass); ++die usage() unless ($mode eq 'package' || $mode eq 'packager'); ++ ++usage() && exit 0 if $help; ++ ++my $bugzilla = Bugzilla->new('localhost', $base, $user, $pass); ++ ++if ($mode eq 'packager') { ++ while (my $packager = <>) { ++ chomp $packager; ++ my ($name, $login) = split(/\t/, $packager); ++ ++ # random passwd ++ my @chars = (0..9, 'A'..'Z', 'a'..'z', '-', '_', '!', '@', '#', '$', '%', '^', '&', '*'); ++ my $password = join('', map { $chars[rand(scalar @chars)] } 1 .. 8); ++ ++ # insert into database ++ $bugzilla->add_packager($name, $login, $password); ++ ++ # mail user ++ my %mail = ( ++ smtp => 'localhost', ++ To => $login, ++ From => 'bugmaster@zarb.org', ++ Subject => 'bugzilla password', ++ 'X-Mailer' => "$name $version", ++ ); ++ $mail{Message} .= "login: $login\n"; ++ $mail{Message} .= "password: $password\n"; ++ sendmail(%mail) or warn $Mail::Sendmail::error; ++ } ++} ++ ++if ($mode eq 'package') { ++ while (my $line = <>) { ++ chomp $line; ++ my ($name, $summary, $version, $maintainer) = split(/\t/, $line); ++ $bugzilla->add_package($name, $summary, $version, $maintainer); ++ } ++} ++ ++sub usage { ++ print <<EOF; ++$name $version ++ ++Usage: ++$name --base <base> --user <user> --pass <pass> --mode <mode> < $file ++ ++Options: ++--base <base> bugzilla base name ++--user <user> bugzilla base user ++--pass <pass> bugzilla base password ++--mode <mode> package or packager ++EOF ++} + + +Property changes on: build_system/mdv-youri-core/trunk/bin/fillbugzilla +___________________________________________________________________ +<a id="svnexecutable">Added: svn:executable</a> + + * + +<a id="build_systemmdvyouricoretrunkcgimaintainerscgi">Added: build_system/mdv-youri-core/trunk/cgi/maintainers.cgi</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/cgi/maintainers.cgi (rev 0) ++++ build_system/mdv-youri-core/trunk/cgi/maintainers.cgi 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,65 @@ ++#!/usr/bin/perl ++# $Id: maintainers.cgi 1179 2006-08-05 08:30:57Z warly $ ++ ++=head1 NAME ++ ++maintainers.cgi - youri CGI interface to maintainers list ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 DESCRIPTION ++ ++This script allows to get package maintainers list through CGI interface. ++ ++=head1 SYNOPSIS ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2004-2005, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=head1 AUTHORS ++ ++Guillaume Rousse <guillomovitch@zarb.org>, ++ ++=cut ++ ++use Youri::Bugzilla; ++use CGI; ++use AppConfig qw/:argcount :expand/; ++use strict; ++use warnings; ++ ++my $config = AppConfig->new( ++ { ++ GLOBAL => { ++ DEFAULT => undef, ++ EXPAND => EXPAND_ALL, ++ ARGCOUNT => ARGCOUNT_ONE, ++ } ++ }, ++ host => { ARGCOUNT => ARGCOUNT_ONE }, ++ base => { ARGCOUNT => ARGCOUNT_ONE }, ++ user => { ARGCOUNT => ARGCOUNT_ONE }, ++ pass => { ARGCOUNT => ARGCOUNT_ONE }, ++); ++ ++my $home = (getpwnam($ENV{PROJECT}))[7]; ++foreach my $file ("/etc/youri/maintainers.conf", "$home/.youri/maintainers.conf") { ++ $config->file($file) if -f $file && -r $file; ++} ++ ++my $bugzilla = Bugzilla->new( ++ $config->host(), ++ $config->base(), ++ $config->user(), ++ $config->pass(), ++); ++ ++my $cgi = CGI->new(); ++print $cgi->header(-type=>'text/plain'); ++ ++$bugzilla->browse_packages(sub { print "$_[0]\t$_[2]\n"; }); + + +Property changes on: build_system/mdv-youri-core/trunk/cgi/maintainers.cgi +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyouricoretrunketcbash_completiondyouri">Added: build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri (rev 0) ++++ build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,141 @@ ++# youri tools completion ++# $Id$ ++ ++_youri-check() ++{ ++ ++ local cur prev config i mode ++ ++ COMPREPLY=() ++ cur=${COMP_WORDS[COMP_CWORD]} ++ prev=${COMP_WORDS[COMP_CWORD-1]} ++ ++ case "$prev" in ++ --config) ++ _filedir ++ return 0 ++ ;; ++ --skip-plugin) ++ _find_config check.conf ++ if [ -n "$config" ]; then ++ # try to guess mode ++ for (( i=1; i < COMP_CWORD; i++ )); do ++ if [[ "${COMP_WORDS[i]}" != -* ]]; then ++ mode=${COMP_WORDS[i]} ++ break ++ fi ++ done ++ ++ if [ -n $mode ]; then ++ COMPREPLY=( $( awk -F= '/^'$mode's/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ fi ++ return 0 ++ ;; ++ --skip-media) ++ _find_config check.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^medias/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ return 0 ++ ;; ++ esac ++ ++ if [[ "$cur" == -* ]]; then ++ COMPREPLY=( $( compgen -W '--config --skip-plugin --skip-media -h \ ++ --help -t --test -v --verbose' -- $cur ) ) ++ else ++ _count_args ++ case $args in ++ 1) ++ COMPREPLY=( $( compgen -W 'input output' -- $cur ) ) ++ ;; ++ esac ++ fi ++ ++} ++complete -F _youri-check youri-check ++ ++_youri-upload() ++{ ++ ++ local cur prev config ++ ++ COMPREPLY=() ++ cur=${COMP_WORDS[COMP_CWORD]} ++ prev=${COMP_WORDS[COMP_CWORD-1]} ++ ++ case "$prev" in ++ --config) ++ _filedir ++ return 0 ++ ;; ++ --skip-check) ++ _find_config upload.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^checks/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ return 0 ++ ;; ++ --skip-action) ++ _find_config upload.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^actions/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ return 0 ++ ;; ++ esac ++ ++ if [[ "$cur" == -* ]]; then ++ COMPREPLY=( $( compgen -W '--config --skip-check --skip-action \ ++ --define -h --help -t --test -v --verbose' -- $cur ) ) ++ else ++ _count_args ++ case $args in ++ 1) ++ _find_config upload.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^targets/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ ;; ++ *) ++ _filedir ++ ;; ++ esac ++ fi ++ ++} ++complete -F _youri-upload youri-upload ++ ++_find_config() ++{ ++ local name i ++ ++ name=$1 ++ ++ for (( i=1; i < COMP_CWORD; i++ )); do ++ if [[ "${COMP_WORDS[i]}" == --config ]]; then ++ config=${COMP_WORDS[i+1]} ++ break ++ fi ++ done ++ if [ -f "$config" ]; then ++ return 0 ++ fi ++ ++ if [ -f "$HOME/.youri/$name" ]; then ++ config=$HOME/.youri/$name ++ return 0 ++ fi ++ ++ if [ -f "/etc/youri/$name" ]; then ++ config=/etc/youri/$name ++ return 0 ++ fi ++ ++} + +<a id="build_systemmdvyouricoretrunketccheckconf">Added: build_system/mdv-youri-core/trunk/etc/check.conf</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/etc/check.conf (rev 0) ++++ build_system/mdv-youri-core/trunk/etc/check.conf 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,300 @@ ++# youri-check sample configuration file ++# $Id: check.conf 1179 2006-08-05 08:30:57Z warly $ ++ ++# resolver declaration ++resolver = cgi ++ ++# preferences declaration ++preferences = file_pref ++ ++# resultset declaration ++resultset = dbi ++ ++# input plugins declaration ++inputs = rpmlint \ ++ age \ ++ updates \ ++ build \ ++ conflicts \ ++ dependencies \ ++ missing \ ++ orphans ++ ++# output plugins declaration ++outputs = file mail ++ ++# medias declaration ++medias = main.i586 \ ++ main.x86_64 \ ++ main.sources \ ++ contrib.i586 \ ++ contrib.x86_64 \ ++ contrib.sources \ ++ free \ ++ non-free \ ++ free.sources \ ++ non-free.sources ++ ++# helper variables ++mirror = ftp://ftp.free.fr/pub/Distributions_Linux/Mandrakelinux/devel/cooker ++mirror_i586 = $mirror/i586/media ++mirror_x86_64 = $mirror/x86_64/media ++ ++# resolver definition ++[cgi] ++class = Youri::Check::Maintainer::Resolver::CGI ++url = http://plf.zarb.org/cgi-bin/maintainers.cgi ++ ++# preferences definition ++[file_pref] ++class = Youri::Check::Maintainer::Preferences::File ++ ++# resultset definition ++[dbi] ++class = Youri::Check::Resultset::DBI ++driver = mysql ++host = localhost ++base = plf_youri ++user = plf ++pass = s3kr3t ++ ++# checks definitions ++[updates] ++class = Youri::Check::Input::Updates ++aliases = <<EOF ++--- #YAML:1.0 ++libfame0.8: ~ ++EOF ++sources = <<EOF ++--- #YAML:1.0 ++debian: ++ class: Youri::Check::Input::Updates::Source::Debian ++ aliases: ++ fuse-emulator: ~ ++cpan: ++ class: Youri::Check::Input::Updates::Source::CPAN ++fedora: ++ class: Youri::Check::Input::Updates::Source::Fedora ++gentoo: ++ class: Youri::Check::Input::Updates::Source::Gentoo ++freshmeat: ++ class: Youri::Check::Input::Updates::Source::Freshmeat ++netbsd: ++ class: Youri::Check::Input::Updates::Source::NetBSD ++raa: ++ class: Youri::Check::Input::Updates::Source::RAA ++sourceforge: ++ class: Youri::Check::Input::Updates::Source::Sourceforge ++ aliases: ++ openquicktime: ~ ++ klibido: ~ ++EOF ++ ++[rpmlint] ++class = Youri::Check::Input::Rpmlint ++ ++[age] ++class = Youri::Check::Input::Age ++max_age = 12 months ++pattern = %m months ++ ++[dependencies] ++class = Youri::Check::Input::Dependencies ++ ++[conflicts] ++class = Youri::Check::Input::Conflicts ++ ++[build] ++class = Youri::Check::Input::Build ++sources = <<EOF ++--- #YAML:1.0 ++stefan: ++ class: Youri::Check::Input::Build::Source::LBD ++ url: http://eijk.homelinux.org/build/ ++ medias: ++ - cooker_plf-free ++ - cooker_plf-non-free ++ archs: ++ - i586 ++EOF ++ ++[missing] ++class = Youri::Check::Input::Missing ++ ++[orphans] ++class = Youri::Check::Input::Orphans ++ ++# reports definitions ++[file] ++class = Youri::Check::Output::File ++to = ${HOME}/www/qa ++global = 1 ++individual = 1 ++formats = <<EOF ++--- #YAML:1.0 ++html: ++ class: Youri::Check::Output::File::Format::HTML ++text: ++ class: Youri::Check::Output::File::Format::Text ++rss: ++ class: Youri::Check::Output::File::Format::RSS ++EOF ++ ++[mail] ++class = Youri::Check::Output::Mail ++mta = /usr/sbin/sendmail ++to = plf-admin@zarb.org ++from = plf@zarb.org ++reply_to = plf-admin@zarb.org ++formats = <<EOF ++--- #YAML:1.0 ++text: ++ class: Youri::Check::Output::Mail::Format::Text ++EOF ++ ++# media definitions ++[main.i586] ++class = Youri::Media::URPM ++name = main ++type = binary ++path = $mirror_i586/main ++hdlist = $mirror_i586/media_info/hdlist_main.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[main.x86_64] ++class = Youri::Media::URPM ++name = main ++type = binary ++path = $mirror_x86_64/main ++hdlist = $mirror_x86_64/media_info/hdlist_main.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[main.sources] ++class = Youri::Media::URPM ++name = main ++type = source ++path = $mirror_i586/main ++hdlist = $mirror_i586/media_info/hdlist_main.src.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[contrib.i586] ++class = Youri::Media::URPM ++name = contrib ++type = binary ++path = $mirror_i586/contrib ++hdlist = $mirror_i586/media_info/hdlist_contrib.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[contrib.x86_64] ++class = Youri::Media::URPM ++name = contrib ++type = binary ++path = $mirror_x86_64/contrib ++hdlist = $mirror_x86_64/media_info/hdlist_contrib.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[contrib.sources] ++class = Youri::Media::URPM ++name = contrib ++type = source ++path = $mirror_i586/contrib ++hdlist = $mirror_i586/media_info/hdlist_contrib.src.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[free] ++class = Youri::Media::URPM ++name = free ++type = binary ++path = ${HOME}/ftp/mandrake/free/cooker/i586 ++hdlist = ${HOME}/ftp/mandrake/free/cooker/i586/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- main.x86_64 ++- contrib.i586 ++- contrib.x86_64 ++- free ++EOF ++allow_srcs = <<EOF ++--- #YAML:1.0 ++- free.sources ++- main.sources ++- contrib.sources ++EOF ++skip_archs = <<EOF ++--- #YAML:1.0 ++- ppc ++EOF ++ ++[free.sources] ++class = Youri::Media::URPM ++name = free ++type = source ++path = ${HOME}/ftp/mandrake/free/src ++hdlist = ${HOME}/ftp/mandrake/free/src/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- contrib.i586 ++- free ++EOF ++ ++[non-free] ++class = Youri::Media::URPM ++name = non-free ++type = binary ++path = ${HOME}/ftp/mandrake/non-free/cooker/i586 ++hdlist = ${HOME}/ftp/mandrake/non-free/cooker/i586/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-non-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- main.x86_64 ++- contrib.i586 ++- contrib.x86_64 ++- free ++- non-free ++EOF ++allow_srcs = <<EOF ++--- #YAML:1.0 ++- non-free.sources ++EOF ++skip_archs = <<EOF ++--- #YAML:1.0 ++- ppc ++EOF ++ ++[non-free.sources] ++class = Youri::Media::URPM ++name = non-free ++type = source ++path = ${HOME}/ftp/mandrake/non-free/src ++hdlist = ${HOME}/ftp/mandrake/non-free/src/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-non-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- contrib.i586 ++- free ++- non-free ++EOF + +<a id="build_systemmdvyouricoretrunketcuploadconf">Added: build_system/mdv-youri-core/trunk/etc/upload.conf</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/etc/upload.conf (rev 0) ++++ build_system/mdv-youri-core/trunk/etc/upload.conf 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,139 @@ ++# youri-upload sample configuration file ++# $Id: upload.conf 1179 2006-08-05 08:30:57Z warly $ ++ ++# repository declaration ++repository = plf ++ ++# targets declaration ++targets = cooker 2006.0 ++ ++# repository definition ++[plf] ++class = Youri::Repository::PLF ++install_root = ${HOME}/ftp/mandriva ++version_root = ${HOME}/cvs ++archive_root = ${HOME}/backup/mandriva ++noarch = i586 ++ ++# targets definition ++[cooker] ++checks = <<EOF ++--- #YAML:1.0 ++- tag ++- recency ++- history ++EOF ++actions = <<EOF ++--- #YAML:1.0 ++- sign ++- install ++- link ++- archive ++- clean ++- bugzilla ++- cvs ++- mail ++- rss ++EOF ++ ++[2006.0] ++checks = <<EOF ++--- #YAML:1.0 ++- type ++- tag ++- recency ++- history ++- precedence ++EOF ++actions = <<EOF ++--- #YAML:1.0 ++- sign ++- install ++- link ++- archive ++- clean ++EOF ++ ++# checks definition ++[tag] ++class = Youri::Upload::Check::Tag ++tags = <<EOF ++--- #YAML:1.0 ++release: 'plf$' ++packager: '<\w+@zarb\.org>$' ++distribution: '^Mandriva Linux$' ++vendor: '^Penguin Liberation Front$' ++EOF ++ ++[recency] ++class = Youri::Upload::Check::Recency ++ ++[history] ++class = Youri::Upload::Check::History ++ ++[precedence] ++class = Youri::Upload::Check::Precedence ++target = cooker ++ ++[type] ++class = Youri::Upload::Check::Type ++type = binary ++ ++# actions definitions ++[sign] ++class = Youri::Upload::Action::Sign ++name = plf@zarb.org ++path = ${HOME}/.gnupg ++passphrase = s3kr3t ++ ++[install] ++class = Youri::Upload::Action::Install ++ ++[link] ++class = Youri::Upload::Action::Link ++ ++[archive] ++class = Youri::Upload::Action::Archive ++ ++[clean] ++class = Youri::Upload::Action::Clean ++ ++[mail] ++class = Youri::Upload::Action::Mail ++mta = /usr/sbin/sendmail ++to = plf-announce@zarb.org ++reply_to = plf-discuss@zarb.org ++from = plf@zarb.org ++prefix = RPM ++cc = <<EOF ++--- #YAML:1.0 ++hot-base: david@dindinx.org bellamy@neverland.net ++dcgui: mathen@ketelhot.de ++dclib: mathen@ketelhot.de ++Video-DVDRip: dvdrip-users@exit1.org ++hackVideo-DVDRip: dvdrip-users@exit1.org ++goosnes: tak@bard.sytes.net ++avidemux: fixounet@free.fr ++vobcopy: robos@muon.de ++drip: drip-devel@lists.sourceforge.net ++libdscaler: vektor@dumbterm.net ++xawdecode: pingus77@ifrance.com ++EOF ++ ++[rss] ++class = Youri::Upload::Action::RSS ++file = ${HOME}/www/changelog.rss ++title = PLF packages updates ++link = http://plf.zarb.org/ ++description = ChangeLog for PLF packages ++ ++[cvs] ++class = Youri::Upload::Action::CVS ++ ++[bugzilla] ++class = Youri::Upload::Action::Bugzilla ++host = localhost ++base = plf_bugs ++user = plf ++pass = s3kr3t ++contact = plf@zarb.org + +<a id="build_systemmdvyouricoretrunklibYouriBugzillapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,482 @@ ++# $Id: Bugzilla.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Bugzilla; ++ ++=head1 NAME ++ ++Youri::Bugzilla - Youri Bugzilla interface ++ ++=head1 SYNOPSIS ++ ++ use Youri::Bugzilla; ++ ++ my $bugzilla = Youri::Bugzilla->new($host, $base, $user, $pass); ++ ++ print $bugzilla->get_maintainer('foobar'); ++ ++=head1 DESCRIPTION ++ ++This module implement a database-level Bugzilla interface for managing packages. ++ ++The legacy Bugzilla database model is mapped this way: ++ ++=over ++ ++=item * ++ ++a maintainer is a user ++ ++=item * ++ ++a package is a product ++ ++=item * ++ ++each package has two pseudo components "program" and "package", owned by the package maintainer ++ ++=back ++ ++=cut ++ ++use DBI; ++use Carp; ++use strict; ++use warnings; ++ ++my %queries = ( ++ get_package_id => 'SELECT id FROM products WHERE name = ?', ++ get_maintainer_id => 'SELECT userid FROM profiles WHERE login_name = ?', ++ get_versions => 'SELECT value FROM versions WHERE product_id = ?', ++ get_components => 'SELECT name FROM components WHERE product_id = ?', ++ add_package => 'INSERT INTO products (name, description) VALUES (?, ?)', ++ add_maintainer => 'INSERT INTO profiles (login_name, cryptpassword, realname, emailflags, refreshed_when) VALUES (?, ENCRYPT(?), ?, ?, SYSDATE())', ++ add_component => 'INSERT INTO components (product_id, name, description,initialowner, initialqacontact) VALUES (?, ?, ?, ?, ?)', ++ add_version => 'INSERT INTO versions (product_id, value) VALUES (?, ?)', ++ del_package => 'DELETE FROM products WHERE product = ?', ++ del_maintainer => 'DELETE FROM profiles WHERE login_name = ?', ++ del_components => 'DELETE FROM components WHERE program = ?', ++ del_versions => 'DELETE FROM versions WHERE program = ?', ++ reset_password => 'UPDATE profiles SET cryptpassword = ENCRYPT(?) WHERE login_name = ?', ++ browse_packages => <<EOF, ++SELECT products.name, max(versions.value), login_name ++FROM products, versions, profiles, components ++WHERE versions.product_id = products.id ++ AND components.product_id = products.id ++ AND profiles.userid = components.initialowner ++ AND components.name = 'package' ++GROUP BY name ++EOF ++ get_maintainer => <<EOF ++SELECT login_name ++FROM profiles, components, products ++WHERE profiles.userid = components.initialowner ++ AND components.name = 'package' ++ AND components.product_id = products.id ++ AND products.name = ? ++EOF ++); ++ ++my @default_flags = qw/ ++ ExcludeSelf ++ FlagRequestee ++ FlagRequester ++ emailOwnerRemoveme ++ emailOwnerComments ++ emailOwnerAttachments ++ emailOwnerStatus ++ emailOwnerResolved ++ emailOwnerKeywords ++ emailOwnerCC ++ emailOwnerOther ++ emailOwnerUnconfirmed ++ emailReporterRemoveme ++ emailReporterComments ++ emailReporterAttachments ++ emailReporterStatus ++ emailReporterResolved ++ emailReporterKeywords ++ emailReporterCC ++ emailReporterOther ++ emailReporterUnconfirmed ++ emailQAcontactRemoveme ++ emailQAcontactComments ++ emailQAcontactAttachments ++ emailQAcontactStatus ++ emailQAcontactResolved ++ emailQAcontactKeywords ++ emailQAcontactCC ++ emailQAcontactOther ++ emailQAcontactUnconfirmed ++ emailCClistRemoveme ++ emailCClistComments ++ emailCClistAttachments ++ emailCClistStatus ++ emailCClistResolved ++ emailCClistKeywords ++ emailCClistCC ++ emailCClistOther ++ emailCClistUnconfirmed ++ emailVoterRemoveme ++ emailVoterComments ++ emailVoterAttachments ++ emailVoterStatus ++ emailVoterResolved ++ emailVoterKeywords ++ emailVoterCC ++ emailVoterOther ++ emailVoterUnconfirmed ++/; ++ ++my $default_flags = join('~', map { "$_~on" } @default_flags); ++ ++=head1 CLASS METHODS ++ ++Except stated otherwise, maintainers are specified by their login, and packages ++are specified by their name. ++ ++=head2 new($host, $base, $user, $password) ++ ++Creates a new L<Youri::Bugzilla> object, wrapping bugzilla database I<$base> ++hosted on I<$host>, and accessed by user I<$user> with password I<$password>. ++ ++=cut ++ ++sub new { ++ my ($class, $host, $base, $user, $pass) = @_; ++ ++ my $dbh = DBI->connect("DBI:mysql:database=$base;host=$host", $user, $pass) or croak "Unable to connect: $DBI::errstr"; ++ ++ my $self = bless { ++ _dbh => $dbh ++ }, $class; ++ ++ return $self; ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 has_package($package) ++ ++Return true if bugzilla contains given package. ++ ++=cut ++ ++sub has_package { ++ my ($self, $package) = @_; ++ return $self->_get_package_id($package); ++} ++ ++=head2 has_maintainer($maintainer) ++ ++Return true if bugzilla contains given maintainer. ++ ++=cut ++ ++sub has_maintainer { ++ my ($self, $maintainer) = @_; ++ return $self->_get_maintainer_id($maintainer); ++} ++ ++=head2 get_maintainer($package) ++ ++Return maintainer of given package. ++ ++=cut ++ ++sub get_maintainer { ++ my ($self, $package) = @_; ++ return $self->_get_single('get_maintainer', $package); ++} ++ ++=head2 get_versions($package) ++ ++Return versions from given package. ++ ++=cut ++ ++sub get_versions { ++ my ($self, $package) = @_; ++ return $self->_get_multiple( ++ 'get_versions', ++ $self->_get_package_id($package) ++ ); ++} ++ ++=head2 get_components($package) ++ ++Return components from given package. ++ ++=cut ++ ++sub get_components { ++ my ($self, $package) = @_; ++ return $self->_get_multiple( ++ 'get_components', ++ $self->_get_package_id($package) ++ ); ++} ++ ++=head2 get_packages() ++ ++Return all packages from the database. ++ ++=cut ++ ++sub get_packages { ++ my ($self) = @_; ++ return $self->_get_multiple('get_packages'); ++} ++ ++sub _get_package_id { ++ my ($self, $package) = @_; ++ return $self->_get_single('get_package_id', $package); ++} ++ ++sub _get_maintainer_id { ++ my ($self, $maintainer) = @_; ++ return $self->_get_single('get_maintainer_id', $maintainer); ++} ++ ++sub _get_single { ++ my ($self, $type, $value) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{$type}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{$type}); ++ $self->{_queries}->{$type} = $query; ++ } ++ ++ $query->execute($value); ++ ++ my @row = $query->fetchrow_array(); ++ return @row ? $row[0]: undef; ++} ++ ++sub _get_multiple { ++ my ($self, $type, $value) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{$type}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{$type}); ++ $self->{_queries}->{$type} = $query; ++ } ++ ++ $query->execute($value); ++ ++ my @results; ++ while (my @row = $query->fetchrow_array()) { ++ push @results, $row[0]; ++ } ++ return @results; ++} ++ ++=head2 add_package($name, $summary, $version, $maintainer, $contact) ++ ++Adds a new package in the database, with given name, summary, version, ++maintainer and initial QA contact. ++ ++=cut ++ ++sub add_package { ++ my ($self, $name, $summary, $version, $maintainer, $contact) = @_; ++ return unless ref $self; ++ ++ my $maintainer_id = $self->_get_maintainer_id($maintainer); ++ unless ($maintainer_id) { ++ carp "Unknown maintainer $maintainer, aborting"; ++ return; ++ } ++ ++ my $contact_id = $self->_get_maintainer_id($contact); ++ unless ($contact_id) { ++ carp "Unknown QA contact $contact, aborting"; ++ return; ++ } ++ ++ my $query = $self->{_queries}->{add_package}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_package}); ++ $self->{_queries}->{add_package} = $query; ++ } ++ ++ $query->execute($name, $summary); ++ ++ my $package_id = $self->_get_package_id($name); ++ ++ $self->_add_version($package_id, $version); ++ $self->_add_component( ++ $package_id, ++ 'package', ++ 'problem related to the package', ++ $maintainer_id, ++ $contact_id ++ ); ++ $self->_add_component( ++ $package_id, ++ 'program', ++ 'problem related to the program', ++ $maintainer_id, ++ $contact_id ++ ); ++} ++ ++=head2 add_version($package, $version) ++ ++Adds a new version to given package. ++ ++=cut ++ ++sub add_version { ++ my ($self, $package, $version) = @_; ++ return unless ref $self; ++ ++ my $package_id = $self->_get_package_id($package); ++ $self->_add_version($package_id, $version); ++} ++ ++sub _add_version { ++ my ($self, $package_id, $version) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{add_version}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_version}); ++ $self->{_queries}->{add_version} = $query; ++ } ++ ++ $query->execute($package_id, $version); ++} ++ ++ ++=head2 add_maintainer($name, $login, $password) ++ ++Adds a new maintainer in the database, with given name, login and password. ++ ++=cut ++ ++sub add_maintainer { ++ my ($self, $name, $login, $pass) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{add_maintainer}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_maintainer}); ++ $self->{_queries}->{add_maintainer} = $query; ++ } ++ ++ $query->execute($login, $pass, $name, $default_flags); ++} ++ ++sub _add_component { ++ my ($self, $package_id, $name, $description, $maintainer_id, $contact_id) = @_; ++ ++ my $query = $self->{_queries}->{add_component}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_component}); ++ $self->{_queries}->{add_component} = $query; ++ } ++ ++ $query->execute($package_id, $name, $description, $maintainer_id, $contact_id); ++} ++ ++=head2 del_package($package) ++ ++Delete given package from database. ++ ++=cut ++ ++sub del_package { ++ my ($self, $package) = @_; ++ $self->_delete('del_package', $package); ++ $self->_delete('del_versions', $package); ++ $self->_delete('del_components', $package); ++} ++ ++=head2 del_maintainer($maintainer) ++ ++Delete given maintainer from database. ++ ++=cut ++ ++sub del_maintainer { ++ my ($self, $maintainer) = @_; ++ $self->_delete('del_maintainer', $maintainer); ++} ++ ++sub _delete { ++ my ($self, $type, $value) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{$type}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{$type}); ++ $self->{_queries}->{$type} = $query; ++ } ++ ++ $query->execute($value); ++} ++ ++=head2 reset_password(I<$maintainer>, I<$password>) ++ ++Reset password of a maintainer to given password. ++ ++=cut ++ ++sub reset_password { ++ my ($self, $login, $pass) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{reset_password}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{reset_password}); ++ $self->{_queries}->{reset_password} = $query; ++ } ++ ++ $query->execute($pass, $login); ++} ++ ++=head2 browse_packages($callback) ++ ++Browse all packages from bugzilla, and execute given callback with name and ++maintainer as argument for each of them. ++ ++=cut ++ ++sub browse_packages { ++ my ($self, $callback) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{browse_packages}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{browse_packages}); ++ $self->{_queries}->{browse_packages} = $query; ++ } ++ ++ $query->execute(); ++ ++ while (my @row = $query->fetchrow_array()) { ++ $callback->(@row); ++ } ++} ++ ++# close database connection ++sub DESTROY { ++ my ($self) = @_; ++ ++ foreach my $query (values %{$self->{_queries}}) { ++ $query->finish(); ++ } ++ ++ $self->{_dbh}->disconnect(); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputAgepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,110 @@ ++# $Id: Age.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Age; ++ ++=head1 NAME ++ ++Youri::Check::Input::Age - Check maximum age ++ ++=head1 DESCRIPTION ++ ++This plugin checks packages age, and report the ones exceeding maximum limit. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use DateTime; ++use DateTime::Format::Duration; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ buildtime ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Age object. ++ ++Specific parameters: ++ ++=over ++ ++=item max_age $age ++ ++Maximum age allowed (default: 1 year) ++ ++=item pattern $pattern ++ ++Pattern used to describe age (default: %Y year) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ max_age => '1 year', ++ pattern => '%Y year', ++ @_ ++ ); ++ ++ $self->{_format} = DateTime::Format::Duration->new( ++ pattern => $options{pattern} ++ ); ++ ++ $self->{_now} = DateTime->from_epoch( ++ epoch => time() ++ ); ++ ++ $self->{_max_age} = $options{max_age}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $max_age_string = $media->max_age() ? ++ $media->max_age() : ++ $self->{_max_age}; ++ ++ my $max_age = $self->{_format}->parse_duration($max_age_string); ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ my $buildtime = DateTime->from_epoch( ++ epoch => $package->get_age() ++ ); ++ ++ my $age = $self->{_now}->subtract_datetime($buildtime); ++ ++ if (DateTime::Duration->compare($age, $max_age) > 0) { ++ my $date = $buildtime->strftime("%a %d %b %G"); ++ ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $package->get_arch(), ++ buildtime => $date ++ }); ++ } ++ }; ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceIurtpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,117 @@ ++# $Id: LBD.pm 574 2005-12-27 14:31:16Z guillomovitch $ ++package Youri::Check::Input::Build::Source::Iurt; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build::Source::Iurt - Iurt build log source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Build> collects build logs ++available from a iurt build bot. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use base 'Youri::Check::Input::Build::Source'; ++ ++my %status = ( ++ install_deps => 0, ++ build => 1, ++ binary_test => 2 ++); ++ ++my $pattern = '^(' ++ . join('|', keys %status) ++ . ')_\S+-[^-]+-[^-]+\.src\.rpm\.\d+\.log$'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build::LBD object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL of logs for this iurt instance (default: ++http://qa.mandriva.com/build/iurt/cooker) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://qa.mandriva.com/build/iurt/cooker', ++ @_ ++ ); ++ ++ $self->{_agent} = LWP::UserAgent->new(); ++ ++ # try to connect to base URL directly, and abort if not available ++ my $response = $self->{_agent}->head($options{url}); ++ die "Unavailable URL $options{url}: " . $response->status_line() ++ unless $response->is_success(); ++ ++ $self->{_url} = $options{url}; ++} ++ ++sub fails { ++ my ($self, $name, $version, $release, $arch) = @_; ++ ++ my $result; ++ my $url = "$self->{_url}/$arch/log/$name-$version-$release.src.rpm"; ++ print "Fetching URL $url: " if $self->{_verbose} > 1; ++ my $response = $self->{_agent}->get($url); ++ print $response->status_line() . "\n" if $self->{_verbose} > 1; ++ if ($response->is_success()) { ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /$pattern/o; ++ my $status = $1; ++ if ( ++ !$result->{status} || ++ $status{$result->{status}} < $status{$status} ++ ) { ++ $result->{status} = $status; ++ $result->{url} = $url . '/' . $href; ++ } ++ } ++ } ++ ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch} = $result; ++ ++ return $result->{status} && $result->{status} ne 'binary_test'; ++} ++ ++sub status { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{status}; ++} ++ ++sub url { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{url}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceLBDpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,135 @@ ++# $Id: LBD.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Build::Source::LBD; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build::Source::LBD - LBD build log source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Build> collects build logs ++available from a LBD build bot. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use base 'Youri::Check::Input::Build::Source'; ++ ++my @status = qw/ ++ OK ++ arch_excl ++ broken ++ cannot_be_installed ++ debug ++ dependency ++ file_not_found ++ multiarch ++ problem ++ unpackaged_files ++/; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build::LBD object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL of logs for this LBD instance (default: http://eijk.homelinux.org/build) ++ ++=item medias $medias ++ ++List of medias monitored by this LBD instance ++ ++=item archs $archs ++ ++List of architectures monitored by this LBD instance ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://eijk.homelinux.org/build', ++ medias => undef, ++ archs => undef, ++ @_ ++ ); ++ ++ my $agent = LWP::UserAgent->new(); ++ ++ # try to connect to base URL directly, and abort if not available ++ my $response = $agent->head($options{url}); ++ die "Unavailable URL $options{url}: " . $response->status_line() ++ unless $response->is_success(); ++ ++ my $pattern = '^(\S+)-([^-]+)-([^-]+)(?:\.gz)?$'; ++ ++ foreach my $arch (@{$options{archs}}) { ++ foreach my $media (@{$options{medias}}) { ++ my $url_base = "$options{url}/$arch/$media/BO"; ++ foreach my $status (@status) { ++ my $url = "$url_base/$status/"; ++ print "Fetching URL $url: " if $self->{_verbose} > 1; ++ my $response = $agent->get($url); ++ print $response->status_line() . "\n" if $self->{_verbose} > 1; ++ if ($response->is_success()) { ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /$pattern/o; ++ my $name = $1; ++ my $version = $2; ++ my $release = $3; ++ my $result; ++ $result->{status} = $status; ++ $result->{url} = $url . '/' . $href; ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch} = $result; ++ } ++ } ++ } ++ } ++ } ++} ++ ++sub fails { ++ my ($self, $name, $version, $release, $arch) = @_; ++ ++ my $status = ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{status}; ++ ++ return $status && $status ne 'OK' && $status ne 'arch_excl'; ++} ++ ++sub status { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{status}; ++} ++ ++sub url { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{url}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildSourcepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,109 @@ ++# $Id: Source.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Build::Source; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build::Source - Abstract build log source ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the updates source interface for ++L<Youri::Check::Input::Build>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns source identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 fails($name, $version, $release, $arch) ++ ++Returns true if build fails for package with given name, version and release on ++given architecture. ++ ++=head2 status($name, $version, $release, $arch) ++ ++Returns exact build status for package with given name, version and release on ++given architecture. It has to be called after fails(). ++ ++=head2 url($name, $version, $release, $arch) ++ ++Returns URL of information source for package with given name, version and ++release on given architecture. It has to be called after fails(). ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item fails ++ ++=item status ++ ++=item url ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,128 @@ ++# $Id: Build.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Build; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build - Check build outputs ++ ++=head1 DESCRIPTION ++ ++This plugin checks build outputs of packages, and report failures. Additional ++source plugins handle specific sources. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ bot ++ status ++ /; ++} ++ ++sub links { ++ return qw/ ++ status url ++ /; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build object. ++ ++Specific parameters: ++ ++=over ++ ++=item sources $sources ++ ++Hash of source plugins definitions ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ sources => undef, ++ @_ ++ ); ++ ++ croak "No source defined" unless $options{sources}; ++ croak "sources should be an hashref" unless ref $options{sources} eq 'HASH'; ++ ++ foreach my $id (keys %{$options{sources}}) { ++ print "Creating source $id\n" if $options{verbose}; ++ eval { ++ push( ++ @{$self->{_sources}}, ++ create_instance( ++ 'Youri::Check::Input::Build::Source', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ %{$options{sources}->{$id}} ++ ) ++ ); ++ # register monitored archs ++ $self->{_archs}->{$_}->{$id} = 1 ++ foreach @{$options{sources}->{$id}->{archs}}; ++ }; ++ print STDERR "Failed to create source $id: $@\n" if $@; ++ } ++ ++ croak "no sources created" unless @{$self->{_sources}}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a source media check only ++ return unless $media->get_type() eq 'source'; ++ ++ my $callback = sub { ++ my ($package) = @_; ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ ++ foreach my $source (@{$self->{_sources}}) { ++ my $id = $source->get_id(); ++ foreach my $arch (keys %{$self->{_archs}}) { ++ next unless $self->{_archs}->{$arch}->{$id}; ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ bot => $id, ++ status => $source->status($name, $version, $release, $arch), ++ url => $source->url($name, $version, $release, $arch), ++ }) if $source->fails( ++ $name, ++ $version, ++ $release, ++ $arch, ++ ); ++ } ++ } ++ }; ++ ++ $media->traverse_headers($callback); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputConflictspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,231 @@ ++# $Id: Conflicts.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Conflicts; ++ ++=head1 NAME ++ ++Youri::Check::Input::Conflicts - Check file conflicts ++ ++=head1 DESCRIPTION ++ ++This plugin checks packages files, and report conflict and duplications. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use constant; ++use Youri::Package; ++use base 'Youri::Check::Input'; ++ ++use constant TYPE_MASK => 0170000; ++use constant TYPE_DIR => 0040000; ++ ++use constant PACKAGE => 0; ++use constant MODE => 1; ++use constant MD5SUM => 2; ++ ++my $compatibility = { ++ x86_64 => 'i586', ++ i586 => 'x86_64', ++ sparc64 => 'sparc', ++ sparc => 'sparc64', ++ ppc64 => 'ppc', ++ ppc => 'ppc64' ++}; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ level ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Conflicts object. ++ ++No specific parameters. ++ ++=cut ++ ++sub prepare { ++ my ($self, @medias) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $index = sub { ++ my ($package) = @_; ++ ++ # index files ++ foreach my $file ($package->get_files()) { ++ push( ++ @{$self->{_files}->{$file->[Youri::Package::FILE_NAME]}}, ++ [ $package, $file->[Youri::Package::FILE_MODE], $file->[Youri::Package::FILE_MD5SUM] ] ++ ); ++ } ++ }; ++ ++ foreach my $media (@medias) { ++ # don't index source media files ++ next unless $media->get_type() eq 'binary'; ++ ++ my $media_id = $media->get_id(); ++ $self->{_medias}->{$media_id} = 1; ++ print STDERR "Indexing media $media_id files\n" ++ if $self->{_verbose}; ++ ++ $media->traverse_headers($index); ++ } ++} ++ ++sub run { ++ my ($self, $media, $result) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a binary media check only ++ return unless $media->get_type() eq 'binary'; ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ return if $package->get_arch() eq 'src'; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ foreach my $file ($package->get_files()) { ++ ++ my $found = ++ $self->{_files}->{$file->[Youri::Package::FILE_NAME]}; ++ ++ my @found = $found ? @$found : (); ++ ++ foreach my $found (@found) { ++ next if $found->[PACKAGE] == $package; ++ next unless compatible($found->[PACKAGE], $package); ++ next if conflict($found->[PACKAGE], $package); ++ next if replace($found->[PACKAGE], $package); ++ if ( ++ ($file->[Youri::Package::FILE_MODE] & TYPE_MASK) == TYPE_DIR && ++ ($found->[MODE] & TYPE_MASK) == TYPE_DIR ++ ) { ++ $result->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "directory $file->[Youri::Package::FILE_NAME] duplicated with package " . $found->[PACKAGE]->get_name(), ++ level => Youri::Check::Input::WARNING ++ }) unless $self->_directory_duplicate_exception( ++ $package, ++ $found->[PACKAGE], ++ $file ++ ); ++ } else { ++ if ($found->[MD5SUM] eq $file->[Youri::Package::FILE_MD5SUM]) { ++ $result->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "file $file->[Youri::Package::FILE_NAME] duplicated with package " . $found->[PACKAGE]->get_name(), ++ level => Youri::Check::Input::WARNING ++ }) unless $self->_file_duplicate_exception( ++ $package, ++ $found->[PACKAGE], ++ $file ++ ); ++ } else { ++ $result->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "non-explicit conflict on file $file->[Youri::Package::FILE_NAME] with package " . $found->[PACKAGE]->get_name(), ++ level => Youri::Check::Input::ERROR ++ }) unless $self->_file_conflict_exception( ++ $package, ++ $found->[PACKAGE], ++ $file ++ ); ++ } ++ } ++ } ++ } ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++# return true if $package1 is arch-compatible with $package2 ++sub compatible { ++ my ($package1, $package2) = @_; ++ ++ my $arch1 = $package1->get_arch(); ++ my $arch2 = $package2->get_arch(); ++ ++ return 1 if $arch1 eq $arch2; ++ ++ return 1 if $compatibility->{$arch1} && $compatibility->{$arch1} eq $arch2; ++ ++ return 0; ++} ++ ++# return true if $package1 conflict with $package2 ++# or the other way around ++sub conflict { ++ my ($package1, $package2) = @_; ++ ++ my $name2 = $package2->get_name(); ++ ++ foreach my $conflict ($package1->get_conflicts()) { ++ return 1 if $conflict eq $name2; ++ } ++ ++ my $name1 = $package1->get_name(); ++ ++ foreach my $conflict ($package2->get_conflicts()) { ++ return 1 if $conflict eq $name1; ++ } ++ ++ return 0; ++} ++ ++# return true if $package1 replace $package2 ++sub replace { ++ my ($package1, $package2) = @_; ++ ++ ++ my $name1 = $package1->get_name(); ++ my $name2 = $package2->get_name(); ++ ++ return 1 if $name1 eq $name2; ++ ++ foreach my $obsolete ($package1->get_obsoletes()) { ++ return 1 if $obsolete->[Youri::Package::DEPENDENCY_NAME] eq $name2; ++ } ++ ++ return 0; ++} ++ ++sub _directory_duplicate_exception { ++ return 0; ++} ++ ++sub _file_duplicate_exception { ++ return 0; ++} ++ ++sub _file_conflict_exception { ++ return 0; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputDependenciespm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,162 @@ ++# $Id: Dependencies.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Dependencies; ++ ++=head1 NAME ++ ++Youri::Check::Input::Dependencies - Check dependencies consistency ++ ++=head1 DESCRIPTION ++ ++This class checks dependencies consistency. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Package; ++use base 'Youri::Check::Input'; ++ ++use constant MEDIA => 0; ++use constant RANGE => 1; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ level ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++sub prepare { ++ my ($self, @medias) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ foreach my $media (@medias) { ++ my $media_id = $media->get_id(); ++ $self->{_medias}->{$media_id} = 1; ++ print STDERR "Indexing media $media_id dependencies\n" ++ if $self->{_verbose}; ++ ++ my $index = sub { ++ my ($package) = @_; ++ ++ # index provides ++ foreach my $provide ($package->get_provides()) { ++ push( ++ @{$self->{_provides}->{$provide->[Youri::Package::DEPENDENCY_NAME]}}, ++ [ $media_id, $provide->[Youri::Package::DEPENDENCY_RANGE] ] ++ ); ++ } ++ ++ # index files ++ foreach my $file ($package->get_files()) { ++ push( ++ @{$self->{_files}->{$file->[Youri::Package::FILE_NAME]}}, ++ [ $media_id, undef ] ++ ); ++ } ++ }; ++ $media->traverse_headers($index); ++ } ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @allowed_ids = $media->allow_deps(); ++ ++ # abort unless all allowed medias are present ++ foreach my $id (@allowed_ids) { ++ unless ($self->{_medias}->{$id}) { ++ carp "Missing media $id, aborting"; ++ return; ++ } ++ } ++ ++ # index allowed medias ++ my %allowed_ids = map { $_ => 1 } @allowed_ids; ++ my $allowed_ids = join(",", @allowed_ids); ++ ++ my $class = $media->get_package_class(); ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ foreach my $require ($package->get_requires()) { ++ ++ my $found = ++ substr($require->[Youri::Package::DEPENDENCY_NAME], 0, 1) eq '/' ? ++ $self->{_files}->{$require->[Youri::Package::DEPENDENCY_NAME]} : ++ $self->{_provides}->{$require->[Youri::Package::DEPENDENCY_NAME]}; ++ ++ my @found = $found ? @$found : (); ++ ++ if (!@found) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "$require->[Youri::Package::DEPENDENCY_NAME] not found", ++ level => Youri::Check::Input::ERROR ++ }); ++ next; ++ } ++ ++ my @found_in_media = ++ grep { $allowed_ids{$_->[MEDIA]} } ++ @found; ++ ++ if (!@found_in_media) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "$require->[Youri::Package::DEPENDENCY_NAME] found in incorrect media $_->[MEDIA] (allowed $allowed_ids)", ++ level => Youri::Check::Input::ERROR ++ }) foreach @found; ++ next; ++ } ++ ++ next unless $require->[Youri::Package::DEPENDENCY_RANGE]; ++ ++ my @found_in_range = ++ grep { ++ !$_->[RANGE] || ++ $class->compare_ranges( ++ $require->[Youri::Package::DEPENDENCY_RANGE], ++ $_->[RANGE] ++ ) ++ } @found_in_media; ++ ++ if (!@found_in_range) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "$require->[Youri::Package::DEPENDENCY_NAME] found with incorrect range $_->[RANGE] (needed $require->[Youri::Package::DEPENDENCY_RANGE])", ++ level => Youri::Check::Input::ERROR ++ }) foreach @found_in_media; ++ next; ++ } ++ } ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputMandrivaConflictspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,63 @@ ++# $Id: Conflicts.pm 533 2005-10-20 07:08:03Z guillomovitch $ ++package Youri::Check::Input::MandrivaConflicts; ++ ++=head1 NAME ++ ++Youri::Check::Input::MandrivaConflicts - Check file conflicts on Mandriva ++ ++=head1 DESCRIPTION ++ ++This class checks file conflicts between packages, taking care of Mandriva ++packaging policy. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Package; ++use base 'Youri::Check::Input::Conflicts'; ++ ++sub _directory_duplicate_exception { ++ my ($self, $package1, $package2, $file) = @_; ++ ++ # allow shared directories between devel packages of different arch ++ return 1 if _multiarch_exception($package1, $package2); ++ ++ # allow shared modules directories between perl packages ++ return 1 if ++ $file->[Youri::Package::FILE_NAME] =~ /^\/usr\/lib\/perl5\/vendor_perl\// && ++ $file->[Youri::Package::FILE_NAME] !~ /^(auto|[^\/]+-linux)$/; ++ ++ return 0; ++} ++ ++sub _file_duplicate_exception { ++ my ($self, $package1, $package2, $file) = @_; ++ ++ # allow shared files between devel packages of different arch ++ return 1 if _multiarch_exception($package1, $package2); ++ ++ return 0; ++} ++ ++sub _multiarch_exception { ++ my ($package1, $package2) = @_; ++ ++ return 1 if ++ $package1->get_canonical_name() eq $package2->get_canonical_name() ++ && $package1->get_name() =~ /-devel$/ ++ && $package2->get_name() =~ /-devel$/; ++ ++ return 0; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputMissingpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,138 @@ ++package Youri::Check::Input::Missing; ++ ++=head1 NAME ++ ++Youri::Check::Input::Missing - Check components consistency ++ ++=head1 DESCRIPTION ++ ++This plugin checks consistency between package components, and report outdated ++ones. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use List::MoreUtils qw/all any/; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ component ++ arch ++ revision ++ error ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Missing object. ++ ++No specific parameters. ++ ++=cut ++ ++sub prepare { ++ my ($self, @medias) = @_; ++ croak "Not a class method" unless ref $self; ++ $self->{_srcs} = (); ++ foreach my $media (@medias) { ++ # only index source media ++ next unless $media->get_type() eq 'source'; ++ ++ my $media_id = $media->get_id(); ++ $self->{_medias}->{$media_id} = 1; ++ print STDERR "Indexing media $media_id packages\n" if $self->{_verbose}; ++ ++ my $index = sub { ++ my ($package) = @_; ++ $self->{_srcs}->{$media_id}->{$package->get_name()} = ++ $package->get_version() . '-' . $package->get_release(); ++ }; ++ ++ $media->traverse_headers($index); ++ } ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a binary media check only ++ return unless $media->get_type() eq 'binary'; ++ ++ my @allowed_ids = $media->allow_srcs(); ++ ++ # abort unless all allowed medias are present ++ foreach my $id (@allowed_ids) { ++ unless ($self->{_medias}->{$id}) { ++ carp "Missing media $id, aborting"; ++ return; ++ } ++ } ++ ++ my $class = $media->get_package_class(); ++ ++ my $check_package = sub { ++ my ($package) = @_; ++ my $canonical_name = $package->get_canonical_name(); ++ ++ my $bin_revision = ++ $package->get_version() . '-' . $package->get_release(); ++ ++ my $src_revision; ++ foreach my $id (@allowed_ids) { ++ $src_revision = $self->{_srcs}->{$id}->{$canonical_name}; ++ last if $src_revision; ++ } ++ ++ if ($src_revision) { ++ # check if revision match ++ unless ($src_revision eq $bin_revision) { ++ if ($class->compare_versions($src_revision, $bin_revision) > 0) { ++ # binary package is obsolete ++ $resultset->add_result($self->{_id}, $media, $package, { ++ component => $package->get_name(), ++ arch => $package->get_arch(), ++ revision => $bin_revision, ++ error => "Obsolete binaries (source $src_revision found)", ++ }); ++ } else { ++ # source package is obsolete ++ $resultset->add_result($self->{_id}, $media, $package, { ++ component => $package->get_canonical_name(), ++ arch => 'src', ++ revision => $src_revision, ++ error => "Obsolete source (binaries $bin_revision found)", ++ }); ++ } ++ } ++ } else { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ component => $package->get_name(), ++ arch => $package->get_arch(), ++ revision => $bin_revision, ++ error => "Missing source package", ++ }); ++ } ++ }; ++ ++ $media->traverse_headers($check_package); ++} ++ ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputOrphanspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,74 @@ ++package Youri::Check::Input::Orphans; ++ ++=head1 NAME ++ ++Youri::Check::Input::Orphans - Check maintainance ++ ++=head1 DESCRIPTION ++ ++This plugin checks maintainance status of packages, and reports unmaintained ++ones. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ error ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Orphans object. ++ ++No specific parameters. ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ resolver => undef, ++ @_ ++ ); ++ ++ croak "No resolver defined" unless $options{resolver}; ++ ++ $self->{_resolver} = $options{resolver}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a source media check only ++ return unless $media->get_type() eq 'source'; ++ ++ my $check = sub { ++ my ($package) = @_; ++ $resultset->add_result($self->{_id}, $media, $package, { ++ error => "unmaintained package" ++ }) unless $self->{_resolver}->get_maintainer($package); ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputRpmlintpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,113 @@ ++# $Id: Rpmlint.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Rpmlint; ++ ++=head1 NAME ++ ++Youri::Check::Input::Rpmlint - Check packages with rpmlint ++ ++=head1 DESCRIPTION ++ ++This plugins checks packages with rpmlint, and reports output. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ level ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Rpmlint object. ++ ++Specific parameters: ++ ++=over ++ ++=item path $path ++ ++Path to the rpmlint executable (default: /usr/bin/rpmlint) ++ ++=item config $config ++ ++Specific rpmlint configuration. ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ path => '/usr/bin/rpmlint', # path to rpmlint ++ config => '', # default rpmlint configuration ++ @_ ++ ); ++ ++ $self->{_path} = $options{path}; ++ $self->{_config} = $options{config}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $config = $media->rpmlint_config() ? ++ $media->rpmlint_config() : ++ $self->{_config}; ++ ++ my $check = sub { ++ my ($file, $package) = @_; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ my $command = "$self->{_path} -f $config $file"; ++ open(RPMLINT, "$command |") or die "Can't run $command: $!"; ++ while (<RPMLINT>) { ++ chomp; ++ if (/^E: \Q$name\E (.+)/) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => $1, ++ level => Youri::Check::Input::ERROR ++ }); ++ } elsif (/^W: \Q$name\E (.+)/) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => $1, ++ level => Youri::Check::Input::WARNING ++ }); ++ } ++ } ++ close(RPMLINT); ++ }; ++ ++ $media->traverse_files($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputSignaturepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,96 @@ ++# $Id: Rpmlint.pm 567 2005-12-12 21:24:56Z guillomovitch $ ++package Youri::Check::Input::Signature; ++ ++=head1 NAME ++ ++Youri::Check::Input::Signature - Check signature ++ ++=head1 DESCRIPTION ++ ++This plugin checks packages signature, and report unsigned ones. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Signature object. ++ ++Specific parameters: ++ ++=over ++ ++=item key $key ++ ++Expected GPG key identity ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ key => '', ++ @_ ++ ); ++ ++ $self->{_key} = $options{key}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ my $key = $package->get_gpg_key(); ++ ++ if (!$key) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "unsigned package $name" ++ }); ++ } elsif ($key ne $self->{_key}) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "invalid key id $key for package $name (allowed $self->{_key})" ++ }); ++ } ++ ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceCPANpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,75 @@ ++# $Id: CPAN.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::CPAN; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::CPAN - CPAN updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from CPAN. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::CPAN object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to CPAN full modules list (default: ++http://www.cpan.org/modules/01modules.index.html) ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://www.cpan.org/modules/01modules.index.html', ++ @_ ++ ); ++ ++ my $versions; ++ open(INPUT, "GET $options{url} |") or croak "Can't fetch $options{url}: $!"; ++ while (<INPUT>) { ++ next unless $_ =~ />([\w-]+)-([\d\.]+)\.tar\.gz<\/a>/; ++ $versions->{$1} = $2; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://search.cpan.org/dist/$name"; ++} ++ ++sub _name { ++ my ($self, $name) = @_; ++ $name =~ s/^perl-//g; ++ return $name; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceDebianpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,82 @@ ++# $Id: Debian.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Debian; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Debian - Debian source for updates ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++ available from Debian. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Debian object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to Debian mirror content file (default: http://ftp.debian.org/ls-lR.gz) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://ftp.debian.org/ls-lR.gz', ++ @_ ++ ); ++ ++ my $versions; ++ open(INPUT, "GET $options{url} | zcat |") or croak "Can't fetch $options{url}: $!"; ++ while (my $line = <INPUT>) { ++ next unless $line =~ /([\w\.-]+)_([\d\.]+)\.orig\.tar\.gz$/; ++ my $name = $1; ++ my $version = $2; ++ $versions->{$name} = $version; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://packages.debian.org/$name"; ++} ++ ++sub _name { ++ my ($self, $name) = @_; ++ ++ if ($name =~ /^(perl|ruby)-([-\w]+)$/) { ++ $name = lc("lib$2-$1"); ++ } elsif ($name =~ /^apache-([-\w]+)$/) { ++ $name = "libapache-$1"; ++ $name =~ s/_/-/g; ++ } ++ ++ return $name; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFedorapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,63 @@ ++# $Id: Fedora.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Fedora; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Fedora - Fedora updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Fedora. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Fedora object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to Fedora development SRPMS directory (default: ++http://fr.rpmfind.net/linux/fedora/core/development/SRPMS) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://fr.rpmfind.net/linux/fedora/core/development/SRPMS', ++ @_ ++ ); ++ ++ my $versions; ++ open(INPUT, "GET $options{url} |") or die "Can't fetch $options{url}: $!\n"; ++ while (<INPUT>) { ++ next unless $_ =~ />([\w-]+)-([\w\.]+)-[\w\.]+\.src\.rpm<\/a>/; ++ $versions->{$1} = $2; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFreshmeatpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,111 @@ ++# $Id: Freshmeat.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Freshmeat; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Freshmeat - Freshmeat source for updates ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Freshmeat. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use XML::Twig; ++use LWP::UserAgent; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Freshmeat ++object. ++ ++Specific parameters: ++ ++=over ++ ++=item preload true/false ++ ++Allows to load full Freshmeat catalogue at once instead of checking each software independantly (default: false) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ preload => 0, ++ @_ ++ ); ++ ++ if ($options{preload}) { ++ my $versions; ++ ++ my $project = sub { ++ my ($twig, $project) = @_; ++ my $name = $project->first_child('projectname_short')->text(); ++ my $version = $project->first_child('latest_release')->first_child('latest_release_version')->text(); ++ $versions->{$name} = $version; ++ $twig->purge(); ++ }; ++ ++ my $twig = XML::Twig->new( ++ TwigRoots => { project => $project } ++ ); ++ ++ my $url = 'http://download.freshmeat.net/backend/fm-projects.rdf.bz2'; ++ ++ open(INPUT, "GET $url | bzcat |") or die "Can't fetch $url: $!\n"; ++ $twig->parse(\*INPUT); ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++ } ++} ++ ++sub _version { ++ my ($self, $name) = @_; ++ ++ if ($self->{_versions}) { ++ return $self->{_versions}->{$name}; ++ } else { ++ my $version; ++ ++ my $latest_release_version = sub { ++ $version = $_[1]->text(); ++ }; ++ ++ my $twig = XML::Twig->new( ++ TwigRoots => { latest_release_version => $latest_release_version } ++ ); ++ ++ my $url = "http://freshmeat.net/projects-xml/$name"; ++ ++ open(INPUT, "GET $url |") or die "Can't fetch $url: $!\n"; ++ # freshmeat answer with an HTML page when project doesn't exist ++ $twig->safe_parse(\*INPUT); ++ close(INPUT); ++ ++ return $version; ++ } ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://freshmeat.net/projects/$name"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGNOMEpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,104 @@ ++# $Id$ ++package Youri::Check::Input::Updates::Source::GNOME; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::GNOME - GNOME updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from GNOME. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use List::MoreUtils 'any'; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Gnome object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to GNOME sources directory (default: ++http://fr2.rpmfind.net/linux/gnome.org/sources) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://fr2.rpmfind.net/linux/gnome.org/sources/', # default url ++ # We use HTTP as it offers a better sorting (1.2 < 1.10) ++ @_ ++ ); ++ ++ $self->{_agent} = LWP::UserAgent->new(); ++ my $response = $self->{_agent}->get($options{url}); ++ if($response->is_success()) { ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /^([-\w]+)\/$/o; ++ $self->{_names}->{$1} = 1; ++ } ++ } ++ ++ $self->{_url} = $options{url}; ++} ++ ++sub _version { ++ my ($self, $name) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $self->{_names}->{$name}; ++ ++ my $response = $self->{_agent}->get("$self->{_url}/$name/"); ++ if($response->is_success()) { ++ my $major; ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /^([.\d]+)\/$/o; ++ $major = $1; ++ } ++ return unless $major; ++ ++ $response = $self->{_agent}->get("$self->{_url}/$name/$major/"); ++ if($response->is_success()) { ++ $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /^LATEST-IS-([.\d]+)$/o; ++ return $1; ++ } ++ } ++ } ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return $self->{_url}."$name/"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGentoopm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,75 @@ ++# $Id: Gentoo.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Gentoo; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Gentoo - Gentoo updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Gentoo. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::Simple; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Gentoo object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to Gentoo snapshots directory (default: ++http://gentoo.mirror.sdv.fr/snapshots) ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://gentoo.mirror.sdv.fr/snapshots', # default URL ++ @_ ++ ); ++ ++ my $versions; ++ my $content = get($options{url}); ++ my $file; ++ while ($content =~ /<A HREF="(portage-\d{8}.tar.bz2)">/g) { ++ $file = $1; ++ } ++ open(INPUT, "GET $options{url}/$file | tar tjf - |") or croak "Can't fetch $options{url}/$file: $!"; ++ while (my $line = <INPUT>) { ++ next unless $line =~ /.*\/([\w-]+)-([\d\.]+)(:?-r\d)?\.ebuild$/; ++ $versions->{$1} = $2; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://packages.gentoo.org/search/?sstring=$name"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceNetBSDpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,75 @@ ++# $Id$ ++package Youri::Check::Input::Updates::Source::NetBSD; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::NetBSD - NetBSD source for updates ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++ available from NetBSD. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++use IO::Ftp; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::NetBSD object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to NetBSD mirror content file, without ftp: (default: //ftp.free.fr/mirrors/ftp.netbsd.org/NetBSD-current/pkgsrc/README-all.html) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => '//ftp.free.fr/mirrors/ftp.netbsd.org/NetBSD-current/pkgsrc/README-all.html', ++ @_ ++ ); ++ ++ my $versions; ++ my $urls; ++ ++ my $in = IO::Ftp->new('<',$options{url}) or croak "Can't fetch $options{url}: $!"; ++ while (my $line = <$in>) { ++ next unless $line =~ /<!-- (.+)-([^-]*?)(nb\d*)? \(for sorting\).*?href="([^"]+)"/; ++ my $name = $1; ++ my $version = $2; ++ $versions->{$name} = $version; ++ $urls->{$name} = $4; ++ } ++ close($in); ++ ++ $self->{_versions} = $versions; ++ $self->{_urls} = $urls; ++ $self->{_url} = $options{url}; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return $self->{_urls}->{$name}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceRAApm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,121 @@ ++# $Id: RAA.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::RAA; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::RAA - RAA updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from RAA. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use SOAP::Lite; ++use List::MoreUtils 'any'; ++use Youri::Package; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::RAA object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to RAA SOAP interface (default: ++http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/', ++ @_ ++ ); ++ ++ my $raa = SOAP::Lite->service($options{url}) ++ or croak "Can't connect to $options{url}"; ++ ++ $self->{_raa} = $raa; ++ $self->{_names} = $raa->names(); ++} ++ ++sub get_version { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name; ++ if (ref $package && $package->isa('Youri::Package')) { ++ # don't bother checking for non-ruby packages ++ if ( ++ any { $_->[Youri::Package::DEPENDENCY_NAME] =~ /ruby/ } ++ $package->get_requires() ++ ) { ++ $name = $package->get_canonical_name(); ++ } else { ++ return; ++ } ++ } else { ++ $name = $package; ++ } ++ ++ # translate in grabber namespace ++ $name = $self->get_name($name); ++ ++ # return if aliased to null ++ return unless $name; ++ ++ # susceptible to throw exception for timeout ++ eval { ++ my $gem = $self->{_raa}->gem($name); ++ return $gem->{project}->{version} if $gem; ++ }; ++ ++ return; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://raa.ruby-lang.org/project/$name/"; ++} ++ ++sub _name { ++ my ($self, $name) = @_; ++ ++ if (ref $self) { ++ my $match = $name; ++ $match =~ s/^ruby[-_]//; ++ $match =~ s/[-_]ruby$//; ++ my @results = ++ grep { /^(ruby[-_])?\Q$match\E([-_]ruby)$/ } ++ @{$self->{_names}}; ++ if (@results) { ++ return $results[0]; ++ } else { ++ return $name; ++ } ++ } else { ++ return $name; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceSourceforgepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,103 @@ ++# $Id: Sourceforge.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Sourceforge; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Sourceforge - Sourceforge updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Sourceforge. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use Youri::Check::Input::Updates; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Sourceforge ++object. ++ ++No specific parameters. ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++ ++ $self->{_agent} = LWP::UserAgent->new(); ++} ++ ++sub get_version { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name; ++ if (ref $package && $package->isa('Youri::Package')) { ++ # don't bother checking for packages without sf.net URL ++ my $url = $package->get_url(); ++ if ( ++ $url =~ /http:\/\/(.*)\.sourceforge\.net/ || ++ $url =~ /http:\/\/.*sourceforge\.net\/projects\/([^\/]+)/ ++ ) { ++ $name = $package->get_canonical_name(); ++ } else { ++ return; ++ } ++ } else { ++ $name = $package; ++ } ++ ++ # translate in grabber namespace ++ $name = $self->get_name($name); ++ ++ # return if aliased to null ++ return unless $name; ++ ++ my $response = $self->{_agent}->get($self->_url($name)); ++ if($response->is_success()) { ++ my $max = 0; ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $text = $parser->get_trimmed_text("/$token->[0]"); ++ next unless $text; ++ next unless $text =~ /^ ++ \Q$name\E ++ [._-]?($Youri::Check::Input::Updates::VERSION_REGEXP) ++ [._-]?(w(?:in)?(?:32)?|mips|sparc|bin|ppc|i\d86|src|sources?)? ++ \.(?:tar\.(?:gz|bz2)|tgz|zip) ++ $/iox; ++ my $version = $1; ++ my $arch = $2; ++ next if $arch && $arch !~ /(src|sources?)/; ++ $max = $version if Youri::Check::Input::Updates::is_newer($version, $max); ++ } ++ return $max if $max; ++ } ++ return; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://prdownloads.sourceforge.net/$name/"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourcepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,240 @@ ++# $Id: Source.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source - Abstract updates source ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the updates source interface for ++L<Youri::Check::Input::Updates>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates object. ++ ++Generic parameters (subclasses may define additional ones): ++ ++=over ++ ++=item aliases $aliases ++ ++Hash of package aliases. ++ ++=back ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ aliases => undef, # aliases ++ resolver => undef, # maintainer resolver ++ preferences => undef, # maintainer preferences ++ check_id => '', # parent check id ++ @_ ++ ); ++ ++ if ($options{aliases}) { ++ croak "aliases should be an hashref" unless ref $options{aliases} eq 'HASH'; ++ } ++ if ($options{resolver}) { ++ croak "resolver should be a Youri::Check::Maintainer::Resolver object" unless $options{resolver}->isa("Youri::Check::Maintainer::Resolver"); ++ } ++ if ($options{preferences}) { ++ croak "preferences should be a Youri::Check::Maintainer::Preferences object" unless $options{preferences}->isa("Youri::Check::Maintainer::Preferences"); ++ } ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _aliases => $options{aliases}, ++ _resolver => $options{resolver}, ++ _preferences => $options{preferences}, ++ _check_id => $options{check_id}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++Excepted explicit statement, package name is expressed with Mandriva naming ++conventions. ++ ++=head2 get_id() ++ ++Returns source identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 get_version($package) ++ ++Returns available version for given package, which can be either a full ++L<Youri::Package> object or just a package name. ++ ++=cut ++ ++sub get_version { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name = ref $package && $package->isa('Youri::Package') ? ++ $package->get_canonical_name() : ++ $package; ++ ++ # translate in grabber namespace ++ $name = $self->get_name($name); ++ ++ # return if aliased to null ++ return unless $name; ++ ++ # return subclass computation ++ return $self->_version($name); ++} ++ ++=head2 get_url($name) ++ ++Returns the URL of information source for package with given name. ++ ++=cut ++ ++sub get_url { ++ my ($self, $name) = @_; ++ ++ # retun subclass computation ++ return $self->_url($self->get_name($name)); ++} ++ ++=head2 name($name) ++ ++Returns name converted to specific source naming conventions for package with given name. ++ ++=cut ++ ++sub get_name { ++ my ($self, $name) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # return config aliases if it exists ++ if ($self->{_aliases} ) { ++ return $self->{_aliases}->{$name} if exists $self->{_aliases}->{$name}; ++ } ++ ++ # return maintainer aliases if it exists ++ if ($self->{_resolver} && $self->{_preferences}) { ++ my $maintainer = $self->{_resolver}->get_maintainer($name); ++ if ($maintainer) { ++ my $aliases = $self->{_preferences}->get_preference( ++ $maintainer, ++ $self->{_check_id}, ++ 'aliases' ++ ); ++ if ($aliases) { ++ if ($aliases->{all}) { ++ return $aliases->{all}->{$name} if exists $aliases->{all}->{$name}; ++ } ++ if ($aliases->{$self->{_id}}) { ++ return $aliases->{$self->{_id}}->{$name} if exists $aliases->{$self->{_id}}->{$name}; ++ } ++ } ++ } ++ } ++ ++ # return return subclass computation ++ return $self->_name($name); ++} ++ ++=head2 _version($name) ++ ++Hook called by default B<version()> implementation after name translation. ++ ++=cut ++ ++sub _version { ++ my ($self, $name) = @_; ++ return $self->{_versions}->{$name}; ++} ++ ++=head2 _url($name) ++ ++Hook called by default B<url()> implementation after name translation. ++ ++=cut ++ ++sub _url { ++ my ($self, $name) = @_; ++ return undef; ++} ++ ++=head2 _name($name) ++ ++Hook called by default B<name()> implementation if given name was not found in ++the aliases. ++ ++=cut ++ ++sub _name { ++ my ($self, $name) = @_; ++ return $name; ++} ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item version ++ ++As an alternative, the B<_version()> hook can be implemented. ++ ++=item url ++ ++As an alternative, the <_url()> hook can be implemented. ++ ++=item name ++ ++As an alternative, the B<_name()> hook can be implemented. ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatespm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,275 @@ ++# $Id: Updates.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates - Check available updates ++ ++=head1 DESCRIPTION ++ ++This plugin checks available updates for packages, and report existing ones. ++Additional source plugins handle specific sources. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use Youri::Utils; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ current ++ available ++ source ++ /; ++} ++ ++sub links { ++ return qw/ ++ source url ++ /; ++} ++ ++memoize('is_newer'); ++ ++our $VERSION_REGEXP = 'v?([\d._-]*\d)[._ -]*(?:(alpha|beta|pre|rc|pl|rev|cvs|svn|[a-z])[_ -.]*([\d.]*))?([_ -.]*.*)'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates object. ++ ++Specific parameters: ++ ++=over ++ ++=item aliases $aliases ++ ++Hash of global aliases definitions ++ ++=item sources $sources ++ ++Hash of source plugins definitions ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ aliases => undef, ++ sources => undef, ++ @_ ++ ); ++ ++ croak "No source defined" unless $options{sources}; ++ croak "sources should be an hashref" unless ref $options{sources} eq 'HASH'; ++ if ($options{aliases}) { ++ croak "aliases should be an hashref" unless ref $options{aliases} eq 'HASH'; ++ } ++ ++ foreach my $id (keys %{$options{sources}}) { ++ print "Creating source $id\n" if $options{verbose}; ++ eval { ++ # add global aliases if defined ++ if ($options{aliases}) { ++ foreach my $alias (keys %{$options{aliases}}) { ++ $options{sources}->{$id}->{aliases}->{$alias} = ++ $options{aliases}->{$alias} ++ } ++ } ++ ++ push( ++ @{$self->{_sources}}, ++ create_instance( ++ 'Youri::Check::Input::Updates::Source', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ check_id => $options{id}, ++ resolver => $options{resolver}, ++ preferences => $options{preferences}, ++ %{$options{sources}->{$id}} ++ ) ++ ); ++ }; ++ print STDERR "Failed to create source $id: $@\n" if $@; ++ } ++ ++ croak "no sources created" unless @{$self->{_sources}}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a source media check only ++ return unless $media->get_type() eq 'source'; ++ ++ my $callback = sub { ++ my ($package) = @_; ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ ++ # compute version with rpm subtilities related to preversions ++ my $current_version = ($release =~ /^0\.(\w+)\.\w+$/) ? ++ $version . $1 : ++ $version; ++ my $current_stable = is_stable($current_version); ++ ++ my ($max_version, $max_source, $max_url); ++ $max_version = $current_version; ++ ++ foreach my $source (@{$self->{_sources}}) { ++ my $available_version = $source->get_version($package); ++ if ( ++ $available_version && ++ (! $current_stable || is_stable($available_version)) && ++ is_newer($available_version, $max_version) ++ ) { ++ $max_version = $available_version; ++ $max_source = $source->get_id(); ++ $max_url = $source->get_url($name); ++ } ++ } ++ $resultset->add_result($self->{_id}, $media, $package, { ++ current => $current_version, ++ available => $max_version, ++ source => $max_source, ++ url => $max_url ++ }) if $max_version ne $current_version; ++ }; ++ ++ $media->traverse_headers($callback); ++} ++ ++=head2 is_stable($version) ++ ++Checks if given version is stable. ++ ++=cut ++ ++sub is_stable { ++ my ($version) = @_; ++ return $version !~ /alpha|beta|pre|rc|cvs|svn/i; ++ ++} ++ ++=head2 is_newer($v1, $v2) ++ ++Checks if $v1 is newer than $v2. ++ ++This function will return true only if we are sure this is newer (and not equal). ++If we can't compare the versions, a warning will be displayed. ++ ++=cut ++ ++sub is_newer { ++ my ($v1, $v2) = @_; ++ return 0 if $v1 eq $v2; ++ ++ # Reject strange cases ++ # One is a large number (like date or revision) and the other one not, or ++ # has different length ++ if (($v1 =~ /^\d{3,}$/ || $v2 =~ /^\d{3,}$/) ++ && (join('0',split(/\d/, $v1."X")) ne join('0',split(/\d/, $v2."X")))) { ++ carp "strange : $v1 vs $v2"; ++ return 0; ++ } ++ ++ my %states = (alpha=>-4,beta=>-3,pre=>-2,rc=>-1); ++ my $i; $states{$_} = ++$i foreach 'a'..'z'; ++ ++ if ($v1 =~ /^[\d._-]+$/ && $v2 =~ /^[\d._-]+$/) { ++ my @v1 = split(/[._-]/, $v1); ++ my @v2 = split(/[._-]/, $v2); ++ if (join('',@v1) eq (join '',@v2)) { ++ # Might be something like 1.2.0 vs 1.20, usual false positive ++ carp "strange : $v1 vs $v2"; ++ return 0; ++ } ++ for my $i (0 .. $#v1) { ++ $v1[$i] ||= 0; ++ $v2[$i] ||= 0; ++ return 1 if $v1[$i] > $v2[$i]; ++ return 0 if $v1[$i] < $v2[$i]; ++ } ++ # When v2 is longer than v1 but start the same, v1 <= v2 ++ return 0; ++ } else { ++ my ($num1, $state1, $statenum1, $other1, $num2, $state2, $statenum2, $other2); ++ ++ if ($v1 =~ /^$VERSION_REGEXP$/io) { ++ ($num1, $state1, $statenum1, $other1) = ($1, "\L$2", $3, $4); ++ } else { ++ carp "unknown version format $v1"; ++ return 0; ++ } ++ ++ if ($v2 =~ /^$VERSION_REGEXP$/io) { ++ ($num2, $state2, $statenum2, $other2) = ($1, "\L$2", $3, $4); ++ } else { ++ carp "unknown version format $v2"; ++ return 0; ++ } ++ ++ # If we know the format of only one, there might be an issue, do nothing ++ ++ if (($other1 && ! $other2 )||(!$other1 && $other2 )) { ++ carp "can't compare $v1 vs $v2"; ++ return 0; ++ } ++ ++ return 1 if is_newer($num1, $num2); ++ return 0 unless $num1 eq $num2; ++ ++ # The numeric part is the same but not the end ++ ++ if ($state1 eq '') { ++ return 1 if $state2 =~ /^(alpha|beta|pre|rc)/; ++ return 0 if $state2 =~ /^([a-z]|pl)$/; ++ carp "unknown state format $state2"; ++ return 0; ++ } ++ ++ if ($state2 eq '') { ++ return 0 if $state1 =~ /^(alpha|beta|pre|rc)/; ++ return 1 if $state1 =~ /^([a-z]|pl)$/; ++ carp "unknown state format $state1"; ++ return 0; ++ } ++ ++ if ($state1 eq $state2) { ++ return 1 if is_newer($statenum1, $statenum2); ++ return 0 unless $statenum1 eq $statenum2; ++ # If everything is the same except this, just compare it ++ # as we have no idea on the format ++ return "$other1" gt "$other2"; ++ } ++ ++ my $s1 = 0; ++ my $s2 = 0; ++ $s1=$states{$state1} if exists $states{$state1}; ++ $s2=$states{$state2} if exists $states{$state2}; ++ return $s1>$s2 if ($s1 != 0 && $s2 != 0); ++ return 1 if $s1<0 && $state2 =~ /^([a-z]|pl)$/; ++ return 0 if $s2<0 && $state1 =~ /^([a-z]|pl)$/; ++ carp "unknown case $v1, $v2"; ++ return 0; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,120 @@ ++# $Id: Input.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input; ++ ++=head1 NAME ++ ++Youri::Check::Input - Abstract input plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines input plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++ ++use constant WARNING => 'warning'; ++use constant ERROR => 'error'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ resolver => undef, # maintainer resolver ++ preferences => undef, # maintainer preferences ++ @_ ++ ); ++ ++ if ($options{resolver}) { ++ croak "resolver should be a Youri::Check::Maintainer::Resolver object" unless $options{resolver}->isa("Youri::Check::Maintainer::Resolver"); ++ } ++ if ($options{preferences}) { ++ croak "preferences should be a Youri::Check::Maintainer::Preferences object" unless $options{preferences}->isa("Youri::Check::Maintainer::Preferences"); ++ } ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _resolver => $options{resolver}, ++ _preferences => $options{preferences}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns plugin identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 prepare(@medias) ++ ++Perform optional preliminary initialisation, using given list of ++<Youri::Media> objects. ++ ++=cut ++ ++sub prepare { ++ # do nothing ++} ++ ++=head2 run($media, $resultset) ++ ++Check the packages from given L<Youri::Media> object, and store the ++result in given L<Youri::Check::Resultset> object. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item run ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencesFilepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,87 @@ ++# $Id: File.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Preferences::File; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Preferences::File - File-based maintainer preferences implementation ++ ++=head1 DESCRIPTION ++ ++This is a file-based L<Youri::Check::Maintainer::Preferences> implementation. ++ ++It uses files in maintainer home directories. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Config; ++use base 'Youri::Check::Maintainer::Preferences'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Preferences::File object. ++ ++No specific parameters. ++ ++=cut ++ ++sub get_preference { ++ my ($self, $maintainer, $plugin, $value) = @_; ++ croak "Not a class method" unless ref $self; ++ return unless $maintainer && $plugin && $value; ++ ++ print "Retrieving maintainer $maintainer preferences\n" ++ if $self->{_verbose} > 0; ++ ++ $self->_load_config($maintainer) ++ unless exists $self->{_config}->{$maintainer}; ++ ++ return $self->{_config}->{$maintainer} ? ++ $self->{_config}->{$maintainer}->get($plugin . '_' . $value) : ++ undef; ++} ++ ++sub _load_config { ++ my ($self, $maintainer) = @_; ++ ++ print "Attempting to load maintainers preferences for $maintainer\n" if $self->{_verbose} > 1; ++ ++ ++ my ($login) = $maintainer =~ /^(\S+)\@\S+$/; ++ my $home = (getpwnam($login))[7]; ++ my $file = "$home/.youri/check.prefs"; ++ ++ if (-f $file && -r $file) { ++ print "Found, loading\n" if $self->{_verbose} > 1; ++ my $config = Youri::Config->new( ++ { ++ CREATE => 1, ++ GLOBAL => { ++ DEFAULT => undef, ++ EXPAND => EXPAND_VAR | EXPAND_ENV, ++ ARGCOUNT => ARGCOUNT_ONE, ++ } ++ } ++ ); ++ $config->file($file); ++ $self->{_config}->{$maintainer} = $config; ++ } else { ++ print "Not found, aborting\n" if $self->{_verbose} > 1; ++ $self->{_config}->{$maintainer} = undef; ++ } ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencespm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,80 @@ ++# $Id: Preferences.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Preferences; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Preferences - Abstract maintainer preferences ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Check::Maintainer::Preferences interface. ++ ++=head1 SYNOPSIS ++ ++ use Youri::Check::Maintainer::Preferences::Foo; ++ ++ my $preferences = Youri::Check::Maintainer::Preferences::Foo->new(); ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Preferences object. ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_preference($maintainer, $plugin, $item) ++ ++Returns preference of given maintainer for given plugin and configuration item. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item get ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverBugzillapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,100 @@ ++# $Id: Bugzilla.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Resolver::Bugzilla; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Resolver::Bugzilla - Bugzilla-based maintainer resolver ++ ++=head1 DESCRIPTION ++ ++This is a Bugzilla-based L<Youri::Check::Maintainer::Resolver> implementation. ++ ++It uses Bugzilla SQL database for resolving maintainers. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Bugzilla; ++use base 'Youri::Check::Maintainer::Resolver'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Resolver::Bugzilla object. ++ ++Specific parameters: ++ ++=over ++ ++=item host $host ++ ++Bugzilla database host. ++ ++=item base $base ++ ++Bugzilla database name. ++ ++=item user $user ++ ++Bugzilla database user. ++ ++=item pass $pass ++ ++Bugzilla database password. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ host => '', # host of the bug database ++ base => '', # name of the bug database ++ user => '', # user of the bug database ++ pass => '', # pass of the bug database ++ @_ ++ ); ++ ++ croak "No host given" unless $options{host}; ++ croak "No base given" unless $options{base}; ++ croak "No user given" unless $options{user}; ++ croak "No pass given" unless $options{pass}; ++ ++ my $bugzilla = Youri::Bugzilla->new( ++ $options{host}, ++ $options{base}, ++ $options{user}, ++ $options{pass} ++ ); ++ ++ $self->{_bugzilla} = $bugzilla; ++} ++ ++sub get_maintainer { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name = ref $package && $package->isa('Youri::Package') ? ++ $package->get_canonical_name() : ++ $package; ++ ++ $self->{_maintainers}->{$name} = ++ $self->{_bugzilla}->get_maintainer($name) ++ unless exists $self->{_maintainers}->{$name}; ++ ++ return $self->{_maintainers}->{$name}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverCGIpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,79 @@ ++# $Id: CGI.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Resolver::CGI; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Resolver::CGI - CGI-based maintainer resolver ++ ++=head1 DESCRIPTION ++ ++This is a CGI-based L<Youri::Check::Maintainer::Resolver> implementation. ++ ++It uses a remote CGI to resolve maintainers. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Maintainer::Resolver'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Resolver::CGI object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++CGI's URL. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => '', # url to fetch maintainers ++ @_ ++ ); ++ ++ croak "No URL given" unless $options{url}; ++ ++ open (INPUT, "GET $options{url} |"); ++ while (<INPUT>) { ++ chomp; ++ my ($package, $maintainer) = split(/\t/, $_); ++ $self->{_maintainers}->{$package} = $maintainer if $maintainer; ++ } ++ close(INPUT); ++} ++ ++sub get_maintainer { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ print "Retrieving package $package maintainer\n" ++ if $self->{_verbose} > 0; ++ ++ my $name = ref $package && $package->isa('Youri::Package') ? ++ $package->get_canonical_name() : ++ $package; ++ ++ return $self->{_maintainers}->{$name}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,86 @@ ++# $Id: Resolver.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Resolver; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Resolver - Abstract maintainer resolver ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Check::Maintainer::Resolver interface. ++ ++=head1 SYNOPSIS ++ ++ use Youri::Check::Maintainer::Resolver::Foo; ++ ++ my $resolver = Youri::Check::Maintainer::Resolver::Foo->new(); ++ ++ print $resolver->get_maintainer('foo'); ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Resolver object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _test => $options{test}, ++ _verbose => $options{verbose} ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_maintainer($package) ++ ++Returns maintainer for given package, which can be either a full ++L<Youri::Package> object or just a package name. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item get_maintainer ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatHTMLpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,222 @@ ++# $Id: HTML.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output::File::Format::HTML; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format::HTML - File HTML format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::File> provides HTML format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use CGI; ++use base 'Youri::Check::Output::File::Format'; ++ ++sub extension { ++ return 'html'; ++} ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ style => <<EOF, # css style ++h1 { ++ text-align:center; ++} ++table { ++ border-style:solid; ++ border-width:1px; ++ border-color:black; ++ width:100%; ++} ++tr.odd { ++ background-color:white; ++} ++tr.even { ++ background-color:silver; ++} ++p.footer { ++ font-size:smaller; ++ text-align:center; ++} ++EOF ++ @_ ++ ); ++ ++ $self->{_style} = $options{style}; ++ $self->{_cgi} = CGI->new(); ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $content; ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my $line; ++ my @results; ++ $content .= $self->{_cgi}->start_table(); ++ $content .= $self->{_cgi}->Tr([ ++ $self->{_cgi}->th([ ++ @$lead_columns, ++ @$columns ++ ]) ++ ]); ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ $content .= $self->{_cgi}->end_table(); ++ ++ return $self->_get_html_page($time, $title, \$content); ++} ++ ++sub get_index { ++ my ($self, $time, $title, $reports, $maintainers) = @_; ++ ++ my $content; ++ ++ if ($reports) { ++ $content .= $self->{_cgi}->h2("Reports"); ++ my @types = keys %{$reports}; ++ ++ $content .= $self->{_cgi}->start_ul(); ++ foreach my $type (sort @types) { ++ my $item; ++ $item = $self->{_cgi}->a( ++ { href => "$type.html" }, ++ $type ++ ); ++ foreach my $extension (@{$reports->{$type}}) { ++ next if ($extension eq extension()); ++ $item .= " ".$self->{_cgi}->a( ++ { href => "$type.$extension" }, ++ "[$extension]" ++ ); ++ } ++ $content .= $self->{_cgi}->li($item); ++ } ++ $content .= $self->{_cgi}->end_ul(); ++ } ++ ++ if ($maintainers) { ++ $content .= $self->{_cgi}->h2("Individual reports"); ++ ++ $content .= $self->{_cgi}->start_ul(); ++ foreach my $maintainer (sort @{$maintainers}) { ++ $content .= $self->{_cgi}->li( ++ $self->{_cgi}->a( ++ { href => "$maintainer/index.html" }, ++ _obfuscate($maintainer) ++ ) ++ ); ++ } ++ $content .= $self->{_cgi}->end_ul(); ++ } ++ ++ return $self->_get_html_page($time, $title, \$content); ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $links, $class, $results) = @_; ++ ++ my $content; ++ $content .= $self->{_cgi}->end_Tr(); ++ for my $i (0 .. $#$results) { ++ $content .= $self->{_cgi}->start_Tr( ++ { class => $class } ++ ); ++ if ($i == 0) { ++ # first line contains spanned cells ++ $content .= $self->{_cgi}->td( ++ { rowspan => scalar @$results }, ++ [ ++ map { $results->[$i]->{$_} } ++ @$lead_columns ++ ] ++ ); ++ } ++ $content .= $self->{_cgi}->td( ++ [ ++ map { ++ $links->{$_} && $results->[$i]->{$links->{$_}} ? ++ $self->{_cgi}->a( ++ { href => $results->[$i]->{$links->{$_}} }, ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ ) : ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ } @$columns ++ ] ++ ); ++ $content .= $self->{_cgi}->end_Tr(); ++ } ++ ++ return $content; ++} ++ ++ ++sub _get_html_page { ++ my ($self, $time, $title, $body) = @_; ++ ++ my $content; ++ $content .= $self->{_cgi}->start_html( ++ -title => $title, ++ -style => { code => $self->{_style} } ++ ); ++ $content .= $self->{_cgi}->h1($title); ++ $content .= $$body; ++ $content .= $self->{_cgi}->hr(); ++ $content .= $self->{_cgi}->p( ++ { class => 'footer' }, ++ "Page generated $time" ++ ); ++ $content .= $self->{_cgi}->end_html(); ++ ++ return \$content; ++} ++ ++sub _obfuscate { ++ my ($email) = @_; ++ ++ return unless $email; ++ ++ $email =~ s/\@/ at /; ++ $email =~ s/\./ dot /; ++ ++ return $email; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatRSSpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,68 @@ ++# $Id$ ++package Youri::Check::Output::File::Format::RSS; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format::RSS - File RSS format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::File> provides RSS format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use XML::RSS; ++use base 'Youri::Check::Output::File::Format'; ++ ++sub extension { ++ return 'rss'; ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ return unless $maintainer; ++ ++ my $rss = new XML::RSS (version => '2.0'); ++ $rss->channel( ++ title => $title, ++ description => $title, ++ language => 'en', ++ ttl => 1440 ++ ); ++ ++ while (my $result = $iterator->get_result()) { ++ if ($type eq 'updates') { ++ $rss->add_item( ++ title => "$result->{package} $result->{available} is available", ++ description => "Current version is $result->{current}", ++ link => $result->{url} ? ++ $result->{url} : $result->{source}, ++ guid => "$result->{package}-$result->{available}" ++ ); ++ } else { ++ $rss->add_item( ++ title => "[$type] $result->{package}", ++ description => join("\n", (map { $result->{$_} || '' } @$columns)), ++ link => $result->{url}, ++ guid => "$type-$result->{package}" ++ ); ++ } ++ } ++ ++ return \$rss->as_string(); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatTextpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,88 @@ ++# $Id: Text.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output::File::Format::Text; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format::Text - File text format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::File> provides text format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Output::File::Format'; ++ ++sub extension { ++ return 'txt'; ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $content; ++ $content .= $title; ++ $content .= "\n"; ++ ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my @results; ++ $content .= join("\t", @$lead_columns, @$columns) . "\n"; ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ ++ $content .= "\n"; ++ $content .= "Page generated $time\n"; ++ ++ return \$content; ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $results) = @_; ++ ++ my $content; ++ $content .= join( ++ "\t", ++ (map { $results->[0]->{$_} || '' } @$lead_columns), ++ (map { $results->[0]->{$_} || '' } @$columns) ++ ) . "\n"; ++ for my $i (1 .. $#$results) { ++ $content .= join( ++ "\t", ++ (map { '' } @$lead_columns), ++ (map { $results->[$i]->{$_} || '' } @$columns) ++ ) . "\n"; ++ } ++ return $content; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,66 @@ ++# $Id: Base.pm 579 2006-01-09 21:17:54Z guillomovitch $ ++package Youri::Check::Output::File::Format; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format - Abstract file format support ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the format support interface for ++L<Youri::Check::Output::File>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', ++ test => 0, ++ verbose => 0, ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_id() ++ ++Returns format handler identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFilepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,203 @@ ++# $Id: Text.pm 523 2005-10-11 08:36:49Z misc $ ++package Youri::Check::Output::File; ++ ++=head1 NAME ++ ++Youri::Check::Output::File - Report results in files ++ ++=head1 DESCRIPTION ++ ++This plugin reports results in files. Additional subplugins handle specific ++formats. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use File::Path; ++use DateTime; ++use Youri::Utils; ++use base 'Youri::Check::Output'; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ to => '', # target directory ++ noclean => 0, # don't clean up target directory ++ noempty => 0, # don't generate empty reports ++ formats => undef, ++ @_ ++ ); ++ ++ croak "no format defined" unless $options{formats}; ++ croak "formats should be an hashref" unless ref $options{formats} eq 'HASH'; ++ ++ my $now = DateTime->now(time_zone => 'local'); ++ my $time = "the " . $now->ymd() . " at " . $now->hms(); ++ ++ $self->{_to} = $options{to}; ++ $self->{_noclean} = $options{noclean}; ++ $self->{_noempty} = $options{noempty}; ++ $self->{_time} = $time; ++ ++ foreach my $id (keys %{$options{formats}}) { ++ print "Creating format $id\n" if $options{verbose}; ++ eval { ++ push( ++ @{$self->{_formats}}, ++ create_instance( ++ 'Youri::Check::Output::File::Format', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ %{$options{formats}->{$id}} ++ ) ++ ); ++ }; ++ print STDERR "Failed to create format $id: $@\n" if $@; ++ } ++ ++ croak "no formats created" unless @{$self->{_formats}}; ++} ++ ++sub _init_report { ++ my ($self) = @_; ++ ++ # clean up output directory ++ unless ($self->{_test} || $self->{_noclean} || !$self->{_to}) { ++ my @files = glob($self->{_to} . '/*'); ++ rmtree(\@files) if @files; ++ } ++} ++ ++sub _global_report { ++ my ($self, $resultset, $type, $columns, $links) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ] ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type global report", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ undef ++ ); ++ ++ # create and register file ++ my $extension = $format->extension(); ++ $self->_write_file( ++ "$self->{_to}/$type.$extension", ++ $content ++ ); ++ push( ++ @{$self->{_files}->{global}->{$type}}, ++ $extension ++ ); ++ } ++} ++ ++sub _individual_report { ++ my ($self, $resultset, $type, $columns, $links, $maintainer) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ], ++ { maintainer => [ $maintainer ] } ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type individual report for $maintainer", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ $maintainer ++ ); ++ ++ # create and register file ++ my $extension = $format->extension(); ++ $self->_write_file( ++ "$self->{_to}/$maintainer/$type.$extension", ++ $content ++ ); ++ push( ++ @{$self->{_files}->{maintainers}->{$maintainer}->{$type}}, ++ $extension ++ ); ++ } ++} ++ ++sub _finish_report { ++ my ($self, $types, $maintainers) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ next unless $format->can('get_index'); ++ my $extension = $format->extension(); ++ print STDERR "writing global index page\n" if $self->{_verbose}; ++ $self->_write_file( ++ "$self->{_to}/index.$extension", ++ $format->get_index( ++ $self->{_time}, ++ "QA global report", ++ $self->{_files}->{global}, ++ [ keys %{$self->{_files}->{maintainers}} ], ++ ) ++ ); ++ foreach my $maintainer (@$maintainers) { ++ print STDERR "writing index page for $maintainer\n" if $self->{_verbose}; ++ ++ $self->_write_file( ++ "$self->{_to}/$maintainer/index.$extension", ++ $format->get_index( ++ $self->{_time}, ++ "QA report for $maintainer", ++ $self->{_files}->{maintainers}->{$maintainer}, ++ undef, ++ ) ++ ); ++ } ++ } ++} ++ ++sub _write_file { ++ my ($self, $file, $content) = @_; ++ ++ return unless $content; ++ ++ my $dirname = dirname($file); ++ mkpath($dirname) unless -d $dirname; ++ ++ if ($self->{_test}) { ++ *OUT = *STDOUT; ++ } else { ++ open(OUT, ">$file") or die "Can't open file $file: $!"; ++ } ++ ++ print OUT $$content; ++ ++ close(OUT) unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatHTMLpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,158 @@ ++# $Id: Mail.pm 580 2006-01-11 22:59:36Z guillomovitch $ ++package Youri::Check::Output::Mail::Format::HTML; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail::Format::HTML - Mail HTML format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::Mail> provides HTML format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use CGI; ++use base 'Youri::Check::Output::Mail::Format'; ++ ++sub type { ++ return 'text/html'; ++} ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ style => <<EOF, # css style ++h1 { ++ text-align:center; ++} ++table { ++ border-style:solid; ++ border-width:1px; ++ border-color:black; ++ width:100%; ++} ++tr.odd { ++ background-color:white; ++} ++tr.even { ++ background-color:silver; ++} ++p.footer { ++ font-size:smaller; ++ text-align:center; ++} ++EOF ++ @_ ++ ); ++ ++ $self->{_style} = $options{style}; ++ $self->{_cgi} = CGI->new(); ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $body; ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my $line; ++ my @results; ++ $body .= $self->{_cgi}->start_table(); ++ $body .= $self->{_cgi}->Tr([ ++ $self->{_cgi}->th([ ++ @$lead_columns, ++ @$columns ++ ]) ++ ]); ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $body .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ $body .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ $body .= $self->{_cgi}->end_table(); ++ ++ my $content; ++ $content .= $self->{_cgi}->start_html( ++ -title => $title, ++ -style => { code => $self->{_style} } ++ ); ++ $content .= $self->{_cgi}->h1($title); ++ $content .= $body; ++ $content .= $self->{_cgi}->hr(); ++ $content .= $self->{_cgi}->p( ++ { class => 'footer' }, ++ "Page generated $time" ++ ); ++ $content .= $self->{_cgi}->end_html(); ++ ++ return \$content; ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $links, $class, $results) = @_; ++ ++ my $content; ++ $content .= $self->{_cgi}->end_Tr(); ++ for my $i (0 .. $#$results) { ++ $content .= $self->{_cgi}->start_Tr( ++ { class => $class } ++ ); ++ if ($i == 0) { ++ # first line contains spanned cells ++ $content .= $self->{_cgi}->td( ++ { rowspan => scalar @$results }, ++ [ ++ map { $results->[$i]->{$_} } ++ @$lead_columns ++ ] ++ ); ++ } ++ $content .= $self->{_cgi}->td( ++ [ ++ map { ++ $links->{$_} && $results->[$i]->{$links->{$_}} ? ++ $self->{_cgi}->a( ++ { href => $results->[$i]->{$links->{$_}} }, ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ ) : ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ } @$columns ++ ] ++ ); ++ $content .= $self->{_cgi}->end_Tr(); ++ } ++ ++ return $content; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatTextpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,83 @@ ++# $Id: Mail.pm 580 2006-01-11 22:59:36Z guillomovitch $ ++package Youri::Check::Output::Mail::Format::Text; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail::Format::Text - Mail text format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::Mail> provides text format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Output::Mail::Format'; ++ ++sub type { ++ return 'text/plain'; ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $content; ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my @results; ++ $content .= join("\t", @$lead_columns, @$columns) . "\n"; ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ ++ return \$content; ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $results) = @_; ++ ++ my $content; ++ $content .= join( ++ "\t", ++ (map { $results->[0]->{$_} || '' } @$lead_columns), ++ (map { $results->[0]->{$_} || '' } @$columns) ++ ) . "\n"; ++ for my $i (1 .. $#$results) { ++ $content .= join( ++ "\t", ++ (map { '' } @$lead_columns), ++ (map { $results->[$i]->{$_} || '' } @$columns) ++ ) . "\n"; ++ } ++ return $content; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,66 @@ ++# $Id: Base.pm 579 2006-01-09 21:17:54Z guillomovitch $ ++package Youri::Check::Output::Mail::Format; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail::Format - Abstract mail format support ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the format support interface for ++L<Youri::Check::Output::Mail>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', ++ test => 0, ++ verbose => 0, ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_id() ++ ++Returns format handler identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,156 @@ ++# $Id: Mail.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output::Mail; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail - Report results by mail ++ ++=head1 DESCRIPTION ++ ++This plugin reports results by mail. Additional subplugins handle specific ++formats. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use MIME::Entity; ++use Youri::Utils; ++use base 'Youri::Check::Output'; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ from => '', # mail from header ++ to => '', # mail to header ++ reply_to => '', # mail reply-to header ++ mta => '', # mta path ++ noempty => 1, # don't generate empty reports ++ formats => {}, ++ @_ ++ ); ++ ++ croak "no format defined" unless $options{formats}; ++ croak "formats should be an hashref" unless ref $options{formats} eq 'HASH'; ++ ++ $self->{_from} = $options{from}; ++ $self->{_to} = $options{to}; ++ $self->{_reply_to} = $options{reply_to}; ++ $self->{_mta} = $options{mta}; ++ $self->{_noempty} = $options{noempty}; ++ ++ foreach my $id (keys %{$options{formats}}) { ++ print "Creating format $id\n" if $options{verbose}; ++ eval { ++ push( ++ @{$self->{_formats}}, ++ create_instance( ++ 'Youri::Check::Output::Mail::Format', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ %{$options{formats}->{$id}} ++ ) ++ ); ++ }; ++ print STDERR "Failed to create format $id: $@\n" if $@; ++ } ++ ++ croak "no formats created" unless @{$self->{_formats}}; ++} ++ ++sub _global_report { ++ my ($self, $resultset, $type, $columns, $links) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ] ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type global report", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ undef ++ ); ++ ++ $self->_send_mail( ++ $format->type(), ++ $self->{_to}, ++ "$type global report", ++ $content, ++ ); ++ } ++} ++ ++sub _individual_report { ++ my ($self, $resultset, $type, $columns, $links, $maintainer) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ], ++ { maintainer => [ $maintainer ] } ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type individual report for $maintainer", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ $maintainer ++ ); ++ ++ $self->_send_mail( ++ $format->type(), ++ $maintainer, ++ "$type individual report for $maintainer", ++ $content, ++ ); ++ } ++ ++} ++ ++sub _send_mail { ++ my ($self, $type, $to, $subject, $content) = @_; ++ ++ return unless $content; ++ ++ my $mail = MIME::Entity->build( ++ 'Type' => $type, ++ 'From' => $self->{_from}, ++ 'Reply-To' => $self->{_reply_to}, ++ 'To' => $to, ++ 'Subject' => $subject, ++ 'Data' => $$content ++ ); ++ ++ if ($self->{_test}) { ++ $mail->print(\*STDOUT); ++ } else { ++ open(MAIL, "| $self->{_mta} -t -oi -oem") or die "Can't open MTA program: $!"; ++ $mail->print(\*MAIL); ++ close MAIL; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,190 @@ ++# $Id: Output.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output; ++ ++=head1 NAME ++ ++Youri::Check::Output - Abstract output plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines output plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Output object. ++ ++Generic parameters (subclasses may define additional ones): ++ ++=over ++ ++=item global true/false ++ ++Global reports generation (default: true). ++ ++=item individual true/false ++ ++Individual reports generation (default: true). ++ ++=back ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', ++ test => 0, ++ verbose => 0, ++ global => 1, ++ individual => 1, ++ config => undef, ++ @_ ++ ); ++ ++ croak "Neither global nor individual reporting selected" unless $options{global} || $options{individual}; ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _global => $options{global}, ++ _individual => $options{individual}, ++ _config => $options{config} ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns plugin identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 run($resultset) ++ ++Reports the result stored in given L<Youri::Check::Resultset> object. ++ ++=cut ++ ++sub run { ++ my ($self, $resultset) = @_; ++ ++ $self->_init_report(); ++ ++ # get types and maintainers list from resultset ++ my @maintainers = $resultset->get_maintainers(); ++ my @types = $resultset->get_types(); ++ ++ foreach my $type (@types) { ++ # get formatting instructions from class ++ my $class = $self->{_config}->get($type . '_class'); ++ load($class); ++ my @columns = $class->columns(); ++ my %links = $class->links(); ++ ++ if ($self->{_global}) { ++ print STDERR "generating global report for $type\n" if $self->{_verbose}; ++ $self->_global_report( ++ $resultset, ++ $type, ++ \@columns, ++ \%links ++ ); ++ } ++ ++ if ($self->{_individual}) { ++ foreach my $maintainer (@maintainers) { ++ print STDERR "generating individual report for $type and $maintainer\n" if $self->{_verbose}; ++ ++ $self->_individual_report( ++ $resultset, ++ $type, ++ \@columns, ++ \%links, ++ $maintainer ++ ); ++ } ++ } ++ } ++ ++ $self->_finish_report(\@types, \@maintainers); ++} ++ ++sub _init_report { ++ # do nothing ++} ++ ++sub _global_report { ++ # do nothing ++} ++ ++sub _individual_report { ++ # do nothing ++} ++ ++sub _finish_report { ++ # do nothing ++} ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item run ++ ++As an alternative, the following hooks can be implemented: ++ ++=over ++ ++=item _init_report ++ ++=item _global_report ++ ++=item _individual_report ++ ++=item _finish_report ++ ++=back ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckResultsetDBIpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,372 @@ ++# $Id: Result.pm 485 2005-08-01 21:48:21Z guillomovitch $ ++package Youri::Check::Resultset::DBI; ++ ++=head1 NAME ++ ++Youri::Check::Resultset::DBI - DBI-based resultset ++ ++=head1 DESCRIPTION ++ ++This is a DBI-based L<Youri::Check::Resultset> implementation. ++ ++It can be created with any DBI-supported database. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use DBI 1.38; ++use base 'Youri::Check::Resultset'; ++ ++my %tables = ( ++ packages => { ++ id => 'SERIAL PRIMARY KEY', ++ package => 'TEXT', ++ media => 'TEXT', ++ maintainer => 'TEXT', ++ } ++); ++ ++my %queries = ( ++ add_package => ++ 'INSERT INTO packages (package, media, maintainer) VALUES (?, ?, ?)', ++ get_package_id => ++ 'SELECT id FROM packages WHERE package = ?', ++ get_maintainers => ++ 'SELECT DISTINCT(maintainer) FROM packages WHERE maintainer IS NOT NULL', ++); ++ ++=head1 CLASS METHODS ++ ++=head2 new(%hash) ++ ++Creates and returns a new Youri::Check::Resultset::DBI object. ++ ++Specific parameters: ++ ++=over ++ ++=item driver $driver ++ ++Use given string as DBI driver. ++ ++=item base $base ++ ++Use given string as database name. ++ ++=item port $port ++ ++Use given string as database port. ++ ++=item user $user ++ ++Use given string as database user. ++ ++=item pass $pass ++ ++Use given string as database password. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ driver => '', # driver ++ base => '', # base ++ port => '', # port ++ user => '', # user ++ pass => '', # pass ++ @_ ++ ); ++ ++ croak "No driver defined" unless $options{driver}; ++ croak "No base defined" unless $options{base}; ++ ++ my $datasource = "DBI:$options{driver}:dbname=$options{base}"; ++ $datasource .= ";host=$options{host}" if $options{host}; ++ $datasource .= ";port=$options{port}" if $options{port}; ++ ++ $self->{_dbh} = DBI->connect($datasource, $options{user}, $options{pass}, { ++ RaiseError => 1, ++ PrintError => 0, ++ AutoCommit => 1 ++ }) or croak "Unable to connect: $DBI::errstr"; ++ ++ $self->{_dbh}->trace($options{verbose} - 1) if $options{verbose} > 1; ++} ++ ++sub clone { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $clone = bless { ++ _test => $self->{_test}, ++ _verbose => $self->{_verbose}, ++ _resolver => $self->{_resolver}, ++ _dbh => $self->{_dbh}->clone() ++ }, ref $self; ++ ++ return $clone; ++} ++ ++sub reset { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ foreach my $table ($self->_get_tables()) { ++ my $query = "DROP TABLE $table"; ++ $self->{_dbh}->do($query); ++ } ++ ++ foreach my $table (keys %tables) { ++ $self->_create_table($table, $tables{$table}); ++ } ++} ++ ++sub _get_tables { ++ my ($self) = @_; ++ my @tables = $self->{_dbh}->tables(undef, undef, '%', 'TABLE'); ++ # unquote table name if needed ++ my $char = $self->{_dbh}->get_info(29); ++ @tables = map { substr($_, 1 , -1) } @tables if $char; ++ return @tables; ++} ++ ++sub _get_columns { ++ my ($self, $table) = @_; ++ # proper way would be to use column_info(), but unfortunatly DBD::SQLite ++ # doesn't support it :( ++ return ++ keys ++ %{$self->{_dbh}->selectrow_hashref("SELECT * from $table")}; ++} ++ ++sub _create_table { ++ my ($self, $name, $fields) = @_; ++ ++ my $query = "CREATE TABLE $name (" . ++ join(',', ++ map { "$_ $fields->{$_}" } ++ keys %$fields ++ ) . ++ ")"; ++ $self->{_dbh}->do($query); ++} ++ ++sub add_result { ++ my ($self, $type, $media, $package, $values) = @_; ++ croak "Not a class method" unless ref $self; ++ croak "No type defined" unless $type; ++ croak "No package defined" unless $package; ++ croak "No values defined" unless $values; ++ ++ my $key = "add_$type"; ++ my $sth = $self->{_sths}->{$key}; ++ ++ unless ($sth) { ++ my @fields = keys %$values; ++ $self->_create_table($type, { ++ 'package_id' => 'INT', ++ map { $_ => 'TEXT' } @fields ++ }); ++ my $query = "INSERT INTO $type (" . ++ join(',', 'package_id', @fields) . ++ ") VALUES (" . ++ join(',', '?', map { '?' } @fields) . ++ ")"; ++ $sth = $self->{_dbh}->prepare($query); ++ $self->{_sths}->{$key} = $sth; ++ } ++ ++ print "adding result for type $type and package $package\n" ++ if $self->{_verbose} > 0; ++ ++ $sth->execute( ++ $self->_get_package_id( ++ $package->get_canonical_name(), ++ $media->get_name(), ++ ), ++ values %$values ++ ); ++} ++ ++sub get_types { ++ my ($self) = @_; ++ ++ return ++ grep { ! $tables{$_} } ++ $self->_get_tables(); ++} ++ ++sub get_maintainers { ++ my ($self) = @_; ++ ++ return $self->_get_multiple_values('get_maintainers'); ++} ++ ++sub get_iterator { ++ my ($self, $id, $sort, $filter) = @_; ++ ++ die 'No id given, aborting' ++ unless $id; ++ die 'sort should be an arrayref' ++ if $sort and ref $sort ne 'ARRAY'; ++ die 'filter should be an hashref' ++ if $filter and ref $filter ne 'HASH'; ++ ++ my $query = $self->_get_iterator_query($id, $sort, $filter); ++ ++ my $sth = $self->{_dbh}->prepare($query); ++ $sth->execute(); ++ ++ return Youri::Check::Resultset::DBI::Iterator->new($sth); ++} ++ ++sub _get_iterator_query { ++ my ($self, $table, $sort, $filter) = @_; ++ ++ my @fields = ++ grep { ! /package_id/ } ++ $self->_get_columns($table); ++ ++ my $query = "SELECT DISTINCT " . ++ join(',', qw/package media maintainer/, @fields) . ++ " FROM $table, packages" . ++ " WHERE packages.id = $table.package_id"; ++ ++ if ($filter) { ++ foreach my $column (keys %{$filter}) { ++ foreach my $value (@{$filter->{$column}}) { ++ $query .= " AND $column = " . $self->{_dbh}->quote($value); ++ } ++ } ++ } ++ ++ if ($sort) { ++ $query .= " ORDER BY " . join(', ', @{$sort}); ++ } ++ ++ return $query; ++} ++ ++sub _get_package_id { ++ my ($self, $package, $media) = @_; ++ ++ my $id = $self->_get_single_value( ++ 'get_package_id', ++ $package ++ ); ++ $id = $self->_add_package($package, $media) unless $id; ++ ++ return $id; ++} ++ ++sub _add_package { ++ my ($self, $package, $media) = @_; ++ ++ my $maintainer = $self->{_resolver} ? ++ $self->{_resolver}->get_maintainer($package) : ++ undef; ++ ++ my $sth = ++ $self->{_sths}->{add_package} ||= ++ $self->{_dbh}->prepare($queries{add_package}); ++ ++ $sth->execute( ++ $package, ++ $media, ++ $maintainer ++ ); ++ ++ my $id = $self->{_dbh}->last_insert_id(undef, undef, 'packages', 'id'); ++ ++ return $id; ++} ++ ++sub _get_single_value { ++ my ($self, $query, @values) = @_; ++ ++ my $sth = ++ $self->{_sths}->{$query} ||= ++ $self->{_dbh}->prepare($queries{$query}); ++ ++ $sth->execute(@values); ++ ++ my @row = $sth->fetchrow_array(); ++ return @row ? $row[0]: undef; ++} ++ ++sub _get_multiple_values { ++ my ($self, $query, @values) = @_; ++ ++ my $sth = ++ $self->{_sths}->{$query} ||= ++ $self->{_dbh}->prepare($queries{$query}); ++ ++ $sth->execute(@values); ++ ++ my @results; ++ while (my @row = $sth->fetchrow_array()) { ++ push @results, $row[0]; ++ } ++ return @results; ++} ++ ++# close database connection ++sub DESTROY { ++ my ($self) = @_; ++ ++ foreach my $sth (values %{$self->{_sths}}) { ++ $sth->finish() if $sth; ++ } ++ ++ # warning, may be called before _dbh is created ++ $self->{_dbh}->disconnect() if $self->{_dbh}; ++} ++ ++package Youri::Check::Resultset::DBI::Iterator; ++ ++sub new { ++ my ($class, $sth) = @_; ++ ++ my $self = bless { ++ _sth => $sth, ++ _queue => [] ++ }, $class; ++ ++ return $self; ++} ++ ++sub has_results { ++ my ($self) = @_; ++ ++ return 1 if @{$self->{_queue}}; ++ ++ push( ++ @{$self->{_queue}}, ++ $self->{_sth}->fetchrow_hashref() ++ ); ++ ++ return defined $self->{_queue}->[-1]; ++} ++ ++sub get_result { ++ my ($self) = @_; ++ ++ return @{$self->{_queue}} ? ++ shift @{$self->{_queue}}: ++ $self->{_sth}->fetchrow_hashref(); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckResultsetIteratorpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,22 @@ ++# $Id: Base.pm 483 2005-08-01 21:39:05Z guillomovitch $ ++package Youri::Check::Resultset::Iterator; ++ ++=head1 INSTANCE METHODS ++ ++=head2 has_results() ++ ++Returns true if results are available. ++ ++=head2 get_result() ++ ++Returns next available result, as an field => value hash reference. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckResultsetpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,116 @@ ++# $Id: Base.pm 483 2005-08-01 21:39:05Z guillomovitch $ ++package Youri::Check::Resultset; ++ ++=head1 NAME ++ ++Youri::Check::Resultset - Abstract resultset ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Check::Resultset interface ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Scalar::Util qw/blessed/; ++use Youri::Utils; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%hash) ++ ++Creates and returns a new Youri::Check::Resultset object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ my %options = ( ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ resolver => undef, # maintainer resolver, ++ mode => 'output', # access mode ++ @_ ++ ); ++ ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my $self = bless { ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _resolver => $options{resolver}, ++ _mode => $options{mode} ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 set_resolver() ++ ++Set L<Youri::Check::Maintainer::Resolver> object used to resolve package ++maintainers. ++ ++=cut ++ ++sub set_resolver { ++ my ($self, $resolver) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ croak "resolver should be a Youri::Check::Maintainer::Resolver object" ++ unless blessed $resolver && ++ $resolver->isa("Youri::Check::Maintainer::Resolver"); ++ ++ $self->{_resolver} = $resolver; ++} ++ ++=head2 clone() ++ ++Clone resultset object. ++ ++=head2 reset() ++ ++Reset resultset object, by deleting all contained results. ++ ++=head2 add_result($type, $media, $package, $values) ++ ++Add given hash reference as a new result for given type and L<Youri::Package> object. ++ ++=head2 get_maintainers() ++ ++Returns the list of all maintainers with results. ++ ++=head2 get_iterator($id, $sort, $filter) ++ ++Returns a L<Youri::Check::Resultset::Iterator> object over results for given input it, with optional sort and filter directives. ++ ++sort must be an arrayref of column names, such as [ 'package' ]. ++ ++filter must be a hashref of arrayref of acceptables values indexed by column names, such as { level => [ 'warning', 'error'] }. ++ ++=head1 SUBCLASSING ++ ++All instances methods have to be implemented. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriConfigpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Config.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Config.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Config.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,202 @@ ++# $Id: Config.pm 1709 2006-10-16 16:33:43Z warly $ ++package Youri::Config; ++ ++=head1 NAME ++ ++Youri::Application - Youri application handler ++ ++=head1 SYNOPSIS ++ ++ use Youri::Application; ++ ++ my $app = Youri::Application->new( ++ options => { ++ help => '|h!' ++ }, ++ directories => [ '/etc/youri', "$ENV{HOME}/.youri" ], ++ file => 'app.conf', ++ ); ++ ++ # get command line argument ++ my $foo = $app->get_arg('foo'); ++ ++ # get configuration file parameter ++ my $bar = $app->get_param('bar'); ++ ++=head1 DESCRIPTION ++ ++This class handle configuration for all YOURI applications. ++ ++The command line specification is used to manage arguments through ++Getopt::Long. Unless B<--config> argument is given, the list of directories is ++then scanned for a file with given name, and halt as soon as it find one. If no ++readable file is found, an exception is thrown. The file is then processed ++through YAML::AppConfig. If parsing fails, an exception is thrown. ++ ++=head1 CONFIGURATION FILE FORMAT ++ ++=head2 SHARED KEYS ++ ++In addition to the application-specific optional or mandatory parameters, all ++YOURI applications support the following optional top-level parameters: ++ ++=over ++ ++=item B<includes> ++ ++A list of additional configuration files. ++ ++=item B<foo> ++ ++An arbitrary variable, usable everywhere else in the file. ++ ++=back ++ ++=head2 PLUGIN DEFINITION ++ ++All YOURI application heavily rely on plugins defined in their configuration ++files. A plugin definition is composed from the following parameters: ++ ++=over ++ ++=item B<class> ++ ++The class of this plugin. ++ ++=item B<options> ++ ++The options of this plugin. ++ ++=back ++ ++=head1 SEE ALSO ++ ++YAML::AppConfig, Getopt::Long ++ ++=cut ++ ++use strict; ++use warnings; ++use YAML::AppConfig; ++use Getopt::Long; ++use File::Spec; ++use Pod::Usage; ++use Carp; ++ ++sub new { ++ my ($class, %options) = @_; ++ ++ ++ # command line arguments ++ my $args = { ++ verbose => 0 ++ }; ++ my @args; ++ if ($options{args}) { ++ while (my ($arg, $spec) = each %{$options{args}}) { ++ push(@args, ($arg . $spec) => \$args->{$arg}); ++ } ++ } ++ push(@args, ++ 'config=s' => \$args->{config}, ++ 'h|help' => \$args->{help}, ++ 'v|verbose+' => \$args->{verbose} ++ ); ++ GetOptions(@args); ++ ++ if ($args->{help}) { ++ if (!@ARGV) { ++ # standard help, available immediatly ++ my $filename = (caller)[1]; ++ pod2usage( ++ -input => $filename, ++ -verbose => 0 ++ ); ++ } ++ } ++ ++ # config files parameters ++ ++ # find configuration file to use ++ my $main_file; ++ if ($args->{config}) { ++ if (! -f $args->{config}) { ++ croak "Non-existing file $args->{config}"; ++ } elsif (! -r $args->{config}) { ++ croak "Non-readable file $args->{config}"; ++ } else { ++ $main_file = $args->{config}; ++ } ++ } else { ++ foreach my $directory (@{$options{directories}}) { ++ my $file = "$directory/$options{file}"; ++ next unless -f $file && -r $file; ++ $main_file = $file; ++ last; ++ } ++ croak 'No config file found, aborting' unless $main_file; ++ } ++ ++ my $params; ++ eval { ++ $params = YAML::AppConfig->new(file => $main_file); ++ }; ++ if ($@) { ++ croak "Invalid configuration file $main_file, aborting"; ++ } ++ ++ # process inclusions ++ my $includes = $params->get('includes'); ++ if ($includes) { ++ foreach my $include_file (@{$includes}) { ++ # convert relative path to absolute ones ++ $include_file = File::Spec->rel2abs( ++ $include_file, (File::Spec->splitpath($main_file))[1] ++ ); ++ ++ if (! -f $include_file) { ++ warn "Non-existing file $include_file, skipping"; ++ } elsif (! -r $include_file) { ++ warn "Non-readable file $include_file, skipping"; ++ } else { ++ eval { ++ $params->merge(file => $include_file); ++ }; ++ if ($@) { ++ carp "Invalid included configuration file $include_file, skipping"; ++ } ++ } ++ } ++ } ++ ++ my $self = bless { ++ _args => $args, ++ _params => $params ++ }, $class; ++ ++ return $self; ++} ++ ++sub get_arg { ++ my ($self, $arg) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_args}->{$arg}; ++} ++ ++sub get_param { ++ my ($self, $param) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_params}->get($param); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriMediaURPMpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,273 @@ ++# $Id: URPM.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Media::URPM; ++ ++=head1 NAME ++ ++Youri::Media::URPM - URPM-based media implementation ++ ++=head1 DESCRIPTION ++ ++This is an URPM-based L<Youri::Media> implementation. ++ ++It can be created either from local or remote full (hdlist) or partial ++(synthesis) compressed header files, or from a package directory. File-based ++inputs are only usable with this latest option. ++ ++=cut ++ ++use URPM; ++use File::Find; ++use File::Temp (); ++use Youri::Utils; ++use LWP::Simple; ++use Carp; ++use strict; ++use warnings; ++use Youri::Package::URPM; ++ ++use base 'Youri::Media'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Media::URPM object. ++ ++Specific parameters: ++ ++=over ++ ++=item synthesis $synthesis ++ ++Path, URL or list of path or URL of synthesis file used for creating ++this media. If a list is given, the first successfully accessed will be used, ++so as to allow better reliability. ++ ++=item hdlist $hdlist ++ ++Path, URL or list of path or URL of hdlist file used for creating ++this media. If a list is given, the first successfully accessed will be used, ++so as to allow better reliability. ++ ++=item path $path ++ ++Path or list of pathes of package directory used for creating this ++media. If a list is given, the first successfully accessed will be used, so as ++to allow better reliability. ++ ++=item max_age $age ++ ++Maximum age of packages for this media. ++ ++=item rpmlint_config $file ++ ++rpmlint configuration file for this media. ++ ++=back ++ ++In case of multiple B<synthesis>, B<hdlist> and B<path> options given, they ++will be tried in this order, so as to minimize parsing time. ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ ++ my %options = ( ++ hdlist => '', # hdlist from which to create this media ++ synthesis => '', # synthesis from which to create this media ++ path => '', # directory from which to create this media ++ max_age => '', # maximum build age for packages ++ rpmlint_config => '', # rpmlint configuration for packages ++ @_ ++ ); ++ ++ my $urpm = URPM->new(); ++ SOURCE: { ++ if ($options{synthesis}) { ++ foreach my $file ( ++ ref $options{synthesis} eq 'ARRAY' ? ++ @{$options{synthesis}} : ++ $options{synthesis} ++ ) { ++ print "Attempting to retrieve synthesis $file\n" ++ if $options{verbose}; ++ my $synthesis = $self->_get_file($file); ++ if ($synthesis) { ++ $urpm->parse_synthesis($synthesis, keep_all_tags => 1); ++ last SOURCE; ++ } ++ } ++ } ++ ++ if ($options{hdlist}) { ++ foreach my $file ( ++ ref $options{hdlist} eq 'ARRAY' ? ++ @{$options{hdlist}} : ++ $options{hdlist} ++ ) { ++ print "Attempting to retrieve hdlist $file\n" ++ if $options{verbose}; ++ my $hdlist = $self->_get_file($file); ++ if ($hdlist) { ++ $urpm->parse_hdlist($hdlist, keep_all_tags => 1); ++ last SOURCE; ++ } ++ } ++ } ++ ++ if ($options{path}) { ++ foreach my $path ( ++ ref $options{path} eq 'ARRAY' ? ++ @{$options{path}} : ++ $options{path} ++ ) { ++ print "Attempting to scan directory $path\n" ++ if $options{verbose}; ++ unless (-d $path) { ++ carp "non-existing directory $path"; ++ next; ++ } ++ unless (-r $path) { ++ carp "non-readable directory $path"; ++ next; ++ } ++ ++ my $parse = sub { ++ return unless -f $File::Find::name; ++ return unless -r $File::Find::name; ++ return unless /\.rpm$/; ++ ++ $urpm->parse_rpm($File::Find::name, keep_all_tags => 1); ++ }; ++ ++ find($parse, $path); ++ last SOURCE; ++ } ++ } ++ ++ croak "no source specified"; ++ } ++ ++ $self->{_urpm} = $urpm; ++ $self->{_path} = $options{path}; ++ $self->{_max_age} = $options{max_age}; ++ $self->{_rpmlint_config} = $options{rpmlint_config}; ++ ++ return $self; ++} ++ ++sub _remove_all_archs { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $self->{_urpm}->{depslist} = []; ++} ++ ++sub _remove_archs { ++ my ($self, $skip_archs) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $urpm = $self->{_urpm}; ++ $urpm->{depslist} = [ ++ grep { ! $skip_archs->{$_->arch()} } @{$urpm->{depslist}} ++ ]; ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 max_age() ++ ++Returns maximum age of packages for this media. ++ ++=cut ++ ++sub max_age { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_max_age}; ++} ++ ++=head2 rpmlint_config() ++ ++Returns rpmlint configuration file for this media. ++ ++=cut ++ ++sub rpmlint_config { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_rpmlint_config}; ++} ++ ++sub get_package_class { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return "Youri::Package::URPM"; ++} ++ ++sub traverse_files { ++ my ($self, $function) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $callback = sub { ++ return unless -f $File::Find::name; ++ return unless -r $File::Find::name; ++ return unless $_ =~ /\.rpm$/; ++ ++ my $package = Youri::Package::URPM->new(file => $File::Find::name); ++ return if $self->{_skip_archs}->{$package->get_arch()}; ++ ++ $function->($File::Find::name, $package); ++ }; ++ ++ find($callback, $self->{_path}); ++} ++ ++sub traverse_headers { ++ my ($self, $function) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $self->{_urpm}->traverse(sub { ++ local $_; # workaround mysterious problem between URPM and AppConfig ++ $function->(Youri::Package::URPM->new(header => $_[0])); ++ }); ++ ++} ++ ++sub _get_file { ++ my ($self, $file) = @_; ++ ++ if ($file =~ /^(?:http|ftp):\/\/.*$/) { ++ my $tempfile = File::Temp->new(); ++ my $status = getstore($file, $tempfile->filename()); ++ unless (is_success($status)) { ++ carp "invalid URL $file: $status"; ++ return; ++ } ++ return $tempfile; ++ } else { ++ unless (-f $file) { ++ carp "non-existing file $file"; ++ return; ++ } ++ unless (-r $file) { ++ carp "non-readable file $file"; ++ return; ++ } ++ return $file; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriMediapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Media.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Media.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Media.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,311 @@ ++# $Id: Media.pm 1710 2006-10-16 16:35:11Z warly $ ++package Youri::Media; ++ ++=head1 NAME ++ ++Youri::Media - Abstract media class ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Media interface. ++ ++=cut ++ ++use Carp; ++use strict; ++use warnings; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Media object. ++ ++Generic parameters: ++ ++=over ++ ++=item id $id ++ ++Media id. ++ ++=item name $name ++ ++Media name. ++ ++=item type $type (source/binary) ++ ++Media type. ++ ++=item test true/false ++ ++Test mode (default: false). ++ ++=item verbose true/false ++ ++Verbose mode (default: false). ++ ++=item allow_deps $media_ids ++ ++list of ids of medias allowed to provide dependencies. ++ ++=item skip_tests $test_ids ++ ++list of ids of test plugins to skip. ++ ++=item skip_archs $arches ++ ++list of arches to skip. ++ ++=back ++ ++Subclass may define additional parameters. ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ name => '', # media name ++ canonical_name => '', # media canonical name ++ type => '', # media type ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ allow_deps => undef, # list of media ids from which deps are allowed ++ allow_srcs => undef, # list of media ids from which packages can be built ++ skip_tests => undef, # list of tests ids to skip ++ skip_archs => undef, # list of archs for which to skip tests ++ @_ ++ ); ++ ++ ++ croak "No type given" unless $options{type}; ++ croak "Wrong value for type: $options{type}" ++ unless $options{type} =~ /^(?:binary|source)$/o; ++ ++ # some options need to be arrays. Check it and convert to hashes ++ foreach my $option (qw(allow_deps allow_srcs skip_archs skip_tests)) { ++ next unless defined $options{$option}; ++ croak "$option should be an arrayref" unless ref $options{$option} eq 'ARRAY'; ++ $options{$option} = { ++ map { $_ => 1 } @{$options{$option}} ++ }; ++ } ++ ++ my $self = bless { ++ _id => $options{id}, ++ _name => $options{name} || $options{id}, ++ _type => $options{type}, ++ _allow_deps => $options{allow_deps}, ++ _allow_srcs => $options{allow_srcs}, ++ _skip_archs => $options{skip_archs}, ++ _skip_tests => $options{skip_tests}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ # remove unwanted archs ++ if ($options{skip_archs}->{all}) { ++ $self->_remove_all_archs() ++ } elsif ($options{skip_archs}) { ++ $self->_remove_archs($options{skip_archs}); ++ } ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns media identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 get_name() ++ ++Returns the name of this media. ++ ++=cut ++ ++sub get_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_name}; ++} ++ ++=head2 get_type() ++ ++Returns the type of this media. ++ ++=cut ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_type}; ++} ++ ++=head2 allow_deps() ++ ++Returns the list of id of medias allowed to provide dependencies for this ++media. ++ ++=cut ++ ++sub allow_deps { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_allow_deps}}; ++} ++ ++=head2 allow_dep($media_id) ++ ++Tells wether media with given id is allowed to provide dependencies for ++this media. ++ ++=cut ++ ++sub allow_dep { ++ my ($self, $dep) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_allow_deps}->{all} || ++ $self->{_allow_deps}->{$dep}; ++} ++ ++=head2 allow_srcs() ++ ++Returns the list medias where the source packages can be ++ ++=cut ++ ++sub allow_srcs { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_allow_srcs}}; ++} ++ ++=head2 allow_src($media_id) ++ ++Tells wether media with given id is allowed to host sources dependencies for ++this media. ++ ++=cut ++ ++sub allow_src { ++ my ($self, $src) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_allow_srcs}->{all} || $self->{_allow_srcs}->{$src}; ++} ++ ++=head2 skip_archs() ++ ++Returns the list of arch which are to be skipped for this media. ++ ++=cut ++ ++sub skip_archs { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_skip_archs}}; ++} ++ ++=head2 skip_arch($arch) ++ ++Tells wether given arch is to be skipped for this media. ++ ++=cut ++ ++sub skip_arch { ++ my ($self, $arch) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_skip_archs}->{all} || ++ $self->{_skip_archs}->{$arch}; ++} ++ ++=head2 skip_tests() ++ ++Returns the list of id of test which are to be skipped for this media. ++ ++=cut ++ ++sub skip_tests { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_skip_tests}}; ++} ++ ++=head2 skip_test($test_id) ++ ++Tells wether test with given id is to be skipped for this media. ++ ++=cut ++ ++sub skip_test { ++ my ($self, $test) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_skip_tests}->{all} || ++ $self->{_skip_tests}->{$test}; ++} ++ ++=head2 get_package_class() ++ ++Return package class for this media. ++ ++=head2 traverse_files($function) ++ ++Apply given function to all files of this media. ++ ++=head2 traverse_headers($function) ++ ++Apply given function to all headers of this media. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item traverse_headers ++ ++=item traverse_files ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageRPMpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,58 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Package/URPM.pm 2257 2006-07-05T09:22:47.088572Z guillaume $ ++package Youri::Package::RPM; ++ ++=head1 NAME ++ ++Youri::Package::RPM - Base class for all RPM-based package implementation ++ ++=head1 DESCRIPTION ++ ++This bases class factorize code between various RPM-based package ++implementation. ++ ++=cut ++ ++use strict; ++use warnings; ++use base 'Youri::Package'; ++use Carp; ++ ++sub get_pattern { ++ my ($class, $name, $version, $release, $arch) = @_; ++ ++ return ++ ($name ? quotemeta($name) : '[\w-]+' ). ++ '-' . ++ ($version ? quotemeta($version) : '[^-]+' ). ++ '-' . ++ ($release ? quotemeta($release) : '[^-]+' ). ++ '\.' . ++ ($arch ? quotemeta($arch) : '\w+' ). ++ '\.rpm'; ++} ++ ++sub as_file { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_file}; ++} ++ ++sub is_debug { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name = $self->get_name(); ++ my $group = $self->get_tag('group'); ++ ++ # debug packages' names must end in -debug, except kernel ++ if ($group =~ m,^Development/Debug$, && ++ ($name =~ /-debug$/o || $name =~ /^kernel-.*-debug/o)) { ++ return 1; ++ } ++ else { ++ return 0; ++ } ++} ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageRPM4pm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,424 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Package/URPM.pm 2129 2006-06-23T09:41:01.599329Z guillomovitch $ ++package Youri::Package::RPM4; ++ ++=head1 NAME ++ ++Youri::Package::RPM4 - URPM-based rpm package implementation ++ ++=head1 DESCRIPTION ++ ++This is an RPM4-based L<Youri::Package> implementation for rpm. ++ ++=cut ++ ++use strict; ++use warnings; ++use Carp; ++use RPM4; ++use RPM4::Header; ++use RPM4::Sign; ++use File::Spec; ++use Scalar::Util qw/refaddr/; ++use base 'Youri::Package::RPM'; ++use overload ++ '""' => 'as_string', ++ '0+' => '_to_number', ++ fallback => 1; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package::RPM4 object. ++ ++Specific parameters: ++ ++=over ++ ++=item file $file ++ ++Path of file to use for creating this package. ++ ++=item header $header ++ ++L<RPM4::Header> object to use for creating this package. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ my $header; ++ HEADER: { ++ if (exists $options{header}) { ++ croak "undefined header" ++ unless $options{header}; ++ croak "invalid header" ++ unless $options{header}->isa('RPM4::Header'); ++ $header = $options{header}; ++ last HEADER; ++ } ++ ++ if (exists $options{file}) { ++ croak "undefined file" ++ unless $options{file}; ++ croak "non-existing file $options{file}" ++ unless -f $options{file}; ++ croak "non-readable file $options{file}" ++ unless -r $options{file}; ++ $header = RPM4::Header->new($options{file}); ++ croak "Can't get header from file $options{file}" if (!$header); ++ ++ last HEADER; ++ } ++ ++ croak "no way to extract header from arguments"; ++ } ++ ++ $self->{_header} = $header; ++ $self->{_file} = File::Spec->rel2abs($options{file}); ++} ++ ++sub compare_versions { ++ my ($class, $version1, $version2) = @_; ++ ++ return RPM4::rpmvercmp($version1, $version2); ++} ++ ++sub _depsense2flag { ++ my ($string) = @_; ++ my @flags = 0; ++ push(@flags, 'EQUAL') if ($string =~ /=/); ++ push(@flags, 'LESS') if ($string =~ /</); ++ push(@flags, 'GREATER') if ($string =~ />/); ++ return \@flags; ++} ++ ++sub check_ranges_compatibility { ++ my ($class, $range1, $range2) = @_; ++ my @deps1 = split(/ /, $range1); ++ my @deps2 = split(/ /, $range2); ++ $deps1[1] = _depsense2flag($range1); ++ $deps2[1] = _depsense2flag($range2); ++ my $dep1 = RPM4::Header::Dependencies( ++ "PROVIDENAME", ++ \@deps1, ++ ); ++ my $dep2 = RPM4::Header::Dependencies( ++ "PROVIDENAME", ++ \@deps2, ++ ); ++ ++ return $dep1->overlap($dep2); ++} ++ ++sub get_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('name'); ++} ++ ++sub get_version { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('version'); ++} ++ ++sub get_release { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('release'); ++} ++ ++sub get_revision { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%|EPOCH?{%{EPOCH}:}:{}|%{VERSION}-%{RELEASE}'); ++} ++ ++sub get_file_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%{NAME}-%{VERSION}-%{RELEASE}.%|SOURCERPM?{%{ARCH}}:{src}|.rpm'); ++} ++ ++ ++sub get_arch { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%|SOURCERPM?{%{ARCH}}:{src}|'); ++} ++ ++sub get_url { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('url'); ++} ++ ++sub get_summary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('summary'); ++} ++ ++sub get_description { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('description'); ++} ++ ++sub get_packager { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('packager'); ++} ++ ++sub is_source { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->issrc(); ++} ++ ++sub is_binary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return !$self->{_header}->issrc(); ++} ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_header}->issrc() ? ++ "source" : ++ "binary"; ++} ++ ++sub get_age { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('buildtime'); ++} ++ ++sub get_source_package { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('sourcerpm'); ++} ++ ++sub get_canonical_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $self->{_header}->sourcerpmname() =~ /^(\S+)-[^-]+-[^-]+\.src\.rpm$/; ++ return $1; ++} ++ ++sub get_tag { ++ my ($self, $tag) = @_; ++ croak "Not a class method" unless ref $self; ++ #croak "invalid tag $tag" unless $self->{_header}->can($tag); ++ return $self->{_header}->tag($tag); ++} ++ ++ ++sub _get_dependencies { ++ my ($self, $deptype) = @_; ++ my $deps = $self->{_header}->dep($deptype); ++ my @deps_list; ++ if ($deps) { ++ $deps->init(); ++ while ($deps->next() >= 0) { ++ my @deps = $deps->info(); ++ $deps[1] =~ m/^rpmlib\(/ and next; # skipping internal rpmlib dep ++ $deps[2] =~ s/^=$/==/; # rpm say foo = 1, not foo == 1, == come from URPM, which sucks ++ my $range = $deps[3] ? ($deps[2] . ' ' . $deps[3]) : undef; ++ push(@deps_list, [ $deps[1], $range ]); ++ } ++ } ++ @deps_list ++} ++ ++sub get_requires { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('REQUIRENAME'); ++} ++ ++sub get_provides { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('PROVIDENAME'); ++} ++ ++sub get_obsoletes { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('OBSOLETENAME'); ++} ++ ++sub get_conflicts { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('CONFLICTNAME'); ++} ++ ++sub get_files { ++ my ($self) = @_; ++ ++ my $files = $self->{_header}->files(); ++ my @fileslist; ++ if ($files) { ++ $files->init(); ++ while ($files->next() >= 0) { ++ my $smode = $files->mode(); ++ my $umode = 0; ++ foreach (0..15) { # converting unsigned to signed int :\ ++ $umode |= $smode & (1 << $_); ++ } ++ push(@fileslist, [ $files->filename(), $umode, $files->md5() || '' ]); ++ } ++ } ++ @fileslist ++} ++ ++sub get_gpg_key { ++ my ($self) = @_; ++ ++ my $signature = $self->{_header}->queryformat('%{SIGGPG:pgpsig}'); ++ ++ return if $signature eq '(not a blob)'; ++ ++ my $key_id = (split(/\s+/, $signature))[-1]; ++ ++ return substr($key_id, 8); ++} ++ ++sub get_information { ++ my ($self) = @_; ++ ++ return $self->{_header}->queryformat(<<EOF); ++Name : %-27{NAME} Relocations: %|PREFIXES?{[%{PREFIXES} ]}:{(not relocatable)}| ++Version : %-27{VERSION} Vendor: %{VENDOR} ++Release : %-27{RELEASE} Build Date: %{BUILDTIME:date} ++Install Date: %|INSTALLTIME?{%-27{INSTALLTIME:date}}:{(not installed) }| Build Host: %{BUILDHOST} ++Group : %-27{GROUP} Source RPM: %{SOURCERPM} ++Size : %-27{SIZE}%|LICENSE?{ License: %{LICENSE}}| ++Signature : %|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}| ++%|PACKAGER?{Packager : %{PACKAGER}\n}|%|URL?{URL : %{URL}\n}|Summary : %{SUMMARY} ++Description :\n%{DESCRIPTION} ++EOF ++} ++ ++sub get_changes { ++ my ($self) = @_; ++ ++ my @names = $self->{_header}->tag('changelogname'); ++ my @time = $self->{_header}->tag('changelogtime'); ++ my @text = $self->{_header}->tag('changelogtext'); ++ ++ my @changes; ++ foreach my $i (0 .. $#names) { ++ $changes[$i] = [ ++ $names[$i], ++ $time[$i], ++ $text[$i], ++ ]; ++ } ++ ++ return @changes; ++} ++ ++sub get_last_change { ++ my ($self) = @_; ++ ++ return [ ++ ($self->{_header}->tag('changelogname'))[0], ++ ($self->{_header}->tag('changelogtime'))[0], ++ ($self->{_header}->tag('changelogtext'))[0], ++ ]; ++} ++ ++sub as_string { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->fullname(); ++} ++ ++sub as_formated_string { ++ my ($self, $format) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat($format); ++} ++ ++sub _to_number { ++ return refaddr($_[0]); ++} ++ ++sub compare { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->compare($package->{_header}) || 0; ++} ++ ++sub satisfy_range { ++ my ($self, $range) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->check_range_compatibility($self->get_revision(), $range); ++} ++ ++sub sign { ++ my ($self, $name, $path, $passphrase) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # check if parent directory is writable ++ my $parent = (File::Spec->splitpath($self->{_file}))[1]; ++ croak "Unsignable package, parent directory is read-only" ++ unless -w $parent; ++ ++ my $sign = RPM4::Sign->new( ++ name => $name, ++ path => $path, ++ ); ++ $sign->{passphrase} = $passphrase; ++ ++ $sign->rpmssign($self->{_file}) ++} ++ ++sub extract { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ system("rpm2cpio $self->{_file} | cpio -id >/dev/null 2>&1"); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageTestpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,151 @@ ++# $Id: /local/youri/soft/core/trunk/lib/Youri/Package/URPM.pm 2133 2006-09-20T21:40:20.575763Z guillaume $ ++package Youri::Package::Test; ++ ++=head1 NAME ++ ++Youri::Package::Test - Fake test package ++ ++=head1 DESCRIPTION ++ ++This is just a fake package object, intended for testing purposes. ++ ++=cut ++ ++use strict; ++use warnings; ++use Carp; ++use base 'Youri::Package::RPM'; ++use overload ++ '""' => 'as_string', ++ '0+' => '_to_number', ++ fallback => 1; ++ ++our $AUTOLOAD; ++ ++my @tags = qw/ ++ name ++ version ++ release ++ filename ++ arch ++ url ++ summary ++ description ++ packager ++ buildtime ++ sourcerpm ++/; ++ ++my %tags = map { $_ => 1 } @tags; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package::Test object. ++ ++Specific parameters: ++ ++=over ++ ++=item tag $tag ++ ++Use given value for given tag ++ ++=back ++ ++=cut ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ $self->{"_$_"} = $options{$_} foreach keys %options; ++} ++ ++sub get_revision { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_epoch} ? ++ "$self->{_epoch}:$self->{_version}-$self->{_release}" : ++ "$self->{_version}-$self->{_release}"; ++} ++ ++sub get_tag { ++ my ($self, $tag) = @_; ++ croak "Not a class method" unless ref $self; ++ croak "invalid tag $tag" unless $tags{$tag}; ++ return $self->{'_' . $tag}; ++} ++ ++sub is_source { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_arch} eq 'src'; ++} ++ ++sub is_binary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_arch} ne 'src'; ++} ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_arch} eq 'src' ? ++ "source" : ++ "binary"; ++} ++ ++sub get_canonical_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ if ($self->{_arch} eq 'src') { ++ return $self->{_name}; ++ } else { ++ if ($self->{_sourcerpm}) { ++ $self->{_sourcerpm} =~ /^(\S+)-[^-]+-[^-]+\.src\.rpm$/; ++ return $1; ++ } else { ++ return undef; ++ } ++ } ++} ++ ++sub as_string { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_name} ? $self->{_name} : '' . ++ '-' . ++ $self->{_version} ? $self->{_version} : '' . ++ '-' . ++ $self->{_release} ? $self->{_release} : ''; ++} ++ ++sub _to_number { ++ return refaddr($_[0]); ++} ++ ++sub AUTOLOAD { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $method = $AUTOLOAD; ++ $method =~ s/.*:://; ++ return if $method eq 'DESTROY'; ++ croak "invalid method" unless $method =~ /^get_(\w+)$/; ++ ++ my $tag = $1; ++ croak "invalid tag $tag" unless $tags{$tag}; ++ return $self->{'_' . $tag}; ++} ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageURPMpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,399 @@ ++# $Id: URPM.pm 266577 2010-03-02 14:51:24Z bogdano $ ++package Youri::Package::URPM; ++ ++=head1 NAME ++ ++Youri::Package::URPM - URPM-based rpm package implementation ++ ++=head1 DESCRIPTION ++ ++This is an URPM-based L<Youri::Package> implementation for rpm. ++ ++It is merely a wrapper over URPM::Package class, with a more structured ++interface. ++ ++=cut ++ ++use strict; ++use warnings; ++use Carp; ++use URPM; ++use File::Spec; ++use Expect; ++use Scalar::Util qw/refaddr/; ++use base 'Youri::Package::RPM'; ++use overload ++ '""' => 'as_string', ++ '0+' => '_to_number', ++ fallback => 1; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package::URPM object. ++ ++Specific parameters: ++ ++=over ++ ++=item file $file ++ ++Path of file to use for creating this package. ++ ++=item header $header ++ ++L<URPM::Package> object to use for creating this package. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ my $header; ++ HEADER: { ++ if (exists $options{header}) { ++ croak "undefined header" ++ unless $options{header}; ++ croak "invalid header" ++ unless $options{header}->isa('URPM::Package'); ++ $header = $options{header}; ++ last HEADER; ++ } ++ ++ if (exists $options{file}) { ++ croak "undefined file" ++ unless $options{file}; ++ croak "non-existing file $options{file}" ++ unless -f $options{file}; ++ croak "non-readable file $options{file}" ++ unless -r $options{file}; ++ my $urpm = URPM->new(); ++ $urpm->parse_rpm($options{file}, keep_all_tags => 1); ++ $header = $urpm->{depslist}->[0]; ++ croak "non-rpm file $options{file}" unless $header; ++ last HEADER; ++ } ++ ++ croak "no way to extract header from arguments"; ++ } ++ ++ $self->{_header} = $header; ++ $self->{_file} = File::Spec->rel2abs($options{file}); ++} ++ ++sub compare_versions { ++ my ($class, $version1, $version2) = @_; ++ ++ return URPM::rpmvercmp($version1, $version2); ++} ++ ++sub check_ranges_compatibility { ++ my ($class, $range1, $range2) = @_; ++ ++ return URPM::ranges_overlap($range1, $range2); ++} ++ ++sub get_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->name(); ++} ++ ++sub get_version { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->version(); ++} ++ ++sub get_release { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->release(); ++} ++ ++sub get_revision { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%|EPOCH?{%{EPOCH}:}:{}|%{VERSION}-%{RELEASE}'); ++} ++ ++sub get_file_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_file} || die "_file is not defined in header-only objects!\n"; ++} ++ ++sub get_arch { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->arch(); ++} ++ ++sub get_url { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->url(); ++} ++ ++sub get_summary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->summary(); ++} ++ ++sub get_description { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->description(); ++} ++ ++sub get_packager { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->packager(); ++} ++ ++sub is_source { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->arch() eq 'src'; ++} ++ ++sub is_binary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->arch() ne 'src'; ++} ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_header}->arch() eq 'src' ? ++ "source" : ++ "binary"; ++} ++ ++sub get_age { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->buildtime(); ++} ++ ++sub get_source_package { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->sourcerpm(); ++} ++ ++sub get_canonical_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ if ($self->{_header}->arch() eq 'src') { ++ return $self->{_header}->name(); ++ } else { ++ $self->{_header}->sourcerpm() =~ /^(\S+)-[^-]+-[^-]+\.src\.rpm$/; ++ return $1; ++ } ++} ++ ++sub get_tag { ++ my ($self, $tag) = @_; ++ croak "Not a class method" unless ref $self; ++ croak "invalid tag $tag" unless $self->{_header}->can($tag); ++ return $self->{_header}->$tag(); ++} ++ ++sub get_requires { ++ my ($self) = @_; ++ ++ return map { ++ $_ =~ /^([^[]+)(?:\[\*\])?(?:\[(.+)\])?$/; ++ [ $1, $2 ] ++ } $self->{_header}->requires(); ++} ++ ++sub get_provides { ++ my ($self) = @_; ++ ++ return map { ++ $_ =~ /^([^[]+)(?:\[(.+)\])?$/; ++ [ $1, $2 && $2 ne '*' ? $2 : undef ] ++ } $self->{_header}->provides(); ++} ++ ++sub get_obsoletes { ++ my ($self) = @_; ++ ++ return map { ++ $_ =~ /^([^[]+)(?:\[(.+)\])?$/; ++ [ $1, $2 && $2 ne '*' ? $2 : undef ] ++ } $self->{_header}->obsoletes(); ++} ++ ++sub get_conflicts { ++ my ($self) = @_; ++ ++ return $self->{_header}->conflicts(); ++} ++ ++sub get_files { ++ my ($self) = @_; ++ ++ my @modes = $self->{_header}->files_mode(); ++ my @md5sums = $self->{_header}->files_md5sum(); ++ ++ return map { ++ [ $_, shift @modes, shift @md5sums ] ++ } $self->{_header}->files(); ++} ++ ++sub get_gpg_key { ++ my ($self) = @_; ++ ++ my $signature = $self->{_header}->queryformat('%{SIGGPG:pgpsig}'); ++ ++ return if $signature eq '(not a blob)'; ++ ++ my $key_id = (split(/\s+/, $signature))[-1]; ++ ++ return substr($key_id, 8); ++} ++ ++sub get_information { ++ my ($self) = @_; ++ ++ return $self->{_header}->queryformat(<<EOF); ++Name : %-27{NAME} Relocations: %|PREFIXES?{[%{PREFIXES} ]}:{(not relocatable)}| ++Version : %-27{VERSION} Vendor: %{VENDOR} ++Release : %-27{RELEASE} Build Date: %{BUILDTIME:date} ++Install Date: %|INSTALLTIME?{%-27{INSTALLTIME:date}}:{(not installed) }| Build Host: %{BUILDHOST} ++Group : %-27{GROUP} Source RPM: %{SOURCERPM} ++Size : %-27{SIZE}%|LICENSE?{ License: %{LICENSE}}| ++Signature : %|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}| ++%|PACKAGER?{Packager : %{PACKAGER}\n}|%|URL?{URL : %{URL}\n}|Summary : %{SUMMARY} ++Description :\n%{DESCRIPTION} ++EOF ++} ++ ++sub get_changes { ++ my ($self) = @_; ++ ++ my @names = $self->{_header}->changelog_name(); ++ my @time = $self->{_header}->changelog_time(); ++ my @text = $self->{_header}->changelog_text(); ++ ++ my @changes; ++ foreach my $i (0 .. $#names) { ++ $changes[$i] = [ ++ $names[$i], ++ $time[$i], ++ $text[$i], ++ ]; ++ } ++ ++ return @changes; ++} ++ ++sub get_last_change { ++ my ($self) = @_; ++ ++ return [ ++ ($self->{_header}->changelog_name())[0], ++ ($self->{_header}->changelog_time())[0], ++ ($self->{_header}->changelog_text())[0], ++ ]; ++} ++ ++sub as_string { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->fullname(); ++} ++ ++sub as_formated_string { ++ my ($self, $format) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat($format); ++} ++ ++sub _to_number { ++ return refaddr($_[0]); ++} ++ ++sub compare { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->compare_pkg($package->{_header}); ++} ++ ++sub satisfy_range { ++ my ($self, $range) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->check_ranges_compatibility("== " . $self->get_revision(), $range); ++} ++ ++sub sign { ++ my ($self, $name, $path, $passphrase, $target) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # check if parent directory is writable ++ my $parent = (File::Spec->splitpath($self->{_file}))[1]; ++ croak "Unsignable package, parent directory is read-only" ++ unless -w $parent; ++ ++ # FIXME Will have to change that ++ # we sign with cooker key even fro 2007.0 because this is for testing section ++ return !system("sudo -H /root/bin/resign_cooker $self->{_file}"); ++ ++ my $command = ++ 'LC_ALL=C rpm --resign ' . $self->{_file} . ++ ' --define "_gpg_name ' . $name . '"' . ++ ' --define "_gpg_path ' . $path . '"'; ++ my $expect = Expect->spawn($command) or die "Couldn't spawn command $command: $!\n"; ++ $expect->log_stdout(0); ++ $expect->expect(20, -re => 'Enter pass phrase:'); ++ $expect->send("$passphrase\n"); ++ ++ $expect->soft_close(); ++} ++ ++sub extract { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ system("rpm2cpio $self->{_file} | cpio -id >/dev/null 2>&1"); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackagepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,336 @@ ++# $Id: Package.pm 223952 2007-06-23 13:54:13Z pixel $ ++package Youri::Package; ++ ++=head1 NAME ++ ++Youri::Package - Abstract package class ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Package interface. ++ ++=cut ++ ++use Carp; ++use strict; ++use warnings; ++ ++use constant DEPENDENCY_NAME => 0; ++use constant DEPENDENCY_RANGE => 1; ++ ++use constant FILE_NAME => 0; ++use constant FILE_MODE => 1; ++use constant FILE_MD5SUM => 2; ++ ++use constant CHANGE_AUTHOR => 0; ++use constant CHANGE_TIME => 1; ++use constant CHANGE_TEXT => 2; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package object. ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ @_ ++ ); ++ ++ my $self = bless { ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_pattern($name, $version, $release, $arch) ++ ++Returns a pattern matching a file for a package, using available informations. ++ ++=head2 compare_revisions($revision1, $revision2) ++ ++Compares two revision tokens, and returns a numeric value: ++ ++=over ++ ++=item positive if first revision is higher ++ ++=item null if both revisions are equal ++ ++=item negative if first revision is lower ++ ++=back ++ ++=head2 check_ranges_compatibility($range1, $range2) ++ ++Returns a true value if given revision ranges are compatible. ++ ++=head1 INSTANCE METHODS ++ ++=head2 as_file() ++ ++Returns the file corresponding to this package. ++ ++=head2 as_string() ++ ++Returns a string representation of this package. ++ ++=head2 as_formated_string(I<format>) ++ ++Returns a string representation of this package, formated according to ++I<format>. Format is a string, where each %{foo} token will get replaced by ++equivalent tag value. ++ ++=head2 get_name() ++ ++Returns the name of this package. ++ ++=head2 get_version() ++ ++Returns the version of this package. ++ ++=head2 get_release() ++ ++Returns the release of this package. ++ ++=head2 get_revision() ++ ++Returns the revision of this package. ++ ++=head2 get_arch() ++ ++Returns the architecture of this package. ++ ++=head2 get_file_name() ++ ++Returns the file name of this package (name-version-release.arch.extension). ++ ++=head2 is_source() ++ ++Returns true if this package is a source package. ++ ++=head2 is_binary() ++ ++Returns true if this package is a binary package. ++ ++=head2 is_debug() ++ ++Returns true if this package is a debug package. ++ ++=head2 get_type() ++ ++Returns the type (binary/source) of this package. ++ ++=head2 get_age() ++ ++Returns the age of this package ++ ++=head2 get_url() ++ ++Returns the URL of this package ++ ++=head2 get_summary() ++ ++Returns the summary of this package ++ ++=head2 get_description() ++ ++Returns the description of this package ++ ++=head2 get_packager() ++ ++Returns the packager of this package. ++ ++=head2 get_source_package() ++ ++Returns the name of the source package of this package. ++ ++=head2 get_tag($tag) ++ ++Returns the value of tag $tag of this package. ++ ++=head2 get_canonical_name() ++ ++Returns the canonical name of this package, shared by its multiple components, ++usually the one from the source package. ++ ++=head2 get_requires() ++ ++Returns the list of dependencies required by this package, each dependency ++being represented as an array reference, with the following informations: ++ ++=over ++ ++=item B<name> ++ ++Name of the dependency (index DEPENDENCY_NAME) ++ ++=item B<range> ++ ++Range of the dependency (index DEPENDENCY_RANGE) ++ ++=back ++ ++For more conveniency, fields index are available as constant in this package. ++ ++=head2 get_provides() ++ ++Returns the list of dependencies provided by this package, each dependency ++being represented as an array reference, using the same structure as previous method. ++ ++=head2 get_obsoletes() ++ ++Returns the list of other packages obsoleted by this one, each one ++being represented as an array reference, using the same structure as previous method. ++ ++=head2 get_conflicts() ++ ++Returns the list of other packages conflicting with this one. ++ ++=head2 get_files() ++ ++Returns the list of files contained in this package, each file being ++represented as an array reference, with the following informations: ++ ++=over ++ ++=item B<name> ++ ++Name of the file (index FILE_NAME). ++ ++=item B<mode> ++ ++Mode of the file (index FILE_MODE). ++ ++=item B<md5sum> ++ ++Md5sum of the file (index FILE_MD5SUM). ++ ++=back ++ ++For more conveniency, fields index are available as constant in this package. ++ ++=head2 get_gpg_key() ++ ++Returns the gpg key id of package signature. ++ ++=head2 get_information() ++ ++Returns formated informations about the package. ++ ++=head2 get_changes() ++ ++Returns the list of changes for this package, each change being ++represented as an array reference, with the following informations: ++ ++=over ++ ++=item B<author> ++ ++Author of the change (index CHANGE_AUTHOR). ++ ++=item B<time> ++ ++Time of the change (index CHANGE_TIME). ++ ++=item B<text> ++ ++Raw textual description of the change (index CHANGE_TEXT). ++ ++=back ++ ++For more conveniency, fields index are available as constant in this package. ++ ++=head2 get_last_change() ++ ++Returns the last change for this package, as as structure described before. ++ ++=head2 compare($package) ++ ++Compares ordering with other package, according to their corresponding revision ++tokens, and returns a numeric value: ++ ++=over ++ ++=item positive if this package is newer ++ ++=item null if both have same revision ++ ++=item negative if this package is older ++ ++=back ++ ++=head2 satisfy_range($range) ++ ++Returns a true value if this package revision satisfies given revision range. ++ ++=head2 sign($name, $path, $passphrase) ++ ++Signs the package with given name, keyring path and passphrase. ++ ++=head2 extract() ++ ++Extract package content in local directory. ++ ++=head1 SUBCLASSING ++ ++All instances methods have to be implemented. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++sub get_file { ++ my ($self) = @_; ++ carp "Deprecated method, use as_file now"; ++ ++ return $self->as_file(); ++} ++ ++sub get_full_name { ++ my ($self) = @_; ++ carp "Deprecated method, use as_string now"; ++ ++ return $self->as_string(); ++} ++ ++sub compare_versions { ++ my ($self, $version1, $version2) = @_; ++ carp "Deprecated method, use compare_revisions now"; ++ ++ return $self->compare_revisions($version1, $version2); ++} ++ ++sub compare_ranges { ++ my ($self, $range1, $range2) = @_; ++ carp "Deprecated method, use are_range_compatible now"; ++ ++ return $self->check_ranges_compatibility($range1, $range2); ++} ++ ++sub get_revision_name { ++ my ($self) = @_; ++ carp "Deprecated method, use as_formated_string('%name-%version-%release') now"; ++ ++ return $self->as_formated_string('%{name}-%{version}-%{release}'); ++} ++ ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositoryMandriva_uploadpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,546 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Upload/Action/RSS.pm 857 2006-01-29T10:15:43.298856Z guillaume $ ++package Youri::Repository::Mandriva_upload; ++ ++=head1 NAME ++ ++Youri::Repository::PLF - PLF repository implementation ++ ++=head1 DESCRIPTION ++ ++This module implements PLF repository. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use File::Find 'find'; ++use base qw/Youri::Repository/; ++use MDV::Distribconf::Build; ++use SVN::Client; ++ ++use constant { ++ PACKAGE_CLASS => 'Youri::Package::URPM', ++ PACKAGE_CHARSET => 'utf8' ++}; ++ ++memoize('_get_media_config'); ++ ++my %translate_arch = ( ++ i386 => 'i586', ++ sparc64 => 'sparcv9', ++); ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ noarch => 'i586', # noarch packages policy ++ src => 'i586', ++ install_root => '', ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ queue => '', ++ rejected => '', ++ @_ ++ ); ++ foreach my $var ('upload_state') { ++ $self->{"_$var"} = []; ++ foreach my $value (split ' ', $options{$var}) { ++ push @{$self->{"_$var"}}, $value ++ } ++ } ++ print "Initializing repository\n"; ++ foreach my $v ('rejected', 'svn', 'queue', 'noarch', 'install_root', 'upload_root', 'verbose') { ++ $self->{"_$v"} = $options{$v} ++ } ++ foreach my $target (@{$options{targets}}) { ++ $self->{$target} = []; ++ print "Adding $target ($options{$target}{arch})\n" if $self->{_verbose}; ++ foreach my $value (split ' ', $options{$target}{arch}) { ++ push @{$self->{_arch}{$target}}, $value; ++ push @{$self->{_extra_arches}}, $value ++ } ++ } ++ $self ++} ++ ++sub get_group_id { ++ my ($user) = @_; ++ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); ++ $year+=1900; ++ $mon++; ++ my $hostname = `hostname`; ++ my ($host) = $hostname =~ /([^.]*)/; ++ sprintf "$year%02d%02d%02d%02d%02d.$user.$host.${$}_", $mon, $mday, $hour, $min, $sec; ++} ++ ++sub get_target_arch { ++ my ($self, $target) = $_; ++ return $self->{_arch}{$target} ++} ++ ++sub set_arch_changed { ++ my ($self, $target, $arch) = @_; ++ if ($arch eq 'noarch') { ++ $self->{_arch_changed}{$_} = 1 foreach @{$self->{_arch}{$target}} ++ } elsif ($arch eq 'src') { ++ $self->{_arch_changed} = $self->{_src} ++ } else { ++ $self->{_arch_changed}{$arch} = 1 ++ } ++} ++ ++sub get_arch_changed { ++ my ($self, $target) = @_; ++ return [ keys %{$self->{_arch_changed}} ] ++} ++ ++sub set_install_dir_changed { ++ my ($self, $install_dir) = @_; ++ $self->{_install_dir_changed}{$install_dir} = 1; ++} ++ ++sub get_install_dir_changed { ++ my ($self) = @_; ++ return [ keys %{$self->{_install_dir_changed}} ]; ++} ++ ++sub _get_media_config { ++ my ($self, $target) = @_; ++ my %media; ++ my $real_target = $target; ++ $real_target =~ s/_force//; ++ foreach my $arch (@{$self->{_arch}{$target}}) { ++ my $root = "$self->{_install_root}/$real_target/$arch"; ++ my $distrib = MDV::Distribconf::Build->new($root); ++ print "Getting media config from $root\n" if $self->{_verbose}; ++ $self->{distrib}{$arch} = $distrib; ++ $distrib->loadtree or die "$root does not seem to be a distribution tree\n"; ++ $distrib->parse_mediacfg; ++ foreach my $media ($distrib->listmedia) { ++ my $rpms = $distrib->getvalue($media, 'rpms'); ++ my $debug_for = $distrib->getvalue($media, 'debug_for'); ++ my $srpms = $distrib->getvalue($media, 'srpms'); ++ my $path = $distrib->getfullpath($media, 'path'); ++ if (!$rpms) { ++ if (-d $path) { ++ print "MEDIA defining $media in $path\n" if $self->{_verbose} > 1; ++ $media{$arch}{$media} = $path ++ } else { ++ print "ERROR $path does not exist for media $media on $arch\n" ++ } ++ } else { ++ my ($media) = split ' ', $rpms; ++ if (-d $path) { ++ print "MEDIA defining SOURCE media for $media in $path\n" if $self->{_verbose} > 1; ++ $media{src}{$media} = $path ++ } else { ++ print "ERROR $path does not exist for source media $media on $arch\n" ++ } ++ } ++ } ++ } ++ \%media ++} ++ ++sub get_package_class { ++ return PACKAGE_CLASS; ++} ++ ++sub get_package_charset { ++ return PACKAGE_CHARSET; ++} ++ ++sub get_upload_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ return ++ $self->{_upload_root} . ++ "/$self->{_queue}/$target/" . ++ _get_section($self, $package, $target, $user_context, $app_context) . ++ '/' . ++ ($user_context->{prefix} ? '' : get_group_id($user_context->{user})) ++} ++ ++sub get_install_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ return $self->_get_path($package, $target, $user_context, $app_context); ++} ++ ++ ++sub get_distribution_paths { ++ my ($self, $package, $target) = @_; ++ ++ return $self->_get_distribution_paths($package, $target); ++} ++ ++sub get_archive_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ return $self->_get_path($package, $target, $user_context, $app_context); ++} ++ ++sub get_reject_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ return $self->{_rejected}; ++} ++ ++ ++sub _get_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $section = $self->_get_section($package, $target, $user_context, $app_context); ++ my $arch = $app_context->{arch} || $package->get_arch(); ++ $arch = $translate_arch{$arch} || $arch; ++ if ($arch eq 'noarch') { ++ $arch = $self->{_noarch} ++ } elsif ($arch eq 'src') { ++ return "$target/SRPMS/$section" ++ } ++ "$target/$arch/media/$section" ++} ++ ++sub _get_distribution_paths { ++ my ($self, $package, $target) = @_; ++ ++ my $arch = $package->get_arch(); ++ $arch = $translate_arch{$arch} || $arch; ++ if ($arch eq 'noarch') { ++ map { "$target/$_" } $self->get_extra_arches; ++ } elsif ($arch eq 'src') { ++ die "no way to get distribution path using a $arch package"; ++ } else { ++ "$target/$arch"; ++ } ++} ++ ++sub get_arch { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ my $arch = $package->get_arch(); ++ $arch = $translate_arch{$arch} || $arch; ++ if ($arch eq 'noarch') { ++ $arch = $self->{_noarch} ++ } ++ $arch ++} ++ ++sub get_version_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $section = $self->_get_section($package, $target, $user_context, $app_context); ++ ++ return "$self->{_module}/$section"; ++} ++ ++=head2 get_replaced_packages($package, $target, $user_context, $app_context) ++ ++Overrides parent method to add libified packages. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @replaced_packages = ++ $self->SUPER::get_replaced_packages($package, $target, $user_context, $app_context); ++ ++ # mandriva lib policy: ++ # library package names change with revision, making mandatory to ++ # duplicate older revisions search with a custom pattern ++ my $name = $package->get_name(); ++ if ($name =~ /^(lib\w+[a-zA-Z_])[\d_\.]+([-\w]*)$/) { ++ push(@replaced_packages, ++ grep { $package->compare($_) > 0 } ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $user_context, $app_context), ++ PACKAGE_CLASS->get_pattern( ++ $1 . '[\d_\.]+' . $2, # custom name pattern ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ # kernel packages have the version in the name ++ # binary dkms built for old kernels have to be removed too ++ if ($name =~ /^kernel-([^\d]*-)?([\d.]*)-(.*)$/) { # "desktop", "2.6.28", "2mnb" ++ push(@replaced_packages, ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $user_context, $app_context), ++ PACKAGE_CLASS->get_pattern( ++ '(kernel-' . $1 . '\d.*|.*-kernel-[\d.]*-' . $1 . '\d.*)', ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ return @replaced_packages; ++ ++} ++ ++sub _get_main_section { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $section = $self->_get_section($package, $target, $user_context, $app_context); ++ my ($main_section) = $section =~ m,^([^/]+),; ++ $main_section ++} ++ ++sub _get_section { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $name = $package->get_name(); ++ my $cname = $package->get_canonical_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ my $section = $user_context->{section}; ++ my $media = $self->_get_media_config($target); ++ my $arch = $package->get_arch(); ++ my $file = $package->as_file(); ++ $file =~ s,/+,/,g; # unneeded? ++ # FIXME: use $self->get_arch() ++ $arch = $self->{_noarch} if $arch eq 'noarch'; ++ $arch = $translate_arch{$arch} || $arch; ++ ++ if (!$section) { ++ $section = $self->{packages}{$file}{section}; ++ print "Section undefined, repository says it is '$section' for '$file'\n" if $self->{_verbose}; ++ } ++ if ($section && $section !~ /debug_/ && $package->is_debug()) { ++ $section = "debug_$section" ++ } ++ ++ # if have section already, check if it exists, and may return immediately ++ if ($section) { ++ print "Using requested section $section\n"; ++ if ($media->{$arch}{$section}) { ++ return $section ++ } else { ++ die "FATAL youri: unknown section $section for target $target for arch $arch\n" ++ } ++ } ++ # else, try to find section automatically ++ ++ # pattern for search of src package with specific version-release, ++ # should be searched first, because we prefer to find the precise ++ # section a package is already in ++ my $specific_source_pattern = PACKAGE_CLASS->get_pattern( ++ $cname, ++ $version, ++ $release, ++ 'src' ++ ); ++ ++ my $source_pattern = PACKAGE_CLASS->get_pattern( ++ $cname, ++ undef, ++ undef, ++ 'src' ++ ); ++ ++ # if a media has no source media configured, or if it is a debug ++ # package, we search in binary media ++ ++ # pattern for search when a binary media has no src media configured ++ my $specific_binary_pattern = PACKAGE_CLASS->get_pattern( ++ $name, ++ $version, ++ $release, ++ $arch ++ ); ++ ++ # last resort pattern: previous existing binary packages ++ my $binary_pattern = PACKAGE_CLASS->get_pattern( ++ $name, ++ undef, ++ undef, ++ $arch ++ ); ++ ++ # first try to find section for the specific version, as it is possibly already there; ++ # this is the case for when called in Youri::Submit::Action::Archive, to find the ++ # section the package got installed ++ print "Looking for package $name with version $version-$release\n"; ++ foreach my $m (keys %{$media->{$arch}}) { ++ print " .. section '$m' path '".$media->{$arch}{$m}."'\n" if $self->{_verbose}; ++ # - prefer source for non-debug packages, use binary if there is no source media configured ++ # - debug packages must be searched in binary medias, due to their ++ # src section != binary section; NOTE: should/need we search in ++ # src medias and add the 'debug_' prefix? ++ if (!$package->is_debug() && $media->{src}{$m}) { ++ next unless $self->get_files('', $media->{src}{$m}, $specific_source_pattern); ++ } else { ++ next unless $self->get_files('', $media->{$arch}{$m}, $specific_binary_pattern); ++ } ++ $section = $m; ++ last; ++ } ++ ++ # if still not found, try finding any version of the package in a ++ # /release subsection (safe default: /release is default for cooker, ++ # should be locked for released distros, and we don't risk wrongly ++ # choosing /backports, /testing, or /updates); ++ # this is the case for when called at submit, to find the section where ++ # the package already resides ++ if (!$section) { ++ # debug packages should be found by previous specific version search ++ # NOTE: as above, should/need we search here and add the 'debug_' prefix? ++ # ... probably... as at least mdv-youri-submit-force will process debug packages ++ if ($package->is_debug() && $self->{_verbose}) { ++ print "Warning: debug package $name with version $version-$release not found.\n"; ++ } ++ ++ print "Warning: Looking for any section with a package $name of any version\n"; ++ foreach my $m (keys %{$media->{$arch}}) { ++ print " .. section '$m' path '".$media->{$arch}{$m}."'\n" if $self->{_verbose}; ++ # NOTE: !$package->is_debug() test is here to prevent when above FATAL error is removed ++ next if $m !~ /release/ || ($m =~ /debug/ && !$package->is_debug()); ++ # - prefer source ++ if ($media->{src}{$m}) { ++ next unless $self->get_files('', $media->{src}{$m}, $source_pattern); ++ } else { ++ next unless $self->get_files('', $media->{$arch}{$m}, $binary_pattern); ++ } ++ $section = $m; ++ last; ++ } ++ } ++ ++ # FIXME: doing this here is wrong; this way the caller can never know if ++ # a section was actually found or not; should return undef and let the ++ # caller set a default (Note: IIRC PLF|Zarb has this right, see there) -spuk ++ print STDERR "Warning: Can't guess destination: section missing, defaulting to contrib/release\n" unless $section; ++ $section ||= 'contrib/release'; ++ ++ # next time we don't need to search everything again ++ $self->{packages}{$file}{section} = $section; ++ ++ print "Section is '$section'.\n"; ++ ++ return $section; ++} ++ ++sub get_upload_newer_revisions { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ my $name = $package->get_full_name; ++ $name =~ s/^\@\d+://; ++ my $pattern = $self->get_package_class()->get_pattern($package->get_name(), undef, undef, $arch); ++ my $media = $self->_get_media_config($target); ++ my @packages; ++ foreach my $state (@{$self->{_upload_state}}) { ++ foreach my $m (keys %{$media->{$arch}}) { ++ my $path = "$self->{_upload_root}/$state/$target/$m"; ++ print "Looking for package $package revisions for $target in $path (pattern $pattern)\n" if $self->{_verbose}; ++ find( ++ sub { ++ s/\d{14}\.[^.]*\.[^.]*\.\d+_//; ++ s/^\@\d+://; ++ return if ! /^$pattern/; ++ return if /\.info$/; ++ print "Find $_\n"; ++ push @packages, $File::Find::name if $package->check_ranges_compatibility("== $name", "< $_") ++ }, $path); ++ } ++ } ++ return ++ @packages; ++} ++ ++sub package_in_svn { ++ my ($self, $srpm_name) = @_; ++ my $ctx = new SVN::Client( ++ auth => [SVN::Client::get_simple_provider(), ++ SVN::Client::get_simple_prompt_provider(\&simple_prompt,2), ++ SVN::Client::get_username_provider()] ++ ); ++ ++ my $svn_entry = $ctx->ls("$self->{_svn}/$srpm_name", 'HEAD', 0); ++ if ($svn_entry) { ++ print "Package $srpm_name is in the SVN\n"; ++ return 1 ++ } ++} ++ ++sub get_svn_url { ++ my ($self) = @_; ++ $self->{_svn} ++} ++ ++sub get_revisions { ++ my ($self, $package, $target, $user_context, $app_context, $filter) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package revisions for $target\n" if $self->{_verbose} > 0; ++ ++ my $arch = $app_context->{arch} || $user_context->{arch} || $package->get_arch(); ++ my $media_arch = $arch eq 'noarch' ? $self->{_noarch} : $arch; ++ my $path = $arch eq 'src' ? "$target/SRPMS/" : "$target/$media_arch/media"; ++ my $media = $self->_get_section($package, $target, $user_context, $app_context); ++ my $name = $package->get_name(); ++ my @packages = map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ "$path/$media", ++ $self->get_package_class()->get_pattern( ++ $name, ++ undef, ++ undef, ++ $package->get_arch(), ++ ) ++ ); ++ ++ @packages = grep { $filter->($_) } @packages if $filter; ++ ++ return ++ sort { $b->compare($a) } # sort by revision order ++ @packages; ++} ++ ++sub reject { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ ++} ++ ++sub get_archive_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_archive_root} ++} ++ ++ ++# 20060801 warly ++# ++# Upload steps ++# SRPMS are uploaded in /home/mandrake/uploads/todo/$target/$media/group_id ++# ++# ++# ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositoryMandriva_upload_prepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,274 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Upload/Action/RSS.pm 857 2006-01-29T10:15:43.298856Z guillaume $ ++package Youri::Repository::Mandriva_upload_pre; ++ ++=head1 NAME ++ ++Youri::Repository::PLF - PLF repository implementation ++ ++=head1 DESCRIPTION ++ ++This module implements PLF repository. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use File::Find 'find'; ++use base qw/Youri::Repository/; ++use SVN::Client; ++use constant { ++ PACKAGE_CLASS => 'Youri::Package::URPM', ++ PACKAGE_CHARSET => 'utf8' ++}; ++ ++memoize('_get_section'); ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ module => 'SPECS', # CVS module ++ noarch => 'i586', # noarch packages policy ++ svn => '', ++ upload_root => '', ++ @_ ++ ); ++ ++ $self->{_module} = $options{module}; ++ $self->{_noarch} = $options{noarch}; ++ $self->{_svn} = $options{svn}; ++ $self->{_upload_root} = $options{upload_root}; ++ ++ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); ++ $year+=1900; ++ my $hostname = `hostname`; ++ my ($host) = $hostname =~ /([^.]*)/; ++ $self->{group_dir} = sprintf "$ENV{SUDO_USER}.$host.$$.$year%02d%02d%02d%02d%02d", $mon, $mday, $hour, $min, $sec; ++} ++ ++sub get_package_class { ++ return PACKAGE_CLASS; ++} ++ ++sub package_in_svn { ++ my ($self, $srpm_name) = @_; ++ my $ctx = new SVN::Client( ++ auth => [SVN::Client::get_simple_provider(), ++ SVN::Client::get_simple_prompt_provider(\&simple_prompt,2), ++ SVN::Client::get_username_provider()] ++ ); ++ ++ my $svn_entry = $ctx->ls("$self->{_svn}/", 'HEAD', 0); ++ foreach (keys %{$svn_entry}) { ++ if ($srpm_name eq $_) { ++ print "Package $_ is in the SVN\n"; ++ return 1 ++ } ++ } ++} ++ ++sub get_svn_url { ++ my ($self) = @_; ++ $self->{_svn} ++} ++ ++sub get_revisions { ++ my ($self, $package, $target, $define, $filter) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my $arch = $define->{arch} || $package->get_arch; ++ if ($arch eq 'src') { ++ $arch = 'SRPMS' ++ } else { ++ $arch .= '/media' ++ } ++ my @packages; ++ foreach my $dir ('main', 'contrib') { ++ print "Looking into $self->{_install_root}/$target/$arch/$dir/release\n"; ++ push @packages, ++ map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ "$target/$arch/$dir/release" , ++ $self->get_package_class()->get_pattern($package->get_name(),undef, undef, $arch) ++ ); ++ } ++ ++ @packages = grep { $filter->($_) } @packages if $filter; ++ ++ return ++ sort { $b->compare($a) } # sort by revision order ++ @packages; ++} ++ ++sub get_package_charset { ++ return PACKAGE_CHARSET; ++} ++ ++sub get_upload_dir { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ my $section = $self->_get_section($package, $target, $define); ++ my $media_path = $section eq 'main' ? $target : $target =~ /^cooker/ ? "contrib" : "$target/contrib"; ++ my $arch_path = $arch eq 'src' ? 'SRPMS' : 'RPMS'; ++ my $force = $target =~ /_force/ ? 'force' : ''; ++ $self->{_upload_root} . "/$media_path/$force/$arch_path/" ++} ++ ++sub get_arch { ++ my ($self, $package, $target, $define) = @_; ++ my $arch = $package->get_arch(); ++ if ($arch eq 'noarch') { ++ $arch = $self->{_noarch} ++ } ++ $arch ++} ++ ++sub get_install_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub get_archive_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub _get_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $arch = $package->get_arch; ++ if ($arch eq 'src') { ++ $arch = 'SRPMS' ++ } else { ++ $arch .= '/media' ++ } ++ my $section = $self->_get_section($package, $target, $define); ++ ++ return "$target/$arch/$section/release/"; ++} ++ ++ ++sub get_version_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section = $self->_get_section($package, $target, $define); ++ ++ return "$self->{_module}/$section/release/"; ++} ++ ++=head2 get_replaced_packages($package, $target, $define) ++ ++Overrides parent method to add libified packages. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @replaced_packages = ++ $self->SUPER::get_replaced_packages($package, $target, $define); ++ ++ # mandriva lib policy: ++ # library package names change with revision, making mandatory to ++ # duplicate older revisions search with a custom pattern ++ my $name = $package->get_name(); ++ if ($name =~ /^(lib\w+[a-zA-Z_])[\d_\.]+([-\w]*)$/) { ++ push(@replaced_packages, ++ grep { $package->compare($_) > 0 } ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $define), ++ PACKAGE_CLASS->get_pattern( ++ $1 . '[\d_\.]+' . $2, # custom name pattern ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ return @replaced_packages; ++ ++} ++ ++sub _get_section { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section; ++ ++ # try to find section automatically ++ my $arch = $package->get_arch(); ++ $arch = $self->{_noarch} if $arch eq 'noarch'; ++ ++ my $source_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_canonical_name(), ++ undef, ++ undef, ++ 'src' ++ ); ++ ++ my $binary_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_name(), ++ undef, ++ undef, ++ $arch ++ ); ++ ++ # for each potential section, try to match ++ # a suitable source patten in source directory ++ # a suitable binary patten in binary directory ++ foreach my $dir (qw/main contrib/) { ++ next unless ++ $self->get_files( ++ $self->{_install_root}, ++ "$target/SRPMS/$dir/release", ++ $source_pattern ++ ) || $self->get_files( ++ $self->{_install_root}, ++ "$target/$arch/media/$dir/release", ++ $binary_pattern ++ ); ++ print "Section is $dir\n"; ++ $section = $dir; ++ last; ++ } ++ ++ # use defined section if not found ++ $section = $define->{section} unless $section; ++ ++ $section || 'contrib' ++} ++ ++sub get_upload_newer_revisions { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ my $pattern = $self->get_package_class()->get_pattern($package->get_name(), undef, undef, $arch); ++ print "Looking for package $package revisions for $target in $self->{_upload_root} (pattern $pattern)\n"; ++ my @packages; ++ foreach my $dir ('cooker', 'contrib') { ++ find(sub { return if ! /^$pattern/; print "Find $_\n"; push @packages, $File::Find::name if $package->compare($self->get_package_class()->new(file => $File::Find::name)) <= 0 }, "$self->{_upload_root}/$dir"); ++ } ++ return ++ @packages; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositoryPLFpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,196 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Upload/Action/RSS.pm 857 2006-01-29T10:15:43.298856Z guillaume $ ++package Youri::Repository::PLF; ++ ++=head1 NAME ++ ++Youri::Repository::PLF - PLF repository implementation ++ ++=head1 DESCRIPTION ++ ++This module implements PLF repository. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use base qw/Youri::Repository/; ++use constant { ++ PACKAGE_CLASS => 'Youri::Package::URPM', ++ PACKAGE_CHARSET => 'utf8' ++}; ++ ++memoize('_get_section'); ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ module => 'SPECS', # CVS module ++ noarch => 'noarch', # noarch packages policy ++ @_ ++ ); ++ ++ $self->{_module} = $options{module}; ++ $self->{_noarch} = $options{noarch}; ++} ++ ++sub get_package_class { ++ return PACKAGE_CLASS; ++} ++ ++sub get_package_charset { ++ return PACKAGE_CHARSET; ++} ++ ++sub get_install_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub get_archive_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub _get_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section = $self->_get_section($package, $target, $define); ++ ++ my $subpath = $self->_get_subpath($package, $target); ++ ++ return "$section/$subpath"; ++} ++ ++ ++sub get_version_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section = $self->_get_section($package, $target, $define); ++ ++ return "$self->{_module}/$section"; ++} ++ ++=head2 get_replaced_packages($package, $target, $define) ++ ++Overrides parent method to add libified packages. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @replaced_packages = ++ $self->SUPER::get_replaced_packages($package, $target, $define); ++ ++ # mandriva lib policy: ++ # library package names change with revision, making mandatory to ++ # duplicate older revisions search with a custom pattern ++ my $name = $package->get_name(); ++ if ($name =~ /^(lib\w+[a-zA-Z_])[\d_\.]+([-\w]*)$/) { ++ push(@replaced_packages, ++ grep { $package->compare($_) > 0 } ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $define), ++ PACKAGE_CLASS->get_pattern( ++ $1 . '[\d_\.]+' . $2, # custom name pattern ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ return @replaced_packages; ++ ++} ++ ++sub _get_section { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section; ++ ++ # try to find section automatically ++ my $arch = $package->get_arch(); ++ ++ my $source_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_canonical_name(), ++ undef, ++ undef, ++ 'src' ++ ); ++ ++ my $binary_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_name(), ++ undef, ++ undef, ++ $arch ++ ); ++ ++ my $source_subpath = $self->_get_subpath($package, $target, 'src'); ++ my $binary_subpath = $self->_get_subpath($package, $target, $arch); ++ ++ # for each potential section, try to match ++ # a suitable source patten in source directory ++ # a suitable binary patten in binary directory ++ foreach my $dir (qw/free non-free/) { ++ next unless ++ $self->get_files( ++ $self->{_install_root}, ++ "$dir/$source_subpath", ++ $source_pattern ++ ) || $self->get_files( ++ $self->{_install_root}, ++ "$dir/$binary_subpath", ++ $binary_pattern ++ ); ++ $section = $dir; ++ last; ++ } ++ ++ # use defined section if not found ++ $section = $define->{section} unless $section; ++ ++ die "Can't guess destination: section missing" unless $section; ++ ++ return $section; ++} ++ ++sub _get_subpath { ++ my ($self, $package, $target, $arch) = @_; ++ ++ my $subpath; ++ ++ # use package arch if not specified ++ $arch = $package->get_arch() unless $arch; ++ ++ if ($arch eq 'src') { ++ $subpath = 'src'; ++ } else { ++ if ($arch eq 'noarch') { ++ $subpath = "$target/$self->{_noarch}"; ++ } else { ++ $subpath = "$target/$arch"; ++ } ++ } ++ ++ return $subpath; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositorypm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,492 @@ ++# $Id: Base.pm 631 2006-01-26 22:22:23Z guillomovitch $ ++package Youri::Repository; ++ ++=head1 NAME ++ ++Youri::Repository - Abstract repository ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Repository interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use Youri::Package; ++ ++=head1 CLASS METHODS ++ ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Repository object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ install_root => '', # path to top-level directory ++ archive_root => '', # path to top-level directory ++ version_root => '', # path to top-level directory ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ ++ croak "no install root" unless $options{install_root}; ++ croak "invalid install root" unless -d $options{install_root}; ++ ++ my $self = bless { ++ _install_root => $options{install_root}, ++ _archive_root => $options{archive_root}, ++ _version_root => $options{version_root}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_package_class() ++ ++Return package class for this repository. ++ ++=cut ++ ++sub get_package_class { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ return $self->{_package_class}; ++} ++ ++=head2 get_package_charset() ++ ++Return package charset for this repository. ++ ++=cut ++ ++sub get_package_charset { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ return $self->{_package_charset}; ++} ++ ++=head2 get_extra_arches() ++ ++Return the list of additional archictectures to handle when dealing with noarch ++packages. ++ ++=cut ++ ++sub get_extra_arches { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ return @{$self->{_extra_arches}}; ++} ++ ++ ++=head2 get_older_revisions($package, $target, $user_context, $app_context) ++ ++Get all older revisions from a package found in its installation directory, as a ++list of L<Youri::Package> objects. ++ ++=cut ++ ++sub get_older_revisions { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package older revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ return $self->get_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context, ++ sub { return $package->compare($_[0]) > 0 } ++ ); ++} ++ ++=head2 get_last_older_revision($package, $target, $user_context, $app_context) ++ ++Get last older revision from a package found in its installation directory, as a ++single L<Youri::Package> object. ++ ++=cut ++ ++sub get_last_older_revision { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package last older revision for $target\n" ++ if $self->{_verbose} > 0; ++ ++ return ( ++ $self->get_older_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ ) ++ )[0]; ++} ++ ++=head2 get_newer_revisions($package, $target, $user_context, $app_context) ++ ++Get all newer revisions from a package found in its installation directory, as ++a list of L<Youri::Package> objects. ++ ++=cut ++ ++sub get_newer_revisions { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package newer revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ return $self->get_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context, ++ sub { return $_[0]->compare($package) > 0 } ++ ); ++} ++ ++ ++=head2 get_revisions($package, $target, $user_context, $app_context, $filter) ++ ++Get all revisions from a package found in its installation directory, using an ++optional filter, as a list of L<Youri::Package> objects. ++ ++=cut ++ ++sub get_revisions { ++ my ($self, $package, $target, $user_context, $app_context, $filter) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my @packages = ++ map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ ), ++ $self->get_package_class()->get_pattern( ++ $package->get_name(), ++ undef, ++ undef, ++ $package->get_arch(), ++ ) ++ ); ++ @packages = grep { $filter->($_) } @packages if $filter; ++ ++ return ++ sort { $b->compare($a) } # sort by revision order ++ @packages; ++} ++ ++=head2 get_obsoleted_packages($package, $target, $user_context, $app_context) ++ ++Get all packages obsoleted by given one, as a list of L<Youri::Package> ++objects. ++ ++=cut ++ ++sub get_obsoleted_packages { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for packages obsoleted by $package for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my @packages; ++ foreach my $obsolete ($package->get_obsoletes()) { ++ my $pattern = $self->get_package_class()->get_pattern($obsolete->[Youri::Package::DEPENDENCY_NAME]); ++ my $range = $obsolete->[Youri::Package::DEPENDENCY_RANGE]; ++ push(@packages, ++ grep { $range ? $_->satisfy_range($range) : 1 } ++ map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path( ++ $package, $target, ++ $user_context, ++ $app_context ++ ), ++ $pattern ++ ) ++ ); ++ } ++ ++ return @packages; ++} ++ ++=head2 get_replaced_packages($package, $target, $user_context, $app_context) ++ ++Get all packages replaced by given one, as a list of L<Youri::Package> ++objects. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for packages replaced by $package for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my @list; ++ ++ # collect all older revisions ++ push(@list, $self->get_older_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ )); ++ ++ # noarch packages are potentially linked from other directories ++ if ($package->get_arch() eq 'noarch') { ++ foreach my $arch ($self->get_extra_arches()) { ++ push(@list, $self->get_older_revisions( ++ $package, ++ $target, ++ $user_context, ++ { arch => $arch } ++ )); ++ } ++ } ++ ++ # collect all obsoleted packages ++ push(@list, $self->get_obsoleted_packages( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ )); ++ ++ return @list; ++} ++ ++=head2 get_files($path, $pattern) ++ ++Get all files found in a directory, using an optional filtering pattern ++(applied to the whole file name), as a list of files. ++ ++=cut ++ ++sub get_files { ++ my ($self, $root, $path, $pattern) = @_; ++ croak "Not a class method" unless ref $self; ++ # debugging for bug 34999 ++ print "Looking for files matching $pattern in $root/$path\n"; ++# if $self->{_verbose} > 1; ++ ++ my $grep = ""; ++ $grep = "-regextype posix-egrep -regex '.*\/$pattern'" if ($pattern); ++ # XXX: run find in a directory the user is guaranteed to have read ++ # permissions! find simply exits with error if the user doesn't have ++ # read permission on the *current* dir; as this code is run thru many ++ # sudo invocations, sometimes the user calling it has $HOME chmoded to ++ # 0700, making find fail when run as mandrake ++ # debugging for bug 34999 ++ print ".. running command: find -L $root/$path $grep -type f\n"; ++ my @files = map { chop; $_; } `cd && find -L $root/$path $grep -type f`; ++ die "FATAL: get_files(): find failed!" if ($?); ++ ++ return @files; ++} ++ ++=head2 get_install_root() ++ ++Returns installation root ++ ++=cut ++ ++sub get_install_root { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_install_root}; ++} ++ ++ ++=head2 get_distribution_roots() ++ ++Returns distribution roots (ie install_root + target + arch) ++(it returns a list in case of noarch) ++ ++=cut ++ ++sub get_distribution_roots { ++ my ($self, $package, $target) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ map { ++ $self->_get_dir($self->{_install_root}, $_); ++ } $self->get_distribution_paths($package, $target); ++} ++ ++=head2 get_install_dir($package, $target, $user_context, $app_context) ++ ++Returns install destination directory for given L<Youri::Package> object ++and given target. ++ ++=cut ++ ++sub get_install_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->_get_dir( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $user_context, $app_context) ++ ); ++} ++ ++=head2 get_archive_root() ++ ++Returns archiving root ++ ++=cut ++ ++sub get_archive_root { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_archive_root}; ++} ++ ++=head2 get_archive_dir($package, $target, $user_context, $app_context) ++ ++Returns archiving destination directory for given L<Youri::Package> object ++and given target. ++ ++=cut ++ ++sub get_archive_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->_get_dir( ++ $self->{_archive_root}, ++ $self->get_archive_path($package, $target, $user_context, $app_context) ++ ); ++} ++ ++ ++=head2 get_version_root() ++ ++Returns versionning root ++ ++=cut ++ ++sub get_version_root { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_version_root}; ++} ++ ++=head2 get_version_dir($package, $target, $user_context, $app_context) ++ ++Returns versioning destination directory for given L<Youri::Package> ++object and given target. ++ ++=cut ++ ++sub get_version_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->_get_dir( ++ $self->{_version_root}, ++ $self->get_version_path($package, $target, $user_context, $app_context) ++ ); ++} ++ ++sub _get_dir { ++ my ($self, $root, $path) = @_; ++ ++ return substr($path, 0, 1) eq '/' ? ++ $path : ++ $root . '/' . $path; ++} ++ ++=head2 get_install_file($package, $target, $user_context, $app_context) ++ ++Returns install destination file for given L<Youri::Package> object and ++given target. ++ ++=cut ++ ++sub get_install_file { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->get_install_dir($package, $target, $user_context, $app_context) . ++ '/' . ++ $package->get_file_name(); ++} ++ ++=head2 get_install_path($package, $target, $user_context, $app_context) ++ ++Returns installation destination path (relative to repository root) for given ++L<Youri::Package> object and given target. ++ ++=head2 get_archive_path($package, $target, $user_context, $app_context) ++ ++Returns archiving destination path (relative to repository root) for given ++L<Youri::Package> object and given target. ++ ++=head2 get_version_path($package, $target, $user_context, $app_context) ++ ++Returns versioning destination path (relative to repository root) for given ++L<Youri::Package> object and given target. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item get_install_path ++ ++=item get_archive_path ++ ++=item get_version_path ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriUtilspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,98 @@ ++# $Id: Utils.pm 1713 2006-10-16 16:39:53Z warly $ ++package Youri::Utils; ++ ++=head1 NAME ++ ++Youri::Utils - Youri shared functions ++ ++=head1 DESCRIPTION ++ ++This module implement some helper functions for all youri applications. ++ ++=cut ++ ++use base qw(Exporter); ++use Carp; ++use strict; ++use warnings; ++ ++our @EXPORT = qw( ++ create_instance ++ load_class ++ add2hash ++ add2hash_ ++); ++ ++=head2 create_instance($class, $config, $options) ++ ++Create an instance from a plugin implementing given interface, using given ++configuration and local options. ++Returns a plugin instance, or undef if something went wrong. ++ ++=cut ++ ++sub create_instance { ++ my ($interface, $config, $options) = @_; ++ ++ croak 'No interface given' unless $interface; ++ croak 'No config given' unless $config; ++ ++ my $class = $config->{class}; ++ if (!$class) { ++ carp "No class given, can't load plugin"; ++ return; ++ } ++ ++ # ensure loaded ++ load_class($class); ++ ++ # check interface ++ if (!$class->isa($interface)) { ++ carp "$class is not a $interface"; ++ return; ++ } ++ ++ # instantiate ++ no strict 'refs'; ++ ++ return $class->new( ++ $config->{options} ? %{$config->{options}} : (), ++ $options ? %{$options} : (), ++ ); ++} ++ ++sub load_class { ++ my ($class) = @_; ++ ++ $class .= '.pm'; ++ $class =~ s/::/\//g; ++ require $class; ++} ++ ++# structure helpers ++ ++sub add2hash { ++ my ($a, $b) = @_; ++ while (my ($k, $v) = each %{$b || {}}) { ++ $a->{$k} ||= $v; ++ } ++ return $a; ++} ++ ++sub add2hash_ { ++ my ($a, $b) = @_; ++ while (my ($k, $v) = each %{$b || {}}) { ++ exists $a->{$k} or $a->{$k} = $v; ++ } ++ return $a; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunkt00distributiont">Added: build_system/mdv-youri-core/trunk/t/00distribution.t</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/t/00distribution.t (rev 0) ++++ build_system/mdv-youri-core/trunk/t/00distribution.t 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,15 @@ ++#!/usr/bin/perl ++# $Id: 00distribution.t 1179 2006-08-05 08:30:57Z warly $ ++ ++use Test::More; ++ ++BEGIN { ++ eval { ++ require Test::Distribution; ++ }; ++ if($@) { ++ plan skip_all => 'Test::Distribution not installed'; ++ } else { ++ import Test::Distribution only => [ qw/use pod description/ ]; ++ } ++} + + +Property changes on: build_system/mdv-youri-core/trunk/t/00distribution.t +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyouricoretrunktcowsay30311mdv20070noarchrpm">Added: build_system/mdv-youri-core/trunk/t/cowsay-3.03-11mdv2007.0.noarch.rpm</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/cowsay-3.03-11mdv2007.0.noarch.rpm +___________________________________________________________________ +<a id="svnmimetype">Added: svn:mime-type</a> + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktgpghomepubringgpg">Added: build_system/mdv-youri-core/trunk/t/gpghome/pubring.gpg</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/gpghome/pubring.gpg +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktgpghomesecringgpg">Added: build_system/mdv-youri-core/trunk/t/gpghome/secring.gpg</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/gpghome/secring.gpg +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktgpghometrustdbgpg">Added: build_system/mdv-youri-core/trunk/t/gpghome/trustdb.gpg</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/gpghome/trustdb.gpg +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktpackaget">Added: build_system/mdv-youri-core/trunk/t/package.t</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/t/package.t (rev 0) ++++ build_system/mdv-youri-core/trunk/t/package.t 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,482 @@ ++#!/usr/bin/perl ++# $Id: /local/youri/soft/trunk/t/version.t 2257 2006-07-05T09:22:47.088572Z guillaume $ ++ ++use Test::More; ++use Test::Exception; ++use Youri::Utils; ++use File::Temp qw/tempdir/; ++use File::Basename; ++use strict; ++ ++my @classes = qw/ ++ Youri::Package::URPM ++ Youri::Package::RPM4 ++/; ++my $dir = dirname($0); ++my $rpm = 'cowsay-3.03-11mdv2007.0.noarch.rpm'; ++my $fake_rpm = 'foobar.rpm'; ++plan(tests => 37 * scalar @classes); ++ ++foreach my $class (@classes) { ++ load_class($class); ++ ++ my $temp_dir = tempdir(CLEANUP => 1); ++ my $file = "$dir/$rpm"; ++ my $fake_file = "$temp_dir/$fake_rpm"; ++ ++ # instanciation errors ++ dies_ok { $class->new(file => undef) } 'undefined file'; ++ dies_ok { $class->new(file => $fake_file) } 'non-existant file'; ++ system('touch', $fake_file); ++ chmod 0000, $fake_file; ++ dies_ok { $class->new(file => $fake_file) } 'non-readable file'; ++ chmod 0644, $fake_file; ++ dies_ok { $class->new(file => $fake_file) } 'non-rpm file'; ++ ++ my $package = $class->new(file => $file); ++ isa_ok($package, $class); ++ ++ # tag value access ++ is($package->get_name(), 'cowsay', 'get name directly'); ++ is($package->get_tag('name'), 'cowsay', 'get name indirectly'); ++ is($package->get_version(), '3.03', 'get version directly'); ++ is($package->get_tag('version'), '3.03', 'get version indirectly'); ++ is($package->get_release(), '11mdv2007.0', 'get release directly'); ++ is($package->get_tag('release'), '11mdv2007.0', 'get release indirectly'); ++ is($package->get_arch(), 'noarch', 'get arch directly'); ++ is($package->get_tag('arch'), 'noarch', 'get arch indirectly'); ++ is($package->get_summary(), 'Configurable talking cow', 'get summary directly'); ++ is($package->get_tag('summary'), 'Configurable talking cow', 'get summary indirectly'); ++ is($package->get_url(), 'http://www.nog.net/~tony/warez/cowsay.shtml', 'get url directly'); ++ is($package->get_tag('url'), 'http://www.nog.net/~tony/warez/cowsay.shtml', 'get url indirectly'); ++ is($package->get_packager(), 'Guillaume Rousse <guillomovitch@mandriva.org>', 'get packager directly'); ++ is($package->get_tag('packager'), 'Guillaume Rousse <guillomovitch@mandriva.org>', 'get packager indirectly'); ++ is($package->get_file_name(), 'cowsay-3.03-11mdv2007.0.noarch.rpm', 'file name'); ++ is($package->get_revision(), '3.03-11mdv2007.0', 'revision'); ++ ++ # name formating ++ is($package->as_formated_string('%{name}-%{version}-%{release}'), 'cowsay-3.03-11mdv2007.0', 'formated string name'); ++ is($package->as_string(), 'cowsay-3.03-11mdv2007.0.noarch', 'default string'); ++ is($package, 'cowsay-3.03-11mdv2007.0.noarch', 'stringification'); ++ ++ # type ++ ok(!$package->is_source(), 'not a source package'); ++ ok($package->is_binary(), 'a binary package'); ++ is($package->get_type(), 'binary', 'a binary package'); ++ ++ # gpg key ++ is($package->get_gpg_key(), '26752624', 'get gpg key'); ++ ++ # dependencies ++ is_deeply( ++ [ $package->get_requires() ], ++ [ ++ [ 'perl-base', undef ], ++ [ 'perl(Cwd)', undef ], ++ [ 'perl(File::Basename)', undef ], ++ [ 'perl(Getopt::Std)', undef ], ++ [ 'perl(Text::Tabs)', undef ], ++ [ 'perl(Text::Wrap)', undef ] ++ ], ++ 'requires' ++ ); ++ is_deeply( ++ [ $package->get_provides() ], ++ [ ++ [ 'cowsay', '== 3.03-11mdv2007.0'] ++ ], ++ 'provides' ++ ); ++ is_deeply( ++ [ $package->get_obsoletes() ], ++ [ ], ++ 'obsoletes' ++ ); ++ is_deeply( ++ [ $package->get_conflicts() ], ++ [ ], ++ 'conflicts' ++ ); ++ ++ # files ++ is_deeply( ++ [ $package->get_files() ], ++ [ ++ [ ++ '/etc/bash_completion.d/cowsay', ++ 33188, ++ '6048be1dd827011c15cab0c3db1f438d' ++ ], ++ [ ++ '/usr/bin/cowsay', ++ 33261, ++ 'b405026c6040eeb4781ca5c523129fe4' ++ ], ++ [ ++ '/usr/bin/cowthink', ++ 41471, ++ '' ++ ], ++ [ ++ '/usr/share/cows', ++ 16877, ++ '' ++ ], ++ [ ++ '/usr/share/cows/beavis.zen.cow', ++ 33188, ++ '582b2ddb72122d3aa078730abd0456b3' ++ ], ++ [ ++ '/usr/share/cows/bong.cow', ++ 33188, ++ '045f9bf39c027dded9a7145f619bac02' ++ ], ++ [ ++ '/usr/share/cows/bud-frogs.cow', ++ 33188, ++ '5c61632eb06305d613061882e1955cd2' ++ ], ++ [ ++ '/usr/share/cows/bunny.cow', ++ 33188, ++ '05eb914d3b96aea903542cb29f5c42c7' ++ ], ++ [ ++ '/usr/share/cows/cheese.cow', ++ 33188, ++ 'f3618110a22d8e9ecde888c1f5e38b61' ++ ], ++ [ ++ '/usr/share/cows/cower.cow', ++ 33188, ++ 'd73ea60eec692555a34a9f3eec981578' ++ ], ++ [ ++ '/usr/share/cows/daemon.cow', ++ 33188, ++ 'a7dd7588ee0386a0f29e88e4881885ee' ++ ], ++ [ ++ '/usr/share/cows/default.cow', ++ 33188, ++ 'f1206515a0f27e9d5cf09c188e46bc82' ++ ], ++ [ ++ '/usr/share/cows/dragon-and-cow.cow', ++ 33188, ++ '0ca99b8edd1a9d14fd231a88d9746b39' ++ ], ++ [ ++ '/usr/share/cows/dragon.cow', ++ 33188, ++ '448f736bf56dccafa2635e71e7485345' ++ ], ++ [ ++ '/usr/share/cows/duck.cow', ++ 33188, ++ 'd8ffcd64667d2e3697a3e8b65e8bea9d' ++ ], ++ [ ++ '/usr/share/cows/elephant-in-snake.cow', ++ 33188, ++ 'c5a9f406277e0e8a674bd3ffb503738f' ++ ], ++ [ ++ '/usr/share/cows/elephant.cow', ++ 33188, ++ 'e355c72e893787376c047805d4a1fe9d' ++ ], ++ [ ++ '/usr/share/cows/eyes.cow', ++ 33188, ++ 'b2eb5b612fae17877895aa6edafa0a5f' ++ ], ++ [ ++ '/usr/share/cows/flaming-sheep.cow', ++ 33188, ++ '3213cfa04a069f42d71115ca623a2f95' ++ ], ++ [ ++ '/usr/share/cows/ghostbusters.cow', ++ 33188, ++ 'df294e6278bcb275aecb0fbd6b2546ba' ++ ], ++ [ ++ '/usr/share/cows/girafe.cow', ++ 33188, ++ '6d2e142313109b6a5a0a45dba0f11351' ++ ], ++ [ ++ '/usr/share/cows/head-in.cow', ++ 33188, ++ '365287a5d1f34a53f8716285e79c28df' ++ ], ++ [ ++ '/usr/share/cows/hellokitty.cow', ++ 33188, ++ 'e0bbea69c4cbcfb3d799740ccc8a0b0e' ++ ], ++ [ ++ '/usr/share/cows/kenny.cow', ++ 33188, ++ '16ce8c334a7547197ac4c9e8a1d6ae90' ++ ], ++ [ ++ '/usr/share/cows/kiss.cow', ++ 33188, ++ '2a7bdd4a20741b7769af463bf09e64e8' ++ ], ++ [ ++ '/usr/share/cows/kitty.cow', ++ 33188, ++ '76d65a3ebfbacb16a654c1aa1af6ed27' ++ ], ++ [ ++ '/usr/share/cows/koala.cow', ++ 33188, ++ 'cc524706707f32253dd06fc548334f11' ++ ], ++ [ ++ '/usr/share/cows/kosh.cow', ++ 33188, ++ 'e4e28e0f472bd524fd1b44c67ae357c2' ++ ], ++ [ ++ '/usr/share/cows/luke-koala.cow', ++ 33188, ++ '63bbc35da73cd22b8cf25f86dcf9f870' ++ ], ++ [ ++ '/usr/share/cows/mech-and-cow', ++ 33188, ++ '12c0320b33704d8564dd97278d056204' ++ ], ++ [ ++ '/usr/share/cows/meow.cow', ++ 33188, ++ 'a6092008647ed37cfe1663d10e388cbb' ++ ], ++ [ ++ '/usr/share/cows/milk.cow', ++ 33188, ++ 'd26ac36e13e77dabb408e104fc8e0167' ++ ], ++ [ ++ '/usr/share/cows/moofasa.cow', ++ 33188, ++ '5fcdd4a9f3bf521c337af0a066b14512' ++ ], ++ [ ++ '/usr/share/cows/moose.cow', ++ 33188, ++ 'dcfa09df7d2b9afa112dab374bf06e99' ++ ], ++ [ ++ '/usr/share/cows/mutilated.cow', ++ 33188, ++ '24cdaef0a29fb44dc673abf19a8ba631' ++ ], ++ [ ++ '/usr/share/cows/phaco.cow', ++ 33188, ++ 'f277c1bf92ce2a3f6058955ba93758aa' ++ ], ++ [ ++ '/usr/share/cows/pumpkin.cow', ++ 33188, ++ 'c661ea78714c1ce31559f77d73694473' ++ ], ++ [ ++ '/usr/share/cows/ren.cow', ++ 33188, ++ '3d7941d454779e000adc1c91e5f0b20b' ++ ], ++ [ ++ '/usr/share/cows/satanic.cow', ++ 33188, ++ 'a69ca42a31486757ddcb322a1e68f886' ++ ], ++ [ ++ '/usr/share/cows/shark.cow', ++ 33188, ++ 'd8950ec63abb00bbd9d96ec63637c1ac' ++ ], ++ [ ++ '/usr/share/cows/sheep.cow', ++ 33188, ++ '543b75f295cbd51326f5a40f111469f1' ++ ], ++ [ ++ '/usr/share/cows/skeleton.cow', ++ 33188, ++ '64f6ec1a0c170508e72269d533492e57' ++ ], ++ [ ++ '/usr/share/cows/small.cow', ++ 33188, ++ '50cb1c55628c439fc81f96db9d855252' ++ ], ++ [ ++ '/usr/share/cows/sodomized.cow', ++ 33188, ++ 'b4888afcca51629cc3138b283608b837' ++ ], ++ [ ++ '/usr/share/cows/stegosaurus.cow', ++ 33188, ++ 'fb0e45d101a3ecba9cf6e112facbbc7e' ++ ], ++ [ ++ '/usr/share/cows/stimpy.cow', ++ 33188, ++ '9b4ec6e0750ba0eeaaa432d8d3413559' ++ ], ++ [ ++ '/usr/share/cows/supermilker.cow', ++ 33188, ++ '316573fb585e4a6b375373c85be025b1' ++ ], ++ [ ++ '/usr/share/cows/surgery.cow', ++ 33188, ++ '7f25005083c1fde19d4e548c005ef000' ++ ], ++ [ ++ '/usr/share/cows/telebears.cow', ++ 33188, ++ '15f00abb070d9018ce6ef3441e936ef4' ++ ], ++ [ ++ '/usr/share/cows/three-eyes.cow', ++ 33188, ++ 'c85faef9496f4a5b111bd92bfd7e7528' ++ ], ++ [ ++ '/usr/share/cows/turkey.cow', ++ 33188, ++ '484b5bc69c09d420d7fd5586d8570f04' ++ ], ++ [ ++ '/usr/share/cows/turtle.cow', ++ 33188, ++ '87eed5a00e88860b78dbec04efcdede3' ++ ], ++ [ ++ '/usr/share/cows/tux.cow', ++ 33188, ++ 'dc1db4eac66c99179ef6adb15dd75bda' ++ ], ++ [ ++ '/usr/share/cows/udder.cow', ++ 33188, ++ 'd97f78887c3b218a54876edc51f2963b' ++ ], ++ [ ++ '/usr/share/cows/vader-koala.cow', ++ 33188, ++ '7b5dd51278f0fa217a70a9b499f97a07' ++ ], ++ [ ++ '/usr/share/cows/vader.cow', ++ 33188, ++ '97b4ef9fc4c26082f253e9f0f35c4590' ++ ], ++ [ ++ '/usr/share/cows/www.cow', ++ 33188, ++ 'ef4c0bc8330f329666e1705f97f283cc' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03', ++ 16877, ++ '' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03/INSTALL', ++ 33188, ++ '3333fd2865107626d5dffc0dbfb7e244' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03/LICENSE', ++ 33188, ++ 'f879dda90a5a9928253a63ecd76406e6' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03/README', ++ 33188, ++ 'a5c1c61e4920c278a735cdaaca62453e' ++ ], ++ [ ++ '/usr/share/man/man1/cowsay.1.bz2', ++ 33188, ++ '01fdd49d0b477f20099aae384fe8c1b2' ++ ], ++ [ ++ '/usr/share/man/man1/cowthink.1.bz2', ++ 41471, ++ '' ++ ] ++ ], ++ 'files' ++ ); ++ ++ # changelog ++ is_deeply( ++ [ $package->get_changes() ], ++ [ ++ [ ++ 'Guillaume Rousse <guillomovitch@mandriva.org> 3.03-11mdv2007.0', ++ 1149847200, ++ '- %mkrel' . "\n" . ++ '- rpmbuildupdate aware', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandriva.org> 3.03-10mdk ', ++ 1117879200, ++ '- fix man page (fix #16291)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandrake.org> 3.03-9mdk ', ++ 1090058400, ++ '- hurry businesman compliant (aka two new wonderful cows)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandrake.org> 3.03-8mdk ', ++ 1089540000, ++ '- apologies to the girafes (with one only f)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandrake.org> 3.03-7mdk ', ++ 1086429600, ++ '- #mandrakefr compliant (aka four new additional cows)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@linux-mandrake.com> 3.03-6mdk', ++ 1061460000, ++ '- save.the.world patch', ++ ] ++ ], ++ 'changelog' ++ ); ++ is_deeply( ++ $package->get_last_change(), ++ [ ++ 'Guillaume Rousse <guillomovitch@mandriva.org> 3.03-11mdv2007.0', ++ 1149847200, ++ '- %mkrel' . "\n" . ++ '- rpmbuildupdate aware', ++ ], ++ 'last change' ++ ); ++ is($package->compare($package), 0, 'compare'); ++ ++ # signature test ++ system('cp', $file, $temp_dir); ++ $package = $class->new(file => "$temp_dir/$rpm"); ++ ++ $package->sign('Youri', 't/gpghome', 'Youri rulez'); ++ ++ $package = $class->new(file => "$temp_dir/$rpm"); ++ is($package->get_gpg_key(), '2333e817', 'get gpg key'); ++} + + +Property changes on: build_system/mdv-youri-core/trunk/t/package.t +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyouricoretrunktversiont">Added: build_system/mdv-youri-core/trunk/t/version.t</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/t/version.t (rev 0) ++++ build_system/mdv-youri-core/trunk/t/version.t 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,71 @@ ++#!/usr/bin/perl ++# $Id: version.t 1179 2006-08-05 08:30:57Z warly $ ++ ++use Test::More; ++use Youri::Check::Input::Updates; ++use strict; ++ ++my @differents = ( ++ [ '3.0.0', '1.0.0' ], ++ [ '3.0.0', '1.99.9' ], ++ [ '3.0.1', '3.0' ], ++ [ '3.0pl1', '3.0' ], ++ [ '3.0', '3.0beta1' ], ++ [ '3.0', '3.0beta' ], ++ [ '3.0', '3.0alpha1' ], ++ [ '3.0', '3.0alpha' ], ++ [ '3.0', '3.0pre1' ], ++ [ '3.0', '3.0pre' ], ++ [ '3.0pre', '3.0beta' ], ++ [ '3.0beta', '3.0alpha' ], ++ [ '1.0.0-p1', '1.0.0RC1' ], ++ [ '0.9.7f', '0.9.7e' ], ++ [ '10', '9' ], ++); ++ ++my @equals = ( ++ [ '1.0.0', '1.0.0' ], ++ [ '0.9Beta1', '0.9beta1' ], ++ [ '0.9beta1', '0.9 beta 1' ], ++ [ '0.3-alpha', '0.3_alpha' ], ++ [ '0.02', '.02' ], ++ [ '2.0.11', '15aug2000' ], ++ [ '2.0.11', '20060401' ], ++ [ '20', '20060401' ], ++); ++ ++plan tests => 2 * @differents + 2 * @equals; ++ ++foreach my $different (@differents) { ++ ok( ++ Youri::Check::Input::Updates::is_newer( ++ $different->[0], ++ $different->[1] ++ ), ++ "$different->[0] is newer as $different->[1]" ++ ); ++ ok( ++ !Youri::Check::Input::Updates::is_newer( ++ $different->[1], ++ $different->[0] ++ ), ++ "$different->[1] is older as $different->[0]" ++ ); ++} ++ ++foreach my $equal (@equals) { ++ ok( ++ !Youri::Check::Input::Updates::is_newer( ++ $equal->[0], ++ $equal->[1] ++ ), ++ "$equal->[0] is equal as $equal->[1]" ++ ); ++ ok( ++ !Youri::Check::Input::Updates::is_newer( ++ $equal->[1], ++ $equal->[0] ++ ), ++ "$equal->[1] is equal as $equal->[0]" ++ ); ++} + + +Property changes on: build_system/mdv-youri-core/trunk/t/version.t +___________________________________________________________________ +Added: svn:executable + + * + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/797a51f6/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/797a51f6/attachment.html new file mode 100644 index 000000000..0274c6c96 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/797a51f6/attachment.html @@ -0,0 +1,11434 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[210] add mandriva version of youri-core, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/core/trunk/ at revision 271600</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>210</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 14:23:45 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add mandriva version of youri-core, downloaded from http://svn.mandriva.com/svn/soft/build_system/youri/core/trunk/ at revision 271600</pre> + +<h3>Added Paths</h3> +<ul> +<li>build_system/mdv-youri-core/</li> +<li>build_system/mdv-youri-core/branches/</li> +<li>build_system/mdv-youri-core/tags/</li> +<li>build_system/mdv-youri-core/trunk/</li> +<li><a href="#build_systemmdvyouricoretrunkChangeLog">build_system/mdv-youri-core/trunk/ChangeLog</a></li> +<li><a href="#build_systemmdvyouricoretrunkMANIFESTSKIP">build_system/mdv-youri-core/trunk/MANIFEST.SKIP</a></li> +<li><a href="#build_systemmdvyouricoretrunkMakefilePL">build_system/mdv-youri-core/trunk/Makefile.PL</a></li> +<li><a href="#build_systemmdvyouricoretrunkREADME">build_system/mdv-youri-core/trunk/README</a></li> +<li><a href="#build_systemmdvyouricoretrunkTODO">build_system/mdv-youri-core/trunk/TODO</a></li> +<li>build_system/mdv-youri-core/trunk/bin/</li> +<li><a href="#build_systemmdvyouricoretrunkbinfillbugzilla">build_system/mdv-youri-core/trunk/bin/fillbugzilla</a></li> +<li>build_system/mdv-youri-core/trunk/cgi/</li> +<li><a href="#build_systemmdvyouricoretrunkcgimaintainerscgi">build_system/mdv-youri-core/trunk/cgi/maintainers.cgi</a></li> +<li>build_system/mdv-youri-core/trunk/etc/</li> +<li>build_system/mdv-youri-core/trunk/etc/bash_completion.d/</li> +<li><a href="#build_systemmdvyouricoretrunketcbash_completiondyouri">build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri</a></li> +<li><a href="#build_systemmdvyouricoretrunketccheckconf">build_system/mdv-youri-core/trunk/etc/check.conf</a></li> +<li><a href="#build_systemmdvyouricoretrunketcuploadconf">build_system/mdv-youri-core/trunk/etc/upload.conf</a></li> +<li>build_system/mdv-youri-core/trunk/lib/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriBugzillapm">build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputAgepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceIurtpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceLBDpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildSourcepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputBuildpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputConflictspm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputDependenciespm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputMandrivaConflictspm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputMissingpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputOrphanspm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputRpmlintpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputSignaturepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceCPANpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceDebianpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFedorapm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFreshmeatpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGNOMEpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGentoopm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceNetBSDpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceRAApm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceSourceforgepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourcepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputUpdatespm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckInputpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencesFilepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencespm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverBugzillapm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverCGIpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatHTMLpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatRSSpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatTextpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputFilepm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/</li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatHTMLpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatTextpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputMailpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckOutputpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckResultsetDBIpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckResultsetIteratorpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriCheckResultsetpm">build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriConfigpm">build_system/mdv-youri-core/trunk/lib/Youri/Config.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Media/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriMediaURPMpm">build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriMediapm">build_system/mdv-youri-core/trunk/lib/Youri/Media.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Package/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageRPMpm">build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageRPM4pm">build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageTestpm">build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackageURPMpm">build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriPackagepm">build_system/mdv-youri-core/trunk/lib/Youri/Package.pm</a></li> +<li>build_system/mdv-youri-core/trunk/lib/Youri/Repository/</li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositoryMandriva_uploadpm">build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositoryMandriva_upload_prepm">build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositoryPLFpm">build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriRepositorypm">build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm</a></li> +<li><a href="#build_systemmdvyouricoretrunklibYouriUtilspm">build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm</a></li> +<li>build_system/mdv-youri-core/trunk/t/</li> +<li><a href="#build_systemmdvyouricoretrunkt00distributiont">build_system/mdv-youri-core/trunk/t/00distribution.t</a></li> +<li><a href="#build_systemmdvyouricoretrunktcowsay30311mdv20070noarchrpm">build_system/mdv-youri-core/trunk/t/cowsay-3.03-11mdv2007.0.noarch.rpm</a></li> +<li>build_system/mdv-youri-core/trunk/t/gpghome/</li> +<li><a href="#build_systemmdvyouricoretrunktgpghomepubringgpg">build_system/mdv-youri-core/trunk/t/gpghome/pubring.gpg</a></li> +<li><a href="#build_systemmdvyouricoretrunktgpghomesecringgpg">build_system/mdv-youri-core/trunk/t/gpghome/secring.gpg</a></li> +<li><a href="#build_systemmdvyouricoretrunktgpghometrustdbgpg">build_system/mdv-youri-core/trunk/t/gpghome/trustdb.gpg</a></li> +<li><a href="#build_systemmdvyouricoretrunktpackaget">build_system/mdv-youri-core/trunk/t/package.t</a></li> +<li><a href="#build_systemmdvyouricoretrunktversiont">build_system/mdv-youri-core/trunk/t/version.t</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="build_systemmdvyouricoretrunkChangeLog">Added: build_system/mdv-youri-core/trunk/ChangeLog</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/ChangeLog (rev 0) ++++ build_system/mdv-youri-core/trunk/ChangeLog 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,2 @@ ++2006-04-23 Guillaume Rousse <guillomovitch@zarb.org> 0.9 ++ * initial release + +<a id="build_systemmdvyouricoretrunkMANIFESTSKIP">Added: build_system/mdv-youri-core/trunk/MANIFEST.SKIP</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/MANIFEST.SKIP (rev 0) ++++ build_system/mdv-youri-core/trunk/MANIFEST.SKIP 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,14 @@ ++CVS/.* ++\.svn/.* ++^cover_db/ ++^blib/ ++\.bak$ ++\.swp$ ++\.tar$ ++\.tgz$ ++\.tar\.gz$ ++\.SKIP$ ++~$ ++^pm_to_blib$ ++^Makefile$ ++^Makefile\.old$ + +<a id="build_systemmdvyouricoretrunkMakefilePL">Added: build_system/mdv-youri-core/trunk/Makefile.PL</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/Makefile.PL (rev 0) ++++ build_system/mdv-youri-core/trunk/Makefile.PL 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,31 @@ ++# $Id: Makefile.PL 1724 2006-10-17 13:55:27Z warly $ ++use ExtUtils::MakeMaker; ++ ++WriteMakefile( ++ NAME => 'youri-core', ++ VERSION => 0.9, ++ AUTHOR => 'Youri project <youri@zarb.org>', ++ PREREQ_PM => { ++ 'AppConfig' => 0, ++ 'YAML' => 0, ++ 'Pod::Simple::HTMLBatch' => 0, ++ 'Test::Exception' => 0, ++ 'Exception' => 0, ++ 'RPM4' => 0, ++ 'URPM' => 0 ++ } ++); ++ ++package MY; ++ ++sub top_targets { ++ my ($self) = @_; ++ my $top_targets = $self->SUPER::top_targets(@_); ++ $top_targets =~ s/all :: pure_all manifypods/all :: pure_all manifypods htmlifypods/; ++ $top_targets .= <<'EOF'; ++htmlifypods : $(TO_INST_PM) ++ if [ ! -d blib/html ]; then mkdir blib/html; fi ++ perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go lib blib/html ++EOF ++ return $top_targets; ++} + +<a id="build_systemmdvyouricoretrunkREADME">Added: build_system/mdv-youri-core/trunk/README</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/README (rev 0) ++++ build_system/mdv-youri-core/trunk/README 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,33 @@ ++youri-core ++---------- ++ ++Youri core libraries. ++ ++Description ++----------- ++YOURI stands for "Youri Offers an Upload & Repository Infrastucture". It aims ++to build tools making management of a coherent set of packages easier. ++ ++This package provides basic components used by other youri programs. ++ ++Installation ++------------ ++To install, just use: ++perl Makefile.PL ++make ++make test ++ ++Copyright and License ++--------------------- ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under ++the same terms as Perl itself. ++ ++Authors ++------- ++Guillaume Rousse <guillomovitch@zarb.org>, ++Pascal Terjan <pterjan@zarb.org> ++Damien Krotkine <dams@zarb.org> ++Olivier Thauvin <nanardon@zarb.org> ++Ville Skytt\xE4 <ville.skytta@iki.fi> + +<a id="build_systemmdvyouricoretrunkTODO">Added: build_system/mdv-youri-core/trunk/TODO</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/TODO (rev 0) ++++ build_system/mdv-youri-core/trunk/TODO 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,7 @@ ++1.0 Goals ++========= ++ ++library: ++- API-based bugzilla interface, instead of SQL-based one ++- more generic check-specific options handling in medias (don't use a ++specific attribute for each of them) + +<a id="build_systemmdvyouricoretrunkbinfillbugzilla">Added: build_system/mdv-youri-core/trunk/bin/fillbugzilla</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/bin/fillbugzilla (rev 0) ++++ build_system/mdv-youri-core/trunk/bin/fillbugzilla 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,81 @@ ++#!/usr/bin/perl ++# fillbugzilla ++# copyright (c) 2002 Guillaume Rousse <guillomovitch@zarb.org> ++# $Id: fillbugzilla 1179 2006-08-05 08:30:57Z warly $ ++ ++use strict; ++use warnings; ++use Getopt::Long; ++use Bugzilla; ++use Mail::Sendmail; ++ ++# constants ++my $name = "fillbugzilla"; ++my $version = "1.0"; ++ ++# command-line parameters ++my ($base, $user, $pass, $project, $mode, $help); ++GetOptions( ++ "base=s" => \$base, ++ "user=s" => \$user, ++ "pass=s" => \$pass, ++ "mode=s" => \$mode, ++ "help" => \$help, ++); ++ ++# mandatory argument ++die usage() unless ($base && $user && $pass); ++die usage() unless ($mode eq 'package' || $mode eq 'packager'); ++ ++usage() && exit 0 if $help; ++ ++my $bugzilla = Bugzilla->new('localhost', $base, $user, $pass); ++ ++if ($mode eq 'packager') { ++ while (my $packager = <>) { ++ chomp $packager; ++ my ($name, $login) = split(/\t/, $packager); ++ ++ # random passwd ++ my @chars = (0..9, 'A'..'Z', 'a'..'z', '-', '_', '!', '@', '#', '$', '%', '^', '&', '*'); ++ my $password = join('', map { $chars[rand(scalar @chars)] } 1 .. 8); ++ ++ # insert into database ++ $bugzilla->add_packager($name, $login, $password); ++ ++ # mail user ++ my %mail = ( ++ smtp => 'localhost', ++ To => $login, ++ From => 'bugmaster@zarb.org', ++ Subject => 'bugzilla password', ++ 'X-Mailer' => "$name $version", ++ ); ++ $mail{Message} .= "login: $login\n"; ++ $mail{Message} .= "password: $password\n"; ++ sendmail(%mail) or warn $Mail::Sendmail::error; ++ } ++} ++ ++if ($mode eq 'package') { ++ while (my $line = <>) { ++ chomp $line; ++ my ($name, $summary, $version, $maintainer) = split(/\t/, $line); ++ $bugzilla->add_package($name, $summary, $version, $maintainer); ++ } ++} ++ ++sub usage { ++ print <<EOF; ++$name $version ++ ++Usage: ++$name --base <base> --user <user> --pass <pass> --mode <mode> < $file ++ ++Options: ++--base <base> bugzilla base name ++--user <user> bugzilla base user ++--pass <pass> bugzilla base password ++--mode <mode> package or packager ++EOF ++} + + +Property changes on: build_system/mdv-youri-core/trunk/bin/fillbugzilla +___________________________________________________________________ +<a id="svnexecutable">Added: svn:executable</a> + + * + +<a id="build_systemmdvyouricoretrunkcgimaintainerscgi">Added: build_system/mdv-youri-core/trunk/cgi/maintainers.cgi</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/cgi/maintainers.cgi (rev 0) ++++ build_system/mdv-youri-core/trunk/cgi/maintainers.cgi 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,65 @@ ++#!/usr/bin/perl ++# $Id: maintainers.cgi 1179 2006-08-05 08:30:57Z warly $ ++ ++=head1 NAME ++ ++maintainers.cgi - youri CGI interface to maintainers list ++ ++=head1 VERSION ++ ++Version 1.0 ++ ++=head1 DESCRIPTION ++ ++This script allows to get package maintainers list through CGI interface. ++ ++=head1 SYNOPSIS ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2004-2005, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=head1 AUTHORS ++ ++Guillaume Rousse <guillomovitch@zarb.org>, ++ ++=cut ++ ++use Youri::Bugzilla; ++use CGI; ++use AppConfig qw/:argcount :expand/; ++use strict; ++use warnings; ++ ++my $config = AppConfig->new( ++ { ++ GLOBAL => { ++ DEFAULT => undef, ++ EXPAND => EXPAND_ALL, ++ ARGCOUNT => ARGCOUNT_ONE, ++ } ++ }, ++ host => { ARGCOUNT => ARGCOUNT_ONE }, ++ base => { ARGCOUNT => ARGCOUNT_ONE }, ++ user => { ARGCOUNT => ARGCOUNT_ONE }, ++ pass => { ARGCOUNT => ARGCOUNT_ONE }, ++); ++ ++my $home = (getpwnam($ENV{PROJECT}))[7]; ++foreach my $file ("/etc/youri/maintainers.conf", "$home/.youri/maintainers.conf") { ++ $config->file($file) if -f $file && -r $file; ++} ++ ++my $bugzilla = Bugzilla->new( ++ $config->host(), ++ $config->base(), ++ $config->user(), ++ $config->pass(), ++); ++ ++my $cgi = CGI->new(); ++print $cgi->header(-type=>'text/plain'); ++ ++$bugzilla->browse_packages(sub { print "$_[0]\t$_[2]\n"; }); + + +Property changes on: build_system/mdv-youri-core/trunk/cgi/maintainers.cgi +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyouricoretrunketcbash_completiondyouri">Added: build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri (rev 0) ++++ build_system/mdv-youri-core/trunk/etc/bash_completion.d/youri 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,141 @@ ++# youri tools completion ++# $Id$ ++ ++_youri-check() ++{ ++ ++ local cur prev config i mode ++ ++ COMPREPLY=() ++ cur=${COMP_WORDS[COMP_CWORD]} ++ prev=${COMP_WORDS[COMP_CWORD-1]} ++ ++ case "$prev" in ++ --config) ++ _filedir ++ return 0 ++ ;; ++ --skip-plugin) ++ _find_config check.conf ++ if [ -n "$config" ]; then ++ # try to guess mode ++ for (( i=1; i < COMP_CWORD; i++ )); do ++ if [[ "${COMP_WORDS[i]}" != -* ]]; then ++ mode=${COMP_WORDS[i]} ++ break ++ fi ++ done ++ ++ if [ -n $mode ]; then ++ COMPREPLY=( $( awk -F= '/^'$mode's/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ fi ++ return 0 ++ ;; ++ --skip-media) ++ _find_config check.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^medias/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ return 0 ++ ;; ++ esac ++ ++ if [[ "$cur" == -* ]]; then ++ COMPREPLY=( $( compgen -W '--config --skip-plugin --skip-media -h \ ++ --help -t --test -v --verbose' -- $cur ) ) ++ else ++ _count_args ++ case $args in ++ 1) ++ COMPREPLY=( $( compgen -W 'input output' -- $cur ) ) ++ ;; ++ esac ++ fi ++ ++} ++complete -F _youri-check youri-check ++ ++_youri-upload() ++{ ++ ++ local cur prev config ++ ++ COMPREPLY=() ++ cur=${COMP_WORDS[COMP_CWORD]} ++ prev=${COMP_WORDS[COMP_CWORD-1]} ++ ++ case "$prev" in ++ --config) ++ _filedir ++ return 0 ++ ;; ++ --skip-check) ++ _find_config upload.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^checks/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ return 0 ++ ;; ++ --skip-action) ++ _find_config upload.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^actions/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ return 0 ++ ;; ++ esac ++ ++ if [[ "$cur" == -* ]]; then ++ COMPREPLY=( $( compgen -W '--config --skip-check --skip-action \ ++ --define -h --help -t --test -v --verbose' -- $cur ) ) ++ else ++ _count_args ++ case $args in ++ 1) ++ _find_config upload.conf ++ if [ -n "$config" ]; then ++ COMPREPLY=( $( awk -F= '/^targets/ {print $2}' $config \ ++ | grep "^$cur" ) ) ++ fi ++ ;; ++ *) ++ _filedir ++ ;; ++ esac ++ fi ++ ++} ++complete -F _youri-upload youri-upload ++ ++_find_config() ++{ ++ local name i ++ ++ name=$1 ++ ++ for (( i=1; i < COMP_CWORD; i++ )); do ++ if [[ "${COMP_WORDS[i]}" == --config ]]; then ++ config=${COMP_WORDS[i+1]} ++ break ++ fi ++ done ++ if [ -f "$config" ]; then ++ return 0 ++ fi ++ ++ if [ -f "$HOME/.youri/$name" ]; then ++ config=$HOME/.youri/$name ++ return 0 ++ fi ++ ++ if [ -f "/etc/youri/$name" ]; then ++ config=/etc/youri/$name ++ return 0 ++ fi ++ ++} + +<a id="build_systemmdvyouricoretrunketccheckconf">Added: build_system/mdv-youri-core/trunk/etc/check.conf</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/etc/check.conf (rev 0) ++++ build_system/mdv-youri-core/trunk/etc/check.conf 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,300 @@ ++# youri-check sample configuration file ++# $Id: check.conf 1179 2006-08-05 08:30:57Z warly $ ++ ++# resolver declaration ++resolver = cgi ++ ++# preferences declaration ++preferences = file_pref ++ ++# resultset declaration ++resultset = dbi ++ ++# input plugins declaration ++inputs = rpmlint \ ++ age \ ++ updates \ ++ build \ ++ conflicts \ ++ dependencies \ ++ missing \ ++ orphans ++ ++# output plugins declaration ++outputs = file mail ++ ++# medias declaration ++medias = main.i586 \ ++ main.x86_64 \ ++ main.sources \ ++ contrib.i586 \ ++ contrib.x86_64 \ ++ contrib.sources \ ++ free \ ++ non-free \ ++ free.sources \ ++ non-free.sources ++ ++# helper variables ++mirror = ftp://ftp.free.fr/pub/Distributions_Linux/Mandrakelinux/devel/cooker ++mirror_i586 = $mirror/i586/media ++mirror_x86_64 = $mirror/x86_64/media ++ ++# resolver definition ++[cgi] ++class = Youri::Check::Maintainer::Resolver::CGI ++url = http://plf.zarb.org/cgi-bin/maintainers.cgi ++ ++# preferences definition ++[file_pref] ++class = Youri::Check::Maintainer::Preferences::File ++ ++# resultset definition ++[dbi] ++class = Youri::Check::Resultset::DBI ++driver = mysql ++host = localhost ++base = plf_youri ++user = plf ++pass = s3kr3t ++ ++# checks definitions ++[updates] ++class = Youri::Check::Input::Updates ++aliases = <<EOF ++--- #YAML:1.0 ++libfame0.8: ~ ++EOF ++sources = <<EOF ++--- #YAML:1.0 ++debian: ++ class: Youri::Check::Input::Updates::Source::Debian ++ aliases: ++ fuse-emulator: ~ ++cpan: ++ class: Youri::Check::Input::Updates::Source::CPAN ++fedora: ++ class: Youri::Check::Input::Updates::Source::Fedora ++gentoo: ++ class: Youri::Check::Input::Updates::Source::Gentoo ++freshmeat: ++ class: Youri::Check::Input::Updates::Source::Freshmeat ++netbsd: ++ class: Youri::Check::Input::Updates::Source::NetBSD ++raa: ++ class: Youri::Check::Input::Updates::Source::RAA ++sourceforge: ++ class: Youri::Check::Input::Updates::Source::Sourceforge ++ aliases: ++ openquicktime: ~ ++ klibido: ~ ++EOF ++ ++[rpmlint] ++class = Youri::Check::Input::Rpmlint ++ ++[age] ++class = Youri::Check::Input::Age ++max_age = 12 months ++pattern = %m months ++ ++[dependencies] ++class = Youri::Check::Input::Dependencies ++ ++[conflicts] ++class = Youri::Check::Input::Conflicts ++ ++[build] ++class = Youri::Check::Input::Build ++sources = <<EOF ++--- #YAML:1.0 ++stefan: ++ class: Youri::Check::Input::Build::Source::LBD ++ url: http://eijk.homelinux.org/build/ ++ medias: ++ - cooker_plf-free ++ - cooker_plf-non-free ++ archs: ++ - i586 ++EOF ++ ++[missing] ++class = Youri::Check::Input::Missing ++ ++[orphans] ++class = Youri::Check::Input::Orphans ++ ++# reports definitions ++[file] ++class = Youri::Check::Output::File ++to = ${HOME}/www/qa ++global = 1 ++individual = 1 ++formats = <<EOF ++--- #YAML:1.0 ++html: ++ class: Youri::Check::Output::File::Format::HTML ++text: ++ class: Youri::Check::Output::File::Format::Text ++rss: ++ class: Youri::Check::Output::File::Format::RSS ++EOF ++ ++[mail] ++class = Youri::Check::Output::Mail ++mta = /usr/sbin/sendmail ++to = plf-admin@zarb.org ++from = plf@zarb.org ++reply_to = plf-admin@zarb.org ++formats = <<EOF ++--- #YAML:1.0 ++text: ++ class: Youri::Check::Output::Mail::Format::Text ++EOF ++ ++# media definitions ++[main.i586] ++class = Youri::Media::URPM ++name = main ++type = binary ++path = $mirror_i586/main ++hdlist = $mirror_i586/media_info/hdlist_main.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[main.x86_64] ++class = Youri::Media::URPM ++name = main ++type = binary ++path = $mirror_x86_64/main ++hdlist = $mirror_x86_64/media_info/hdlist_main.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[main.sources] ++class = Youri::Media::URPM ++name = main ++type = source ++path = $mirror_i586/main ++hdlist = $mirror_i586/media_info/hdlist_main.src.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[contrib.i586] ++class = Youri::Media::URPM ++name = contrib ++type = binary ++path = $mirror_i586/contrib ++hdlist = $mirror_i586/media_info/hdlist_contrib.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[contrib.x86_64] ++class = Youri::Media::URPM ++name = contrib ++type = binary ++path = $mirror_x86_64/contrib ++hdlist = $mirror_x86_64/media_info/hdlist_contrib.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[contrib.sources] ++class = Youri::Media::URPM ++name = contrib ++type = source ++path = $mirror_i586/contrib ++hdlist = $mirror_i586/media_info/hdlist_contrib.src.cz ++skip_inputs = <<EOF ++--- #YAML:1.0 ++- all ++EOF ++ ++[free] ++class = Youri::Media::URPM ++name = free ++type = binary ++path = ${HOME}/ftp/mandrake/free/cooker/i586 ++hdlist = ${HOME}/ftp/mandrake/free/cooker/i586/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- main.x86_64 ++- contrib.i586 ++- contrib.x86_64 ++- free ++EOF ++allow_srcs = <<EOF ++--- #YAML:1.0 ++- free.sources ++- main.sources ++- contrib.sources ++EOF ++skip_archs = <<EOF ++--- #YAML:1.0 ++- ppc ++EOF ++ ++[free.sources] ++class = Youri::Media::URPM ++name = free ++type = source ++path = ${HOME}/ftp/mandrake/free/src ++hdlist = ${HOME}/ftp/mandrake/free/src/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- contrib.i586 ++- free ++EOF ++ ++[non-free] ++class = Youri::Media::URPM ++name = non-free ++type = binary ++path = ${HOME}/ftp/mandrake/non-free/cooker/i586 ++hdlist = ${HOME}/ftp/mandrake/non-free/cooker/i586/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-non-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- main.x86_64 ++- contrib.i586 ++- contrib.x86_64 ++- free ++- non-free ++EOF ++allow_srcs = <<EOF ++--- #YAML:1.0 ++- non-free.sources ++EOF ++skip_archs = <<EOF ++--- #YAML:1.0 ++- ppc ++EOF ++ ++[non-free.sources] ++class = Youri::Media::URPM ++name = non-free ++type = source ++path = ${HOME}/ftp/mandrake/non-free/src ++hdlist = ${HOME}/ftp/mandrake/non-free/src/hdlist.cz ++rpmlint_config = ${HOME}/etc/rpmlint-non-free.conf ++allow_deps = <<EOF ++--- #YAML:1.0 ++- main.i586 ++- contrib.i586 ++- free ++- non-free ++EOF + +<a id="build_systemmdvyouricoretrunketcuploadconf">Added: build_system/mdv-youri-core/trunk/etc/upload.conf</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/etc/upload.conf (rev 0) ++++ build_system/mdv-youri-core/trunk/etc/upload.conf 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,139 @@ ++# youri-upload sample configuration file ++# $Id: upload.conf 1179 2006-08-05 08:30:57Z warly $ ++ ++# repository declaration ++repository = plf ++ ++# targets declaration ++targets = cooker 2006.0 ++ ++# repository definition ++[plf] ++class = Youri::Repository::PLF ++install_root = ${HOME}/ftp/mandriva ++version_root = ${HOME}/cvs ++archive_root = ${HOME}/backup/mandriva ++noarch = i586 ++ ++# targets definition ++[cooker] ++checks = <<EOF ++--- #YAML:1.0 ++- tag ++- recency ++- history ++EOF ++actions = <<EOF ++--- #YAML:1.0 ++- sign ++- install ++- link ++- archive ++- clean ++- bugzilla ++- cvs ++- mail ++- rss ++EOF ++ ++[2006.0] ++checks = <<EOF ++--- #YAML:1.0 ++- type ++- tag ++- recency ++- history ++- precedence ++EOF ++actions = <<EOF ++--- #YAML:1.0 ++- sign ++- install ++- link ++- archive ++- clean ++EOF ++ ++# checks definition ++[tag] ++class = Youri::Upload::Check::Tag ++tags = <<EOF ++--- #YAML:1.0 ++release: 'plf$' ++packager: '<\w+@zarb\.org>$' ++distribution: '^Mandriva Linux$' ++vendor: '^Penguin Liberation Front$' ++EOF ++ ++[recency] ++class = Youri::Upload::Check::Recency ++ ++[history] ++class = Youri::Upload::Check::History ++ ++[precedence] ++class = Youri::Upload::Check::Precedence ++target = cooker ++ ++[type] ++class = Youri::Upload::Check::Type ++type = binary ++ ++# actions definitions ++[sign] ++class = Youri::Upload::Action::Sign ++name = plf@zarb.org ++path = ${HOME}/.gnupg ++passphrase = s3kr3t ++ ++[install] ++class = Youri::Upload::Action::Install ++ ++[link] ++class = Youri::Upload::Action::Link ++ ++[archive] ++class = Youri::Upload::Action::Archive ++ ++[clean] ++class = Youri::Upload::Action::Clean ++ ++[mail] ++class = Youri::Upload::Action::Mail ++mta = /usr/sbin/sendmail ++to = plf-announce@zarb.org ++reply_to = plf-discuss@zarb.org ++from = plf@zarb.org ++prefix = RPM ++cc = <<EOF ++--- #YAML:1.0 ++hot-base: david@dindinx.org bellamy@neverland.net ++dcgui: mathen@ketelhot.de ++dclib: mathen@ketelhot.de ++Video-DVDRip: dvdrip-users@exit1.org ++hackVideo-DVDRip: dvdrip-users@exit1.org ++goosnes: tak@bard.sytes.net ++avidemux: fixounet@free.fr ++vobcopy: robos@muon.de ++drip: drip-devel@lists.sourceforge.net ++libdscaler: vektor@dumbterm.net ++xawdecode: pingus77@ifrance.com ++EOF ++ ++[rss] ++class = Youri::Upload::Action::RSS ++file = ${HOME}/www/changelog.rss ++title = PLF packages updates ++link = http://plf.zarb.org/ ++description = ChangeLog for PLF packages ++ ++[cvs] ++class = Youri::Upload::Action::CVS ++ ++[bugzilla] ++class = Youri::Upload::Action::Bugzilla ++host = localhost ++base = plf_bugs ++user = plf ++pass = s3kr3t ++contact = plf@zarb.org + +<a id="build_systemmdvyouricoretrunklibYouriBugzillapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Bugzilla.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,482 @@ ++# $Id: Bugzilla.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Bugzilla; ++ ++=head1 NAME ++ ++Youri::Bugzilla - Youri Bugzilla interface ++ ++=head1 SYNOPSIS ++ ++ use Youri::Bugzilla; ++ ++ my $bugzilla = Youri::Bugzilla->new($host, $base, $user, $pass); ++ ++ print $bugzilla->get_maintainer('foobar'); ++ ++=head1 DESCRIPTION ++ ++This module implement a database-level Bugzilla interface for managing packages. ++ ++The legacy Bugzilla database model is mapped this way: ++ ++=over ++ ++=item * ++ ++a maintainer is a user ++ ++=item * ++ ++a package is a product ++ ++=item * ++ ++each package has two pseudo components "program" and "package", owned by the package maintainer ++ ++=back ++ ++=cut ++ ++use DBI; ++use Carp; ++use strict; ++use warnings; ++ ++my %queries = ( ++ get_package_id => 'SELECT id FROM products WHERE name = ?', ++ get_maintainer_id => 'SELECT userid FROM profiles WHERE login_name = ?', ++ get_versions => 'SELECT value FROM versions WHERE product_id = ?', ++ get_components => 'SELECT name FROM components WHERE product_id = ?', ++ add_package => 'INSERT INTO products (name, description) VALUES (?, ?)', ++ add_maintainer => 'INSERT INTO profiles (login_name, cryptpassword, realname, emailflags, refreshed_when) VALUES (?, ENCRYPT(?), ?, ?, SYSDATE())', ++ add_component => 'INSERT INTO components (product_id, name, description,initialowner, initialqacontact) VALUES (?, ?, ?, ?, ?)', ++ add_version => 'INSERT INTO versions (product_id, value) VALUES (?, ?)', ++ del_package => 'DELETE FROM products WHERE product = ?', ++ del_maintainer => 'DELETE FROM profiles WHERE login_name = ?', ++ del_components => 'DELETE FROM components WHERE program = ?', ++ del_versions => 'DELETE FROM versions WHERE program = ?', ++ reset_password => 'UPDATE profiles SET cryptpassword = ENCRYPT(?) WHERE login_name = ?', ++ browse_packages => <<EOF, ++SELECT products.name, max(versions.value), login_name ++FROM products, versions, profiles, components ++WHERE versions.product_id = products.id ++ AND components.product_id = products.id ++ AND profiles.userid = components.initialowner ++ AND components.name = 'package' ++GROUP BY name ++EOF ++ get_maintainer => <<EOF ++SELECT login_name ++FROM profiles, components, products ++WHERE profiles.userid = components.initialowner ++ AND components.name = 'package' ++ AND components.product_id = products.id ++ AND products.name = ? ++EOF ++); ++ ++my @default_flags = qw/ ++ ExcludeSelf ++ FlagRequestee ++ FlagRequester ++ emailOwnerRemoveme ++ emailOwnerComments ++ emailOwnerAttachments ++ emailOwnerStatus ++ emailOwnerResolved ++ emailOwnerKeywords ++ emailOwnerCC ++ emailOwnerOther ++ emailOwnerUnconfirmed ++ emailReporterRemoveme ++ emailReporterComments ++ emailReporterAttachments ++ emailReporterStatus ++ emailReporterResolved ++ emailReporterKeywords ++ emailReporterCC ++ emailReporterOther ++ emailReporterUnconfirmed ++ emailQAcontactRemoveme ++ emailQAcontactComments ++ emailQAcontactAttachments ++ emailQAcontactStatus ++ emailQAcontactResolved ++ emailQAcontactKeywords ++ emailQAcontactCC ++ emailQAcontactOther ++ emailQAcontactUnconfirmed ++ emailCClistRemoveme ++ emailCClistComments ++ emailCClistAttachments ++ emailCClistStatus ++ emailCClistResolved ++ emailCClistKeywords ++ emailCClistCC ++ emailCClistOther ++ emailCClistUnconfirmed ++ emailVoterRemoveme ++ emailVoterComments ++ emailVoterAttachments ++ emailVoterStatus ++ emailVoterResolved ++ emailVoterKeywords ++ emailVoterCC ++ emailVoterOther ++ emailVoterUnconfirmed ++/; ++ ++my $default_flags = join('~', map { "$_~on" } @default_flags); ++ ++=head1 CLASS METHODS ++ ++Except stated otherwise, maintainers are specified by their login, and packages ++are specified by their name. ++ ++=head2 new($host, $base, $user, $password) ++ ++Creates a new L<Youri::Bugzilla> object, wrapping bugzilla database I<$base> ++hosted on I<$host>, and accessed by user I<$user> with password I<$password>. ++ ++=cut ++ ++sub new { ++ my ($class, $host, $base, $user, $pass) = @_; ++ ++ my $dbh = DBI->connect("DBI:mysql:database=$base;host=$host", $user, $pass) or croak "Unable to connect: $DBI::errstr"; ++ ++ my $self = bless { ++ _dbh => $dbh ++ }, $class; ++ ++ return $self; ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 has_package($package) ++ ++Return true if bugzilla contains given package. ++ ++=cut ++ ++sub has_package { ++ my ($self, $package) = @_; ++ return $self->_get_package_id($package); ++} ++ ++=head2 has_maintainer($maintainer) ++ ++Return true if bugzilla contains given maintainer. ++ ++=cut ++ ++sub has_maintainer { ++ my ($self, $maintainer) = @_; ++ return $self->_get_maintainer_id($maintainer); ++} ++ ++=head2 get_maintainer($package) ++ ++Return maintainer of given package. ++ ++=cut ++ ++sub get_maintainer { ++ my ($self, $package) = @_; ++ return $self->_get_single('get_maintainer', $package); ++} ++ ++=head2 get_versions($package) ++ ++Return versions from given package. ++ ++=cut ++ ++sub get_versions { ++ my ($self, $package) = @_; ++ return $self->_get_multiple( ++ 'get_versions', ++ $self->_get_package_id($package) ++ ); ++} ++ ++=head2 get_components($package) ++ ++Return components from given package. ++ ++=cut ++ ++sub get_components { ++ my ($self, $package) = @_; ++ return $self->_get_multiple( ++ 'get_components', ++ $self->_get_package_id($package) ++ ); ++} ++ ++=head2 get_packages() ++ ++Return all packages from the database. ++ ++=cut ++ ++sub get_packages { ++ my ($self) = @_; ++ return $self->_get_multiple('get_packages'); ++} ++ ++sub _get_package_id { ++ my ($self, $package) = @_; ++ return $self->_get_single('get_package_id', $package); ++} ++ ++sub _get_maintainer_id { ++ my ($self, $maintainer) = @_; ++ return $self->_get_single('get_maintainer_id', $maintainer); ++} ++ ++sub _get_single { ++ my ($self, $type, $value) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{$type}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{$type}); ++ $self->{_queries}->{$type} = $query; ++ } ++ ++ $query->execute($value); ++ ++ my @row = $query->fetchrow_array(); ++ return @row ? $row[0]: undef; ++} ++ ++sub _get_multiple { ++ my ($self, $type, $value) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{$type}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{$type}); ++ $self->{_queries}->{$type} = $query; ++ } ++ ++ $query->execute($value); ++ ++ my @results; ++ while (my @row = $query->fetchrow_array()) { ++ push @results, $row[0]; ++ } ++ return @results; ++} ++ ++=head2 add_package($name, $summary, $version, $maintainer, $contact) ++ ++Adds a new package in the database, with given name, summary, version, ++maintainer and initial QA contact. ++ ++=cut ++ ++sub add_package { ++ my ($self, $name, $summary, $version, $maintainer, $contact) = @_; ++ return unless ref $self; ++ ++ my $maintainer_id = $self->_get_maintainer_id($maintainer); ++ unless ($maintainer_id) { ++ carp "Unknown maintainer $maintainer, aborting"; ++ return; ++ } ++ ++ my $contact_id = $self->_get_maintainer_id($contact); ++ unless ($contact_id) { ++ carp "Unknown QA contact $contact, aborting"; ++ return; ++ } ++ ++ my $query = $self->{_queries}->{add_package}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_package}); ++ $self->{_queries}->{add_package} = $query; ++ } ++ ++ $query->execute($name, $summary); ++ ++ my $package_id = $self->_get_package_id($name); ++ ++ $self->_add_version($package_id, $version); ++ $self->_add_component( ++ $package_id, ++ 'package', ++ 'problem related to the package', ++ $maintainer_id, ++ $contact_id ++ ); ++ $self->_add_component( ++ $package_id, ++ 'program', ++ 'problem related to the program', ++ $maintainer_id, ++ $contact_id ++ ); ++} ++ ++=head2 add_version($package, $version) ++ ++Adds a new version to given package. ++ ++=cut ++ ++sub add_version { ++ my ($self, $package, $version) = @_; ++ return unless ref $self; ++ ++ my $package_id = $self->_get_package_id($package); ++ $self->_add_version($package_id, $version); ++} ++ ++sub _add_version { ++ my ($self, $package_id, $version) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{add_version}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_version}); ++ $self->{_queries}->{add_version} = $query; ++ } ++ ++ $query->execute($package_id, $version); ++} ++ ++ ++=head2 add_maintainer($name, $login, $password) ++ ++Adds a new maintainer in the database, with given name, login and password. ++ ++=cut ++ ++sub add_maintainer { ++ my ($self, $name, $login, $pass) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{add_maintainer}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_maintainer}); ++ $self->{_queries}->{add_maintainer} = $query; ++ } ++ ++ $query->execute($login, $pass, $name, $default_flags); ++} ++ ++sub _add_component { ++ my ($self, $package_id, $name, $description, $maintainer_id, $contact_id) = @_; ++ ++ my $query = $self->{_queries}->{add_component}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{add_component}); ++ $self->{_queries}->{add_component} = $query; ++ } ++ ++ $query->execute($package_id, $name, $description, $maintainer_id, $contact_id); ++} ++ ++=head2 del_package($package) ++ ++Delete given package from database. ++ ++=cut ++ ++sub del_package { ++ my ($self, $package) = @_; ++ $self->_delete('del_package', $package); ++ $self->_delete('del_versions', $package); ++ $self->_delete('del_components', $package); ++} ++ ++=head2 del_maintainer($maintainer) ++ ++Delete given maintainer from database. ++ ++=cut ++ ++sub del_maintainer { ++ my ($self, $maintainer) = @_; ++ $self->_delete('del_maintainer', $maintainer); ++} ++ ++sub _delete { ++ my ($self, $type, $value) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{$type}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{$type}); ++ $self->{_queries}->{$type} = $query; ++ } ++ ++ $query->execute($value); ++} ++ ++=head2 reset_password(I<$maintainer>, I<$password>) ++ ++Reset password of a maintainer to given password. ++ ++=cut ++ ++sub reset_password { ++ my ($self, $login, $pass) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{reset_password}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{reset_password}); ++ $self->{_queries}->{reset_password} = $query; ++ } ++ ++ $query->execute($pass, $login); ++} ++ ++=head2 browse_packages($callback) ++ ++Browse all packages from bugzilla, and execute given callback with name and ++maintainer as argument for each of them. ++ ++=cut ++ ++sub browse_packages { ++ my ($self, $callback) = @_; ++ return unless ref $self; ++ ++ my $query = $self->{_queries}->{browse_packages}; ++ unless ($query) { ++ $query = $self->{_dbh}->prepare($queries{browse_packages}); ++ $self->{_queries}->{browse_packages} = $query; ++ } ++ ++ $query->execute(); ++ ++ while (my @row = $query->fetchrow_array()) { ++ $callback->(@row); ++ } ++} ++ ++# close database connection ++sub DESTROY { ++ my ($self) = @_; ++ ++ foreach my $query (values %{$self->{_queries}}) { ++ $query->finish(); ++ } ++ ++ $self->{_dbh}->disconnect(); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputAgepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Age.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,110 @@ ++# $Id: Age.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Age; ++ ++=head1 NAME ++ ++Youri::Check::Input::Age - Check maximum age ++ ++=head1 DESCRIPTION ++ ++This plugin checks packages age, and report the ones exceeding maximum limit. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use DateTime; ++use DateTime::Format::Duration; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ buildtime ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Age object. ++ ++Specific parameters: ++ ++=over ++ ++=item max_age $age ++ ++Maximum age allowed (default: 1 year) ++ ++=item pattern $pattern ++ ++Pattern used to describe age (default: %Y year) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ max_age => '1 year', ++ pattern => '%Y year', ++ @_ ++ ); ++ ++ $self->{_format} = DateTime::Format::Duration->new( ++ pattern => $options{pattern} ++ ); ++ ++ $self->{_now} = DateTime->from_epoch( ++ epoch => time() ++ ); ++ ++ $self->{_max_age} = $options{max_age}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $max_age_string = $media->max_age() ? ++ $media->max_age() : ++ $self->{_max_age}; ++ ++ my $max_age = $self->{_format}->parse_duration($max_age_string); ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ my $buildtime = DateTime->from_epoch( ++ epoch => $package->get_age() ++ ); ++ ++ my $age = $self->{_now}->subtract_datetime($buildtime); ++ ++ if (DateTime::Duration->compare($age, $max_age) > 0) { ++ my $date = $buildtime->strftime("%a %d %b %G"); ++ ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $package->get_arch(), ++ buildtime => $date ++ }); ++ } ++ }; ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceIurtpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/Iurt.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,117 @@ ++# $Id: LBD.pm 574 2005-12-27 14:31:16Z guillomovitch $ ++package Youri::Check::Input::Build::Source::Iurt; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build::Source::Iurt - Iurt build log source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Build> collects build logs ++available from a iurt build bot. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use base 'Youri::Check::Input::Build::Source'; ++ ++my %status = ( ++ install_deps => 0, ++ build => 1, ++ binary_test => 2 ++); ++ ++my $pattern = '^(' ++ . join('|', keys %status) ++ . ')_\S+-[^-]+-[^-]+\.src\.rpm\.\d+\.log$'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build::LBD object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL of logs for this iurt instance (default: ++http://qa.mandriva.com/build/iurt/cooker) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://qa.mandriva.com/build/iurt/cooker', ++ @_ ++ ); ++ ++ $self->{_agent} = LWP::UserAgent->new(); ++ ++ # try to connect to base URL directly, and abort if not available ++ my $response = $self->{_agent}->head($options{url}); ++ die "Unavailable URL $options{url}: " . $response->status_line() ++ unless $response->is_success(); ++ ++ $self->{_url} = $options{url}; ++} ++ ++sub fails { ++ my ($self, $name, $version, $release, $arch) = @_; ++ ++ my $result; ++ my $url = "$self->{_url}/$arch/log/$name-$version-$release.src.rpm"; ++ print "Fetching URL $url: " if $self->{_verbose} > 1; ++ my $response = $self->{_agent}->get($url); ++ print $response->status_line() . "\n" if $self->{_verbose} > 1; ++ if ($response->is_success()) { ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /$pattern/o; ++ my $status = $1; ++ if ( ++ !$result->{status} || ++ $status{$result->{status}} < $status{$status} ++ ) { ++ $result->{status} = $status; ++ $result->{url} = $url . '/' . $href; ++ } ++ } ++ } ++ ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch} = $result; ++ ++ return $result->{status} && $result->{status} ne 'binary_test'; ++} ++ ++sub status { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{status}; ++} ++ ++sub url { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{url}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildSourceLBDpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source/LBD.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,135 @@ ++# $Id: LBD.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Build::Source::LBD; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build::Source::LBD - LBD build log source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Build> collects build logs ++available from a LBD build bot. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use base 'Youri::Check::Input::Build::Source'; ++ ++my @status = qw/ ++ OK ++ arch_excl ++ broken ++ cannot_be_installed ++ debug ++ dependency ++ file_not_found ++ multiarch ++ problem ++ unpackaged_files ++/; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build::LBD object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL of logs for this LBD instance (default: http://eijk.homelinux.org/build) ++ ++=item medias $medias ++ ++List of medias monitored by this LBD instance ++ ++=item archs $archs ++ ++List of architectures monitored by this LBD instance ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://eijk.homelinux.org/build', ++ medias => undef, ++ archs => undef, ++ @_ ++ ); ++ ++ my $agent = LWP::UserAgent->new(); ++ ++ # try to connect to base URL directly, and abort if not available ++ my $response = $agent->head($options{url}); ++ die "Unavailable URL $options{url}: " . $response->status_line() ++ unless $response->is_success(); ++ ++ my $pattern = '^(\S+)-([^-]+)-([^-]+)(?:\.gz)?$'; ++ ++ foreach my $arch (@{$options{archs}}) { ++ foreach my $media (@{$options{medias}}) { ++ my $url_base = "$options{url}/$arch/$media/BO"; ++ foreach my $status (@status) { ++ my $url = "$url_base/$status/"; ++ print "Fetching URL $url: " if $self->{_verbose} > 1; ++ my $response = $agent->get($url); ++ print $response->status_line() . "\n" if $self->{_verbose} > 1; ++ if ($response->is_success()) { ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /$pattern/o; ++ my $name = $1; ++ my $version = $2; ++ my $release = $3; ++ my $result; ++ $result->{status} = $status; ++ $result->{url} = $url . '/' . $href; ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch} = $result; ++ } ++ } ++ } ++ } ++ } ++} ++ ++sub fails { ++ my ($self, $name, $version, $release, $arch) = @_; ++ ++ my $status = ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{status}; ++ ++ return $status && $status ne 'OK' && $status ne 'arch_excl'; ++} ++ ++sub status { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{status}; ++} ++ ++sub url { ++ my ($self, $name, $version, $release, $arch) = @_; ++ return ++ $self->{_results}->{$name}->{$version}->{$release}->{$arch}->{url}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildSourcepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build/Source.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,109 @@ ++# $Id: Source.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Build::Source; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build::Source - Abstract build log source ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the updates source interface for ++L<Youri::Check::Input::Build>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns source identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 fails($name, $version, $release, $arch) ++ ++Returns true if build fails for package with given name, version and release on ++given architecture. ++ ++=head2 status($name, $version, $release, $arch) ++ ++Returns exact build status for package with given name, version and release on ++given architecture. It has to be called after fails(). ++ ++=head2 url($name, $version, $release, $arch) ++ ++Returns URL of information source for package with given name, version and ++release on given architecture. It has to be called after fails(). ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item fails ++ ++=item status ++ ++=item url ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputBuildpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Build.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,128 @@ ++# $Id: Build.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Build; ++ ++=head1 NAME ++ ++Youri::Check::Input::Build - Check build outputs ++ ++=head1 DESCRIPTION ++ ++This plugin checks build outputs of packages, and report failures. Additional ++source plugins handle specific sources. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ bot ++ status ++ /; ++} ++ ++sub links { ++ return qw/ ++ status url ++ /; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Build object. ++ ++Specific parameters: ++ ++=over ++ ++=item sources $sources ++ ++Hash of source plugins definitions ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ sources => undef, ++ @_ ++ ); ++ ++ croak "No source defined" unless $options{sources}; ++ croak "sources should be an hashref" unless ref $options{sources} eq 'HASH'; ++ ++ foreach my $id (keys %{$options{sources}}) { ++ print "Creating source $id\n" if $options{verbose}; ++ eval { ++ push( ++ @{$self->{_sources}}, ++ create_instance( ++ 'Youri::Check::Input::Build::Source', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ %{$options{sources}->{$id}} ++ ) ++ ); ++ # register monitored archs ++ $self->{_archs}->{$_}->{$id} = 1 ++ foreach @{$options{sources}->{$id}->{archs}}; ++ }; ++ print STDERR "Failed to create source $id: $@\n" if $@; ++ } ++ ++ croak "no sources created" unless @{$self->{_sources}}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a source media check only ++ return unless $media->get_type() eq 'source'; ++ ++ my $callback = sub { ++ my ($package) = @_; ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ ++ foreach my $source (@{$self->{_sources}}) { ++ my $id = $source->get_id(); ++ foreach my $arch (keys %{$self->{_archs}}) { ++ next unless $self->{_archs}->{$arch}->{$id}; ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ bot => $id, ++ status => $source->status($name, $version, $release, $arch), ++ url => $source->url($name, $version, $release, $arch), ++ }) if $source->fails( ++ $name, ++ $version, ++ $release, ++ $arch, ++ ); ++ } ++ } ++ }; ++ ++ $media->traverse_headers($callback); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputConflictspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Conflicts.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,231 @@ ++# $Id: Conflicts.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Conflicts; ++ ++=head1 NAME ++ ++Youri::Check::Input::Conflicts - Check file conflicts ++ ++=head1 DESCRIPTION ++ ++This plugin checks packages files, and report conflict and duplications. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use constant; ++use Youri::Package; ++use base 'Youri::Check::Input'; ++ ++use constant TYPE_MASK => 0170000; ++use constant TYPE_DIR => 0040000; ++ ++use constant PACKAGE => 0; ++use constant MODE => 1; ++use constant MD5SUM => 2; ++ ++my $compatibility = { ++ x86_64 => 'i586', ++ i586 => 'x86_64', ++ sparc64 => 'sparc', ++ sparc => 'sparc64', ++ ppc64 => 'ppc', ++ ppc => 'ppc64' ++}; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ level ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Conflicts object. ++ ++No specific parameters. ++ ++=cut ++ ++sub prepare { ++ my ($self, @medias) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $index = sub { ++ my ($package) = @_; ++ ++ # index files ++ foreach my $file ($package->get_files()) { ++ push( ++ @{$self->{_files}->{$file->[Youri::Package::FILE_NAME]}}, ++ [ $package, $file->[Youri::Package::FILE_MODE], $file->[Youri::Package::FILE_MD5SUM] ] ++ ); ++ } ++ }; ++ ++ foreach my $media (@medias) { ++ # don't index source media files ++ next unless $media->get_type() eq 'binary'; ++ ++ my $media_id = $media->get_id(); ++ $self->{_medias}->{$media_id} = 1; ++ print STDERR "Indexing media $media_id files\n" ++ if $self->{_verbose}; ++ ++ $media->traverse_headers($index); ++ } ++} ++ ++sub run { ++ my ($self, $media, $result) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a binary media check only ++ return unless $media->get_type() eq 'binary'; ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ return if $package->get_arch() eq 'src'; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ foreach my $file ($package->get_files()) { ++ ++ my $found = ++ $self->{_files}->{$file->[Youri::Package::FILE_NAME]}; ++ ++ my @found = $found ? @$found : (); ++ ++ foreach my $found (@found) { ++ next if $found->[PACKAGE] == $package; ++ next unless compatible($found->[PACKAGE], $package); ++ next if conflict($found->[PACKAGE], $package); ++ next if replace($found->[PACKAGE], $package); ++ if ( ++ ($file->[Youri::Package::FILE_MODE] & TYPE_MASK) == TYPE_DIR && ++ ($found->[MODE] & TYPE_MASK) == TYPE_DIR ++ ) { ++ $result->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "directory $file->[Youri::Package::FILE_NAME] duplicated with package " . $found->[PACKAGE]->get_name(), ++ level => Youri::Check::Input::WARNING ++ }) unless $self->_directory_duplicate_exception( ++ $package, ++ $found->[PACKAGE], ++ $file ++ ); ++ } else { ++ if ($found->[MD5SUM] eq $file->[Youri::Package::FILE_MD5SUM]) { ++ $result->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "file $file->[Youri::Package::FILE_NAME] duplicated with package " . $found->[PACKAGE]->get_name(), ++ level => Youri::Check::Input::WARNING ++ }) unless $self->_file_duplicate_exception( ++ $package, ++ $found->[PACKAGE], ++ $file ++ ); ++ } else { ++ $result->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "non-explicit conflict on file $file->[Youri::Package::FILE_NAME] with package " . $found->[PACKAGE]->get_name(), ++ level => Youri::Check::Input::ERROR ++ }) unless $self->_file_conflict_exception( ++ $package, ++ $found->[PACKAGE], ++ $file ++ ); ++ } ++ } ++ } ++ } ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++# return true if $package1 is arch-compatible with $package2 ++sub compatible { ++ my ($package1, $package2) = @_; ++ ++ my $arch1 = $package1->get_arch(); ++ my $arch2 = $package2->get_arch(); ++ ++ return 1 if $arch1 eq $arch2; ++ ++ return 1 if $compatibility->{$arch1} && $compatibility->{$arch1} eq $arch2; ++ ++ return 0; ++} ++ ++# return true if $package1 conflict with $package2 ++# or the other way around ++sub conflict { ++ my ($package1, $package2) = @_; ++ ++ my $name2 = $package2->get_name(); ++ ++ foreach my $conflict ($package1->get_conflicts()) { ++ return 1 if $conflict eq $name2; ++ } ++ ++ my $name1 = $package1->get_name(); ++ ++ foreach my $conflict ($package2->get_conflicts()) { ++ return 1 if $conflict eq $name1; ++ } ++ ++ return 0; ++} ++ ++# return true if $package1 replace $package2 ++sub replace { ++ my ($package1, $package2) = @_; ++ ++ ++ my $name1 = $package1->get_name(); ++ my $name2 = $package2->get_name(); ++ ++ return 1 if $name1 eq $name2; ++ ++ foreach my $obsolete ($package1->get_obsoletes()) { ++ return 1 if $obsolete->[Youri::Package::DEPENDENCY_NAME] eq $name2; ++ } ++ ++ return 0; ++} ++ ++sub _directory_duplicate_exception { ++ return 0; ++} ++ ++sub _file_duplicate_exception { ++ return 0; ++} ++ ++sub _file_conflict_exception { ++ return 0; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputDependenciespm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Dependencies.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,162 @@ ++# $Id: Dependencies.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Dependencies; ++ ++=head1 NAME ++ ++Youri::Check::Input::Dependencies - Check dependencies consistency ++ ++=head1 DESCRIPTION ++ ++This class checks dependencies consistency. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Package; ++use base 'Youri::Check::Input'; ++ ++use constant MEDIA => 0; ++use constant RANGE => 1; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ level ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++sub prepare { ++ my ($self, @medias) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ foreach my $media (@medias) { ++ my $media_id = $media->get_id(); ++ $self->{_medias}->{$media_id} = 1; ++ print STDERR "Indexing media $media_id dependencies\n" ++ if $self->{_verbose}; ++ ++ my $index = sub { ++ my ($package) = @_; ++ ++ # index provides ++ foreach my $provide ($package->get_provides()) { ++ push( ++ @{$self->{_provides}->{$provide->[Youri::Package::DEPENDENCY_NAME]}}, ++ [ $media_id, $provide->[Youri::Package::DEPENDENCY_RANGE] ] ++ ); ++ } ++ ++ # index files ++ foreach my $file ($package->get_files()) { ++ push( ++ @{$self->{_files}->{$file->[Youri::Package::FILE_NAME]}}, ++ [ $media_id, undef ] ++ ); ++ } ++ }; ++ $media->traverse_headers($index); ++ } ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @allowed_ids = $media->allow_deps(); ++ ++ # abort unless all allowed medias are present ++ foreach my $id (@allowed_ids) { ++ unless ($self->{_medias}->{$id}) { ++ carp "Missing media $id, aborting"; ++ return; ++ } ++ } ++ ++ # index allowed medias ++ my %allowed_ids = map { $_ => 1 } @allowed_ids; ++ my $allowed_ids = join(",", @allowed_ids); ++ ++ my $class = $media->get_package_class(); ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ foreach my $require ($package->get_requires()) { ++ ++ my $found = ++ substr($require->[Youri::Package::DEPENDENCY_NAME], 0, 1) eq '/' ? ++ $self->{_files}->{$require->[Youri::Package::DEPENDENCY_NAME]} : ++ $self->{_provides}->{$require->[Youri::Package::DEPENDENCY_NAME]}; ++ ++ my @found = $found ? @$found : (); ++ ++ if (!@found) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "$require->[Youri::Package::DEPENDENCY_NAME] not found", ++ level => Youri::Check::Input::ERROR ++ }); ++ next; ++ } ++ ++ my @found_in_media = ++ grep { $allowed_ids{$_->[MEDIA]} } ++ @found; ++ ++ if (!@found_in_media) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "$require->[Youri::Package::DEPENDENCY_NAME] found in incorrect media $_->[MEDIA] (allowed $allowed_ids)", ++ level => Youri::Check::Input::ERROR ++ }) foreach @found; ++ next; ++ } ++ ++ next unless $require->[Youri::Package::DEPENDENCY_RANGE]; ++ ++ my @found_in_range = ++ grep { ++ !$_->[RANGE] || ++ $class->compare_ranges( ++ $require->[Youri::Package::DEPENDENCY_RANGE], ++ $_->[RANGE] ++ ) ++ } @found_in_media; ++ ++ if (!@found_in_range) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "$require->[Youri::Package::DEPENDENCY_NAME] found with incorrect range $_->[RANGE] (needed $require->[Youri::Package::DEPENDENCY_RANGE])", ++ level => Youri::Check::Input::ERROR ++ }) foreach @found_in_media; ++ next; ++ } ++ } ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputMandrivaConflictspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/MandrivaConflicts.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,63 @@ ++# $Id: Conflicts.pm 533 2005-10-20 07:08:03Z guillomovitch $ ++package Youri::Check::Input::MandrivaConflicts; ++ ++=head1 NAME ++ ++Youri::Check::Input::MandrivaConflicts - Check file conflicts on Mandriva ++ ++=head1 DESCRIPTION ++ ++This class checks file conflicts between packages, taking care of Mandriva ++packaging policy. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Package; ++use base 'Youri::Check::Input::Conflicts'; ++ ++sub _directory_duplicate_exception { ++ my ($self, $package1, $package2, $file) = @_; ++ ++ # allow shared directories between devel packages of different arch ++ return 1 if _multiarch_exception($package1, $package2); ++ ++ # allow shared modules directories between perl packages ++ return 1 if ++ $file->[Youri::Package::FILE_NAME] =~ /^\/usr\/lib\/perl5\/vendor_perl\// && ++ $file->[Youri::Package::FILE_NAME] !~ /^(auto|[^\/]+-linux)$/; ++ ++ return 0; ++} ++ ++sub _file_duplicate_exception { ++ my ($self, $package1, $package2, $file) = @_; ++ ++ # allow shared files between devel packages of different arch ++ return 1 if _multiarch_exception($package1, $package2); ++ ++ return 0; ++} ++ ++sub _multiarch_exception { ++ my ($package1, $package2) = @_; ++ ++ return 1 if ++ $package1->get_canonical_name() eq $package2->get_canonical_name() ++ && $package1->get_name() =~ /-devel$/ ++ && $package2->get_name() =~ /-devel$/; ++ ++ return 0; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputMissingpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Missing.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,138 @@ ++package Youri::Check::Input::Missing; ++ ++=head1 NAME ++ ++Youri::Check::Input::Missing - Check components consistency ++ ++=head1 DESCRIPTION ++ ++This plugin checks consistency between package components, and report outdated ++ones. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use List::MoreUtils qw/all any/; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ component ++ arch ++ revision ++ error ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Missing object. ++ ++No specific parameters. ++ ++=cut ++ ++sub prepare { ++ my ($self, @medias) = @_; ++ croak "Not a class method" unless ref $self; ++ $self->{_srcs} = (); ++ foreach my $media (@medias) { ++ # only index source media ++ next unless $media->get_type() eq 'source'; ++ ++ my $media_id = $media->get_id(); ++ $self->{_medias}->{$media_id} = 1; ++ print STDERR "Indexing media $media_id packages\n" if $self->{_verbose}; ++ ++ my $index = sub { ++ my ($package) = @_; ++ $self->{_srcs}->{$media_id}->{$package->get_name()} = ++ $package->get_version() . '-' . $package->get_release(); ++ }; ++ ++ $media->traverse_headers($index); ++ } ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a binary media check only ++ return unless $media->get_type() eq 'binary'; ++ ++ my @allowed_ids = $media->allow_srcs(); ++ ++ # abort unless all allowed medias are present ++ foreach my $id (@allowed_ids) { ++ unless ($self->{_medias}->{$id}) { ++ carp "Missing media $id, aborting"; ++ return; ++ } ++ } ++ ++ my $class = $media->get_package_class(); ++ ++ my $check_package = sub { ++ my ($package) = @_; ++ my $canonical_name = $package->get_canonical_name(); ++ ++ my $bin_revision = ++ $package->get_version() . '-' . $package->get_release(); ++ ++ my $src_revision; ++ foreach my $id (@allowed_ids) { ++ $src_revision = $self->{_srcs}->{$id}->{$canonical_name}; ++ last if $src_revision; ++ } ++ ++ if ($src_revision) { ++ # check if revision match ++ unless ($src_revision eq $bin_revision) { ++ if ($class->compare_versions($src_revision, $bin_revision) > 0) { ++ # binary package is obsolete ++ $resultset->add_result($self->{_id}, $media, $package, { ++ component => $package->get_name(), ++ arch => $package->get_arch(), ++ revision => $bin_revision, ++ error => "Obsolete binaries (source $src_revision found)", ++ }); ++ } else { ++ # source package is obsolete ++ $resultset->add_result($self->{_id}, $media, $package, { ++ component => $package->get_canonical_name(), ++ arch => 'src', ++ revision => $src_revision, ++ error => "Obsolete source (binaries $bin_revision found)", ++ }); ++ } ++ } ++ } else { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ component => $package->get_name(), ++ arch => $package->get_arch(), ++ revision => $bin_revision, ++ error => "Missing source package", ++ }); ++ } ++ }; ++ ++ $media->traverse_headers($check_package); ++} ++ ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputOrphanspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Orphans.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,74 @@ ++package Youri::Check::Input::Orphans; ++ ++=head1 NAME ++ ++Youri::Check::Input::Orphans - Check maintainance ++ ++=head1 DESCRIPTION ++ ++This plugin checks maintainance status of packages, and reports unmaintained ++ones. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ error ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Orphans object. ++ ++No specific parameters. ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ resolver => undef, ++ @_ ++ ); ++ ++ croak "No resolver defined" unless $options{resolver}; ++ ++ $self->{_resolver} = $options{resolver}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a source media check only ++ return unless $media->get_type() eq 'source'; ++ ++ my $check = sub { ++ my ($package) = @_; ++ $resultset->add_result($self->{_id}, $media, $package, { ++ error => "unmaintained package" ++ }) unless $self->{_resolver}->get_maintainer($package); ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputRpmlintpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Rpmlint.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,113 @@ ++# $Id: Rpmlint.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Rpmlint; ++ ++=head1 NAME ++ ++Youri::Check::Input::Rpmlint - Check packages with rpmlint ++ ++=head1 DESCRIPTION ++ ++This plugins checks packages with rpmlint, and reports output. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ level ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Rpmlint object. ++ ++Specific parameters: ++ ++=over ++ ++=item path $path ++ ++Path to the rpmlint executable (default: /usr/bin/rpmlint) ++ ++=item config $config ++ ++Specific rpmlint configuration. ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ path => '/usr/bin/rpmlint', # path to rpmlint ++ config => '', # default rpmlint configuration ++ @_ ++ ); ++ ++ $self->{_path} = $options{path}; ++ $self->{_config} = $options{config}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $config = $media->rpmlint_config() ? ++ $media->rpmlint_config() : ++ $self->{_config}; ++ ++ my $check = sub { ++ my ($file, $package) = @_; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ my $command = "$self->{_path} -f $config $file"; ++ open(RPMLINT, "$command |") or die "Can't run $command: $!"; ++ while (<RPMLINT>) { ++ chomp; ++ if (/^E: \Q$name\E (.+)/) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => $1, ++ level => Youri::Check::Input::ERROR ++ }); ++ } elsif (/^W: \Q$name\E (.+)/) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => $1, ++ level => Youri::Check::Input::WARNING ++ }); ++ } ++ } ++ close(RPMLINT); ++ }; ++ ++ $media->traverse_files($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputSignaturepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Signature.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,96 @@ ++# $Id: Rpmlint.pm 567 2005-12-12 21:24:56Z guillomovitch $ ++package Youri::Check::Input::Signature; ++ ++=head1 NAME ++ ++Youri::Check::Input::Signature - Check signature ++ ++=head1 DESCRIPTION ++ ++This plugin checks packages signature, and report unsigned ones. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ arch ++ file ++ error ++ /; ++} ++ ++sub links { ++ return qw//; ++} ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Signature object. ++ ++Specific parameters: ++ ++=over ++ ++=item key $key ++ ++Expected GPG key identity ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ key => '', ++ @_ ++ ); ++ ++ $self->{_key} = $options{key}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $check = sub { ++ my ($package) = @_; ++ ++ my $arch = $package->get_arch(); ++ my $name = $package->get_name(); ++ ++ my $key = $package->get_gpg_key(); ++ ++ if (!$key) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "unsigned package $name" ++ }); ++ } elsif ($key ne $self->{_key}) { ++ $resultset->add_result($self->{_id}, $media, $package, { ++ arch => $arch, ++ file => $name, ++ error => "invalid key id $key for package $name (allowed $self->{_key})" ++ }); ++ } ++ ++ }; ++ ++ $media->traverse_headers($check); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceCPANpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/CPAN.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,75 @@ ++# $Id: CPAN.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::CPAN; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::CPAN - CPAN updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from CPAN. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::CPAN object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to CPAN full modules list (default: ++http://www.cpan.org/modules/01modules.index.html) ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://www.cpan.org/modules/01modules.index.html', ++ @_ ++ ); ++ ++ my $versions; ++ open(INPUT, "GET $options{url} |") or croak "Can't fetch $options{url}: $!"; ++ while (<INPUT>) { ++ next unless $_ =~ />([\w-]+)-([\d\.]+)\.tar\.gz<\/a>/; ++ $versions->{$1} = $2; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://search.cpan.org/dist/$name"; ++} ++ ++sub _name { ++ my ($self, $name) = @_; ++ $name =~ s/^perl-//g; ++ return $name; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceDebianpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Debian.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,82 @@ ++# $Id: Debian.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Debian; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Debian - Debian source for updates ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++ available from Debian. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Debian object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to Debian mirror content file (default: http://ftp.debian.org/ls-lR.gz) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://ftp.debian.org/ls-lR.gz', ++ @_ ++ ); ++ ++ my $versions; ++ open(INPUT, "GET $options{url} | zcat |") or croak "Can't fetch $options{url}: $!"; ++ while (my $line = <INPUT>) { ++ next unless $line =~ /([\w\.-]+)_([\d\.]+)\.orig\.tar\.gz$/; ++ my $name = $1; ++ my $version = $2; ++ $versions->{$name} = $version; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://packages.debian.org/$name"; ++} ++ ++sub _name { ++ my ($self, $name) = @_; ++ ++ if ($name =~ /^(perl|ruby)-([-\w]+)$/) { ++ $name = lc("lib$2-$1"); ++ } elsif ($name =~ /^apache-([-\w]+)$/) { ++ $name = "libapache-$1"; ++ $name =~ s/_/-/g; ++ } ++ ++ return $name; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFedorapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Fedora.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,63 @@ ++# $Id: Fedora.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Fedora; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Fedora - Fedora updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Fedora. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Fedora object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to Fedora development SRPMS directory (default: ++http://fr.rpmfind.net/linux/fedora/core/development/SRPMS) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://fr.rpmfind.net/linux/fedora/core/development/SRPMS', ++ @_ ++ ); ++ ++ my $versions; ++ open(INPUT, "GET $options{url} |") or die "Can't fetch $options{url}: $!\n"; ++ while (<INPUT>) { ++ next unless $_ =~ />([\w-]+)-([\w\.]+)-[\w\.]+\.src\.rpm<\/a>/; ++ $versions->{$1} = $2; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceFreshmeatpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Freshmeat.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,111 @@ ++# $Id: Freshmeat.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Freshmeat; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Freshmeat - Freshmeat source for updates ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Freshmeat. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use XML::Twig; ++use LWP::UserAgent; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Freshmeat ++object. ++ ++Specific parameters: ++ ++=over ++ ++=item preload true/false ++ ++Allows to load full Freshmeat catalogue at once instead of checking each software independantly (default: false) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ preload => 0, ++ @_ ++ ); ++ ++ if ($options{preload}) { ++ my $versions; ++ ++ my $project = sub { ++ my ($twig, $project) = @_; ++ my $name = $project->first_child('projectname_short')->text(); ++ my $version = $project->first_child('latest_release')->first_child('latest_release_version')->text(); ++ $versions->{$name} = $version; ++ $twig->purge(); ++ }; ++ ++ my $twig = XML::Twig->new( ++ TwigRoots => { project => $project } ++ ); ++ ++ my $url = 'http://download.freshmeat.net/backend/fm-projects.rdf.bz2'; ++ ++ open(INPUT, "GET $url | bzcat |") or die "Can't fetch $url: $!\n"; ++ $twig->parse(\*INPUT); ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++ } ++} ++ ++sub _version { ++ my ($self, $name) = @_; ++ ++ if ($self->{_versions}) { ++ return $self->{_versions}->{$name}; ++ } else { ++ my $version; ++ ++ my $latest_release_version = sub { ++ $version = $_[1]->text(); ++ }; ++ ++ my $twig = XML::Twig->new( ++ TwigRoots => { latest_release_version => $latest_release_version } ++ ); ++ ++ my $url = "http://freshmeat.net/projects-xml/$name"; ++ ++ open(INPUT, "GET $url |") or die "Can't fetch $url: $!\n"; ++ # freshmeat answer with an HTML page when project doesn't exist ++ $twig->safe_parse(\*INPUT); ++ close(INPUT); ++ ++ return $version; ++ } ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://freshmeat.net/projects/$name"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGNOMEpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/GNOME.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,104 @@ ++# $Id$ ++package Youri::Check::Input::Updates::Source::GNOME; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::GNOME - GNOME updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from GNOME. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use List::MoreUtils 'any'; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Gnome object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to GNOME sources directory (default: ++http://fr2.rpmfind.net/linux/gnome.org/sources) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://fr2.rpmfind.net/linux/gnome.org/sources/', # default url ++ # We use HTTP as it offers a better sorting (1.2 < 1.10) ++ @_ ++ ); ++ ++ $self->{_agent} = LWP::UserAgent->new(); ++ my $response = $self->{_agent}->get($options{url}); ++ if($response->is_success()) { ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /^([-\w]+)\/$/o; ++ $self->{_names}->{$1} = 1; ++ } ++ } ++ ++ $self->{_url} = $options{url}; ++} ++ ++sub _version { ++ my ($self, $name) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return unless $self->{_names}->{$name}; ++ ++ my $response = $self->{_agent}->get("$self->{_url}/$name/"); ++ if($response->is_success()) { ++ my $major; ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /^([.\d]+)\/$/o; ++ $major = $1; ++ } ++ return unless $major; ++ ++ $response = $self->{_agent}->get("$self->{_url}/$name/$major/"); ++ if($response->is_success()) { ++ $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $href = $token->[1]->{href}; ++ next unless $href =~ /^LATEST-IS-([.\d]+)$/o; ++ return $1; ++ } ++ } ++ } ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return $self->{_url}."$name/"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceGentoopm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Gentoo.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,75 @@ ++# $Id: Gentoo.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Gentoo; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Gentoo - Gentoo updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Gentoo. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::Simple; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Gentoo object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to Gentoo snapshots directory (default: ++http://gentoo.mirror.sdv.fr/snapshots) ++ ++=back ++ ++=cut ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://gentoo.mirror.sdv.fr/snapshots', # default URL ++ @_ ++ ); ++ ++ my $versions; ++ my $content = get($options{url}); ++ my $file; ++ while ($content =~ /<A HREF="(portage-\d{8}.tar.bz2)">/g) { ++ $file = $1; ++ } ++ open(INPUT, "GET $options{url}/$file | tar tjf - |") or croak "Can't fetch $options{url}/$file: $!"; ++ while (my $line = <INPUT>) { ++ next unless $line =~ /.*\/([\w-]+)-([\d\.]+)(:?-r\d)?\.ebuild$/; ++ $versions->{$1} = $2; ++ } ++ close(INPUT); ++ ++ $self->{_versions} = $versions; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://packages.gentoo.org/search/?sstring=$name"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceNetBSDpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/NetBSD.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,75 @@ ++# $Id$ ++package Youri::Check::Input::Updates::Source::NetBSD; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::NetBSD - NetBSD source for updates ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++ available from NetBSD. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Input::Updates::Source'; ++use IO::Ftp; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::NetBSD object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to NetBSD mirror content file, without ftp: (default: //ftp.free.fr/mirrors/ftp.netbsd.org/NetBSD-current/pkgsrc/README-all.html) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => '//ftp.free.fr/mirrors/ftp.netbsd.org/NetBSD-current/pkgsrc/README-all.html', ++ @_ ++ ); ++ ++ my $versions; ++ my $urls; ++ ++ my $in = IO::Ftp->new('<',$options{url}) or croak "Can't fetch $options{url}: $!"; ++ while (my $line = <$in>) { ++ next unless $line =~ /<!-- (.+)-([^-]*?)(nb\d*)? \(for sorting\).*?href="([^"]+)"/; ++ my $name = $1; ++ my $version = $2; ++ $versions->{$name} = $version; ++ $urls->{$name} = $4; ++ } ++ close($in); ++ ++ $self->{_versions} = $versions; ++ $self->{_urls} = $urls; ++ $self->{_url} = $options{url}; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return $self->{_urls}->{$name}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceRAApm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/RAA.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,121 @@ ++# $Id: RAA.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::RAA; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::RAA - RAA updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from RAA. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use SOAP::Lite; ++use List::MoreUtils 'any'; ++use Youri::Package; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::RAA object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++URL to RAA SOAP interface (default: ++http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4) ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => 'http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/', ++ @_ ++ ); ++ ++ my $raa = SOAP::Lite->service($options{url}) ++ or croak "Can't connect to $options{url}"; ++ ++ $self->{_raa} = $raa; ++ $self->{_names} = $raa->names(); ++} ++ ++sub get_version { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name; ++ if (ref $package && $package->isa('Youri::Package')) { ++ # don't bother checking for non-ruby packages ++ if ( ++ any { $_->[Youri::Package::DEPENDENCY_NAME] =~ /ruby/ } ++ $package->get_requires() ++ ) { ++ $name = $package->get_canonical_name(); ++ } else { ++ return; ++ } ++ } else { ++ $name = $package; ++ } ++ ++ # translate in grabber namespace ++ $name = $self->get_name($name); ++ ++ # return if aliased to null ++ return unless $name; ++ ++ # susceptible to throw exception for timeout ++ eval { ++ my $gem = $self->{_raa}->gem($name); ++ return $gem->{project}->{version} if $gem; ++ }; ++ ++ return; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://raa.ruby-lang.org/project/$name/"; ++} ++ ++sub _name { ++ my ($self, $name) = @_; ++ ++ if (ref $self) { ++ my $match = $name; ++ $match =~ s/^ruby[-_]//; ++ $match =~ s/[-_]ruby$//; ++ my @results = ++ grep { /^(ruby[-_])?\Q$match\E([-_]ruby)$/ } ++ @{$self->{_names}}; ++ if (@results) { ++ return $results[0]; ++ } else { ++ return $name; ++ } ++ } else { ++ return $name; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourceSourceforgepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,103 @@ ++# $Id: Sourceforge.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source::Sourceforge; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source::Sourceforge - Sourceforge updates source ++ ++=head1 DESCRIPTION ++ ++This source plugin for L<Youri::Check::Input::Updates> collects updates ++available from Sourceforge. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use LWP::UserAgent; ++use HTML::TokeParser; ++use Youri::Check::Input::Updates; ++use base 'Youri::Check::Input::Updates::Source'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates::Source::Sourceforge ++object. ++ ++No specific parameters. ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ @_ ++ ); ++ ++ $self->{_agent} = LWP::UserAgent->new(); ++} ++ ++sub get_version { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name; ++ if (ref $package && $package->isa('Youri::Package')) { ++ # don't bother checking for packages without sf.net URL ++ my $url = $package->get_url(); ++ if ( ++ $url =~ /http:\/\/(.*)\.sourceforge\.net/ || ++ $url =~ /http:\/\/.*sourceforge\.net\/projects\/([^\/]+)/ ++ ) { ++ $name = $package->get_canonical_name(); ++ } else { ++ return; ++ } ++ } else { ++ $name = $package; ++ } ++ ++ # translate in grabber namespace ++ $name = $self->get_name($name); ++ ++ # return if aliased to null ++ return unless $name; ++ ++ my $response = $self->{_agent}->get($self->_url($name)); ++ if($response->is_success()) { ++ my $max = 0; ++ my $parser = HTML::TokeParser->new(\$response->content()); ++ while (my $token = $parser->get_tag('a')) { ++ my $text = $parser->get_trimmed_text("/$token->[0]"); ++ next unless $text; ++ next unless $text =~ /^ ++ \Q$name\E ++ [._-]?($Youri::Check::Input::Updates::VERSION_REGEXP) ++ [._-]?(w(?:in)?(?:32)?|mips|sparc|bin|ppc|i\d86|src|sources?)? ++ \.(?:tar\.(?:gz|bz2)|tgz|zip) ++ $/iox; ++ my $version = $1; ++ my $arch = $2; ++ next if $arch && $arch !~ /(src|sources?)/; ++ $max = $version if Youri::Check::Input::Updates::is_newer($version, $max); ++ } ++ return $max if $max; ++ } ++ return; ++} ++ ++sub _url { ++ my ($self, $name) = @_; ++ return "http://prdownloads.sourceforge.net/$name/"; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatesSourcepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates/Source.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,240 @@ ++# $Id: Source.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates::Source; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates::Source - Abstract updates source ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the updates source interface for ++L<Youri::Check::Input::Updates>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates object. ++ ++Generic parameters (subclasses may define additional ones): ++ ++=over ++ ++=item aliases $aliases ++ ++Hash of package aliases. ++ ++=back ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ aliases => undef, # aliases ++ resolver => undef, # maintainer resolver ++ preferences => undef, # maintainer preferences ++ check_id => '', # parent check id ++ @_ ++ ); ++ ++ if ($options{aliases}) { ++ croak "aliases should be an hashref" unless ref $options{aliases} eq 'HASH'; ++ } ++ if ($options{resolver}) { ++ croak "resolver should be a Youri::Check::Maintainer::Resolver object" unless $options{resolver}->isa("Youri::Check::Maintainer::Resolver"); ++ } ++ if ($options{preferences}) { ++ croak "preferences should be a Youri::Check::Maintainer::Preferences object" unless $options{preferences}->isa("Youri::Check::Maintainer::Preferences"); ++ } ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _aliases => $options{aliases}, ++ _resolver => $options{resolver}, ++ _preferences => $options{preferences}, ++ _check_id => $options{check_id}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++Excepted explicit statement, package name is expressed with Mandriva naming ++conventions. ++ ++=head2 get_id() ++ ++Returns source identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 get_version($package) ++ ++Returns available version for given package, which can be either a full ++L<Youri::Package> object or just a package name. ++ ++=cut ++ ++sub get_version { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name = ref $package && $package->isa('Youri::Package') ? ++ $package->get_canonical_name() : ++ $package; ++ ++ # translate in grabber namespace ++ $name = $self->get_name($name); ++ ++ # return if aliased to null ++ return unless $name; ++ ++ # return subclass computation ++ return $self->_version($name); ++} ++ ++=head2 get_url($name) ++ ++Returns the URL of information source for package with given name. ++ ++=cut ++ ++sub get_url { ++ my ($self, $name) = @_; ++ ++ # retun subclass computation ++ return $self->_url($self->get_name($name)); ++} ++ ++=head2 name($name) ++ ++Returns name converted to specific source naming conventions for package with given name. ++ ++=cut ++ ++sub get_name { ++ my ($self, $name) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # return config aliases if it exists ++ if ($self->{_aliases} ) { ++ return $self->{_aliases}->{$name} if exists $self->{_aliases}->{$name}; ++ } ++ ++ # return maintainer aliases if it exists ++ if ($self->{_resolver} && $self->{_preferences}) { ++ my $maintainer = $self->{_resolver}->get_maintainer($name); ++ if ($maintainer) { ++ my $aliases = $self->{_preferences}->get_preference( ++ $maintainer, ++ $self->{_check_id}, ++ 'aliases' ++ ); ++ if ($aliases) { ++ if ($aliases->{all}) { ++ return $aliases->{all}->{$name} if exists $aliases->{all}->{$name}; ++ } ++ if ($aliases->{$self->{_id}}) { ++ return $aliases->{$self->{_id}}->{$name} if exists $aliases->{$self->{_id}}->{$name}; ++ } ++ } ++ } ++ } ++ ++ # return return subclass computation ++ return $self->_name($name); ++} ++ ++=head2 _version($name) ++ ++Hook called by default B<version()> implementation after name translation. ++ ++=cut ++ ++sub _version { ++ my ($self, $name) = @_; ++ return $self->{_versions}->{$name}; ++} ++ ++=head2 _url($name) ++ ++Hook called by default B<url()> implementation after name translation. ++ ++=cut ++ ++sub _url { ++ my ($self, $name) = @_; ++ return undef; ++} ++ ++=head2 _name($name) ++ ++Hook called by default B<name()> implementation if given name was not found in ++the aliases. ++ ++=cut ++ ++sub _name { ++ my ($self, $name) = @_; ++ return $name; ++} ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item version ++ ++As an alternative, the B<_version()> hook can be implemented. ++ ++=item url ++ ++As an alternative, the <_url()> hook can be implemented. ++ ++=item name ++ ++As an alternative, the B<_name()> hook can be implemented. ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputUpdatespm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input/Updates.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,275 @@ ++# $Id: Updates.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input::Updates; ++ ++=head1 NAME ++ ++Youri::Check::Input::Updates - Check available updates ++ ++=head1 DESCRIPTION ++ ++This plugin checks available updates for packages, and report existing ones. ++Additional source plugins handle specific sources. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use Youri::Utils; ++use base 'Youri::Check::Input'; ++ ++sub columns { ++ return qw/ ++ current ++ available ++ source ++ /; ++} ++ ++sub links { ++ return qw/ ++ source url ++ /; ++} ++ ++memoize('is_newer'); ++ ++our $VERSION_REGEXP = 'v?([\d._-]*\d)[._ -]*(?:(alpha|beta|pre|rc|pl|rev|cvs|svn|[a-z])[_ -.]*([\d.]*))?([_ -.]*.*)'; ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input::Updates object. ++ ++Specific parameters: ++ ++=over ++ ++=item aliases $aliases ++ ++Hash of global aliases definitions ++ ++=item sources $sources ++ ++Hash of source plugins definitions ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ aliases => undef, ++ sources => undef, ++ @_ ++ ); ++ ++ croak "No source defined" unless $options{sources}; ++ croak "sources should be an hashref" unless ref $options{sources} eq 'HASH'; ++ if ($options{aliases}) { ++ croak "aliases should be an hashref" unless ref $options{aliases} eq 'HASH'; ++ } ++ ++ foreach my $id (keys %{$options{sources}}) { ++ print "Creating source $id\n" if $options{verbose}; ++ eval { ++ # add global aliases if defined ++ if ($options{aliases}) { ++ foreach my $alias (keys %{$options{aliases}}) { ++ $options{sources}->{$id}->{aliases}->{$alias} = ++ $options{aliases}->{$alias} ++ } ++ } ++ ++ push( ++ @{$self->{_sources}}, ++ create_instance( ++ 'Youri::Check::Input::Updates::Source', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ check_id => $options{id}, ++ resolver => $options{resolver}, ++ preferences => $options{preferences}, ++ %{$options{sources}->{$id}} ++ ) ++ ); ++ }; ++ print STDERR "Failed to create source $id: $@\n" if $@; ++ } ++ ++ croak "no sources created" unless @{$self->{_sources}}; ++} ++ ++sub run { ++ my ($self, $media, $resultset) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # this is a source media check only ++ return unless $media->get_type() eq 'source'; ++ ++ my $callback = sub { ++ my ($package) = @_; ++ ++ my $name = $package->get_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ ++ # compute version with rpm subtilities related to preversions ++ my $current_version = ($release =~ /^0\.(\w+)\.\w+$/) ? ++ $version . $1 : ++ $version; ++ my $current_stable = is_stable($current_version); ++ ++ my ($max_version, $max_source, $max_url); ++ $max_version = $current_version; ++ ++ foreach my $source (@{$self->{_sources}}) { ++ my $available_version = $source->get_version($package); ++ if ( ++ $available_version && ++ (! $current_stable || is_stable($available_version)) && ++ is_newer($available_version, $max_version) ++ ) { ++ $max_version = $available_version; ++ $max_source = $source->get_id(); ++ $max_url = $source->get_url($name); ++ } ++ } ++ $resultset->add_result($self->{_id}, $media, $package, { ++ current => $current_version, ++ available => $max_version, ++ source => $max_source, ++ url => $max_url ++ }) if $max_version ne $current_version; ++ }; ++ ++ $media->traverse_headers($callback); ++} ++ ++=head2 is_stable($version) ++ ++Checks if given version is stable. ++ ++=cut ++ ++sub is_stable { ++ my ($version) = @_; ++ return $version !~ /alpha|beta|pre|rc|cvs|svn/i; ++ ++} ++ ++=head2 is_newer($v1, $v2) ++ ++Checks if $v1 is newer than $v2. ++ ++This function will return true only if we are sure this is newer (and not equal). ++If we can't compare the versions, a warning will be displayed. ++ ++=cut ++ ++sub is_newer { ++ my ($v1, $v2) = @_; ++ return 0 if $v1 eq $v2; ++ ++ # Reject strange cases ++ # One is a large number (like date or revision) and the other one not, or ++ # has different length ++ if (($v1 =~ /^\d{3,}$/ || $v2 =~ /^\d{3,}$/) ++ && (join('0',split(/\d/, $v1."X")) ne join('0',split(/\d/, $v2."X")))) { ++ carp "strange : $v1 vs $v2"; ++ return 0; ++ } ++ ++ my %states = (alpha=>-4,beta=>-3,pre=>-2,rc=>-1); ++ my $i; $states{$_} = ++$i foreach 'a'..'z'; ++ ++ if ($v1 =~ /^[\d._-]+$/ && $v2 =~ /^[\d._-]+$/) { ++ my @v1 = split(/[._-]/, $v1); ++ my @v2 = split(/[._-]/, $v2); ++ if (join('',@v1) eq (join '',@v2)) { ++ # Might be something like 1.2.0 vs 1.20, usual false positive ++ carp "strange : $v1 vs $v2"; ++ return 0; ++ } ++ for my $i (0 .. $#v1) { ++ $v1[$i] ||= 0; ++ $v2[$i] ||= 0; ++ return 1 if $v1[$i] > $v2[$i]; ++ return 0 if $v1[$i] < $v2[$i]; ++ } ++ # When v2 is longer than v1 but start the same, v1 <= v2 ++ return 0; ++ } else { ++ my ($num1, $state1, $statenum1, $other1, $num2, $state2, $statenum2, $other2); ++ ++ if ($v1 =~ /^$VERSION_REGEXP$/io) { ++ ($num1, $state1, $statenum1, $other1) = ($1, "\L$2", $3, $4); ++ } else { ++ carp "unknown version format $v1"; ++ return 0; ++ } ++ ++ if ($v2 =~ /^$VERSION_REGEXP$/io) { ++ ($num2, $state2, $statenum2, $other2) = ($1, "\L$2", $3, $4); ++ } else { ++ carp "unknown version format $v2"; ++ return 0; ++ } ++ ++ # If we know the format of only one, there might be an issue, do nothing ++ ++ if (($other1 && ! $other2 )||(!$other1 && $other2 )) { ++ carp "can't compare $v1 vs $v2"; ++ return 0; ++ } ++ ++ return 1 if is_newer($num1, $num2); ++ return 0 unless $num1 eq $num2; ++ ++ # The numeric part is the same but not the end ++ ++ if ($state1 eq '') { ++ return 1 if $state2 =~ /^(alpha|beta|pre|rc)/; ++ return 0 if $state2 =~ /^([a-z]|pl)$/; ++ carp "unknown state format $state2"; ++ return 0; ++ } ++ ++ if ($state2 eq '') { ++ return 0 if $state1 =~ /^(alpha|beta|pre|rc)/; ++ return 1 if $state1 =~ /^([a-z]|pl)$/; ++ carp "unknown state format $state1"; ++ return 0; ++ } ++ ++ if ($state1 eq $state2) { ++ return 1 if is_newer($statenum1, $statenum2); ++ return 0 unless $statenum1 eq $statenum2; ++ # If everything is the same except this, just compare it ++ # as we have no idea on the format ++ return "$other1" gt "$other2"; ++ } ++ ++ my $s1 = 0; ++ my $s2 = 0; ++ $s1=$states{$state1} if exists $states{$state1}; ++ $s2=$states{$state2} if exists $states{$state2}; ++ return $s1>$s2 if ($s1 != 0 && $s2 != 0); ++ return 1 if $s1<0 && $state2 =~ /^([a-z]|pl)$/; ++ return 0 if $s2<0 && $state1 =~ /^([a-z]|pl)$/; ++ carp "unknown case $v1, $v2"; ++ return 0; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckInputpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Input.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,120 @@ ++# $Id: Input.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Input; ++ ++=head1 NAME ++ ++Youri::Check::Input - Abstract input plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines input plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++ ++use constant WARNING => 'warning'; ++use constant ERROR => 'error'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Input object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', # object id ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ resolver => undef, # maintainer resolver ++ preferences => undef, # maintainer preferences ++ @_ ++ ); ++ ++ if ($options{resolver}) { ++ croak "resolver should be a Youri::Check::Maintainer::Resolver object" unless $options{resolver}->isa("Youri::Check::Maintainer::Resolver"); ++ } ++ if ($options{preferences}) { ++ croak "preferences should be a Youri::Check::Maintainer::Preferences object" unless $options{preferences}->isa("Youri::Check::Maintainer::Preferences"); ++ } ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _resolver => $options{resolver}, ++ _preferences => $options{preferences}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns plugin identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 prepare(@medias) ++ ++Perform optional preliminary initialisation, using given list of ++<Youri::Media> objects. ++ ++=cut ++ ++sub prepare { ++ # do nothing ++} ++ ++=head2 run($media, $resultset) ++ ++Check the packages from given L<Youri::Media> object, and store the ++result in given L<Youri::Check::Resultset> object. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item run ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencesFilepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences/File.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,87 @@ ++# $Id: File.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Preferences::File; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Preferences::File - File-based maintainer preferences implementation ++ ++=head1 DESCRIPTION ++ ++This is a file-based L<Youri::Check::Maintainer::Preferences> implementation. ++ ++It uses files in maintainer home directories. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Config; ++use base 'Youri::Check::Maintainer::Preferences'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Preferences::File object. ++ ++No specific parameters. ++ ++=cut ++ ++sub get_preference { ++ my ($self, $maintainer, $plugin, $value) = @_; ++ croak "Not a class method" unless ref $self; ++ return unless $maintainer && $plugin && $value; ++ ++ print "Retrieving maintainer $maintainer preferences\n" ++ if $self->{_verbose} > 0; ++ ++ $self->_load_config($maintainer) ++ unless exists $self->{_config}->{$maintainer}; ++ ++ return $self->{_config}->{$maintainer} ? ++ $self->{_config}->{$maintainer}->get($plugin . '_' . $value) : ++ undef; ++} ++ ++sub _load_config { ++ my ($self, $maintainer) = @_; ++ ++ print "Attempting to load maintainers preferences for $maintainer\n" if $self->{_verbose} > 1; ++ ++ ++ my ($login) = $maintainer =~ /^(\S+)\@\S+$/; ++ my $home = (getpwnam($login))[7]; ++ my $file = "$home/.youri/check.prefs"; ++ ++ if (-f $file && -r $file) { ++ print "Found, loading\n" if $self->{_verbose} > 1; ++ my $config = Youri::Config->new( ++ { ++ CREATE => 1, ++ GLOBAL => { ++ DEFAULT => undef, ++ EXPAND => EXPAND_VAR | EXPAND_ENV, ++ ARGCOUNT => ARGCOUNT_ONE, ++ } ++ } ++ ); ++ $config->file($file); ++ $self->{_config}->{$maintainer} = $config; ++ } else { ++ print "Not found, aborting\n" if $self->{_verbose} > 1; ++ $self->{_config}->{$maintainer} = undef; ++ } ++ ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerPreferencespm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Preferences.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,80 @@ ++# $Id: Preferences.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Preferences; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Preferences - Abstract maintainer preferences ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Check::Maintainer::Preferences interface. ++ ++=head1 SYNOPSIS ++ ++ use Youri::Check::Maintainer::Preferences::Foo; ++ ++ my $preferences = Youri::Check::Maintainer::Preferences::Foo->new(); ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Preferences object. ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_preference($maintainer, $plugin, $item) ++ ++Returns preference of given maintainer for given plugin and configuration item. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item get ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverBugzillapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/Bugzilla.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,100 @@ ++# $Id: Bugzilla.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Resolver::Bugzilla; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Resolver::Bugzilla - Bugzilla-based maintainer resolver ++ ++=head1 DESCRIPTION ++ ++This is a Bugzilla-based L<Youri::Check::Maintainer::Resolver> implementation. ++ ++It uses Bugzilla SQL database for resolving maintainers. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Bugzilla; ++use base 'Youri::Check::Maintainer::Resolver'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Resolver::Bugzilla object. ++ ++Specific parameters: ++ ++=over ++ ++=item host $host ++ ++Bugzilla database host. ++ ++=item base $base ++ ++Bugzilla database name. ++ ++=item user $user ++ ++Bugzilla database user. ++ ++=item pass $pass ++ ++Bugzilla database password. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ host => '', # host of the bug database ++ base => '', # name of the bug database ++ user => '', # user of the bug database ++ pass => '', # pass of the bug database ++ @_ ++ ); ++ ++ croak "No host given" unless $options{host}; ++ croak "No base given" unless $options{base}; ++ croak "No user given" unless $options{user}; ++ croak "No pass given" unless $options{pass}; ++ ++ my $bugzilla = Youri::Bugzilla->new( ++ $options{host}, ++ $options{base}, ++ $options{user}, ++ $options{pass} ++ ); ++ ++ $self->{_bugzilla} = $bugzilla; ++} ++ ++sub get_maintainer { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name = ref $package && $package->isa('Youri::Package') ? ++ $package->get_canonical_name() : ++ $package; ++ ++ $self->{_maintainers}->{$name} = ++ $self->{_bugzilla}->get_maintainer($name) ++ unless exists $self->{_maintainers}->{$name}; ++ ++ return $self->{_maintainers}->{$name}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverCGIpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver/CGI.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,79 @@ ++# $Id: CGI.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Resolver::CGI; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Resolver::CGI - CGI-based maintainer resolver ++ ++=head1 DESCRIPTION ++ ++This is a CGI-based L<Youri::Check::Maintainer::Resolver> implementation. ++ ++It uses a remote CGI to resolve maintainers. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Maintainer::Resolver'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Resolver::CGI object. ++ ++Specific parameters: ++ ++=over ++ ++=item url $url ++ ++CGI's URL. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ url => '', # url to fetch maintainers ++ @_ ++ ); ++ ++ croak "No URL given" unless $options{url}; ++ ++ open (INPUT, "GET $options{url} |"); ++ while (<INPUT>) { ++ chomp; ++ my ($package, $maintainer) = split(/\t/, $_); ++ $self->{_maintainers}->{$package} = $maintainer if $maintainer; ++ } ++ close(INPUT); ++} ++ ++sub get_maintainer { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ print "Retrieving package $package maintainer\n" ++ if $self->{_verbose} > 0; ++ ++ my $name = ref $package && $package->isa('Youri::Package') ? ++ $package->get_canonical_name() : ++ $package; ++ ++ return $self->{_maintainers}->{$name}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckMaintainerResolverpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Maintainer/Resolver.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,86 @@ ++# $Id: Resolver.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Maintainer::Resolver; ++ ++=head1 NAME ++ ++Youri::Check::Maintainer::Resolver - Abstract maintainer resolver ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Check::Maintainer::Resolver interface. ++ ++=head1 SYNOPSIS ++ ++ use Youri::Check::Maintainer::Resolver::Foo; ++ ++ my $resolver = Youri::Check::Maintainer::Resolver::Foo->new(); ++ ++ print $resolver->get_maintainer('foo'); ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Maintainer::Resolver object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ my $self = bless { ++ _test => $options{test}, ++ _verbose => $options{verbose} ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_maintainer($package) ++ ++Returns maintainer for given package, which can be either a full ++L<Youri::Package> object or just a package name. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item get_maintainer ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatHTMLpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/HTML.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,222 @@ ++# $Id: HTML.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output::File::Format::HTML; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format::HTML - File HTML format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::File> provides HTML format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use CGI; ++use base 'Youri::Check::Output::File::Format'; ++ ++sub extension { ++ return 'html'; ++} ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ style => <<EOF, # css style ++h1 { ++ text-align:center; ++} ++table { ++ border-style:solid; ++ border-width:1px; ++ border-color:black; ++ width:100%; ++} ++tr.odd { ++ background-color:white; ++} ++tr.even { ++ background-color:silver; ++} ++p.footer { ++ font-size:smaller; ++ text-align:center; ++} ++EOF ++ @_ ++ ); ++ ++ $self->{_style} = $options{style}; ++ $self->{_cgi} = CGI->new(); ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $content; ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my $line; ++ my @results; ++ $content .= $self->{_cgi}->start_table(); ++ $content .= $self->{_cgi}->Tr([ ++ $self->{_cgi}->th([ ++ @$lead_columns, ++ @$columns ++ ]) ++ ]); ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ $content .= $self->{_cgi}->end_table(); ++ ++ return $self->_get_html_page($time, $title, \$content); ++} ++ ++sub get_index { ++ my ($self, $time, $title, $reports, $maintainers) = @_; ++ ++ my $content; ++ ++ if ($reports) { ++ $content .= $self->{_cgi}->h2("Reports"); ++ my @types = keys %{$reports}; ++ ++ $content .= $self->{_cgi}->start_ul(); ++ foreach my $type (sort @types) { ++ my $item; ++ $item = $self->{_cgi}->a( ++ { href => "$type.html" }, ++ $type ++ ); ++ foreach my $extension (@{$reports->{$type}}) { ++ next if ($extension eq extension()); ++ $item .= " ".$self->{_cgi}->a( ++ { href => "$type.$extension" }, ++ "[$extension]" ++ ); ++ } ++ $content .= $self->{_cgi}->li($item); ++ } ++ $content .= $self->{_cgi}->end_ul(); ++ } ++ ++ if ($maintainers) { ++ $content .= $self->{_cgi}->h2("Individual reports"); ++ ++ $content .= $self->{_cgi}->start_ul(); ++ foreach my $maintainer (sort @{$maintainers}) { ++ $content .= $self->{_cgi}->li( ++ $self->{_cgi}->a( ++ { href => "$maintainer/index.html" }, ++ _obfuscate($maintainer) ++ ) ++ ); ++ } ++ $content .= $self->{_cgi}->end_ul(); ++ } ++ ++ return $self->_get_html_page($time, $title, \$content); ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $links, $class, $results) = @_; ++ ++ my $content; ++ $content .= $self->{_cgi}->end_Tr(); ++ for my $i (0 .. $#$results) { ++ $content .= $self->{_cgi}->start_Tr( ++ { class => $class } ++ ); ++ if ($i == 0) { ++ # first line contains spanned cells ++ $content .= $self->{_cgi}->td( ++ { rowspan => scalar @$results }, ++ [ ++ map { $results->[$i]->{$_} } ++ @$lead_columns ++ ] ++ ); ++ } ++ $content .= $self->{_cgi}->td( ++ [ ++ map { ++ $links->{$_} && $results->[$i]->{$links->{$_}} ? ++ $self->{_cgi}->a( ++ { href => $results->[$i]->{$links->{$_}} }, ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ ) : ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ } @$columns ++ ] ++ ); ++ $content .= $self->{_cgi}->end_Tr(); ++ } ++ ++ return $content; ++} ++ ++ ++sub _get_html_page { ++ my ($self, $time, $title, $body) = @_; ++ ++ my $content; ++ $content .= $self->{_cgi}->start_html( ++ -title => $title, ++ -style => { code => $self->{_style} } ++ ); ++ $content .= $self->{_cgi}->h1($title); ++ $content .= $$body; ++ $content .= $self->{_cgi}->hr(); ++ $content .= $self->{_cgi}->p( ++ { class => 'footer' }, ++ "Page generated $time" ++ ); ++ $content .= $self->{_cgi}->end_html(); ++ ++ return \$content; ++} ++ ++sub _obfuscate { ++ my ($email) = @_; ++ ++ return unless $email; ++ ++ $email =~ s/\@/ at /; ++ $email =~ s/\./ dot /; ++ ++ return $email; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatRSSpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/RSS.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,68 @@ ++# $Id$ ++package Youri::Check::Output::File::Format::RSS; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format::RSS - File RSS format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::File> provides RSS format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use XML::RSS; ++use base 'Youri::Check::Output::File::Format'; ++ ++sub extension { ++ return 'rss'; ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ return unless $maintainer; ++ ++ my $rss = new XML::RSS (version => '2.0'); ++ $rss->channel( ++ title => $title, ++ description => $title, ++ language => 'en', ++ ttl => 1440 ++ ); ++ ++ while (my $result = $iterator->get_result()) { ++ if ($type eq 'updates') { ++ $rss->add_item( ++ title => "$result->{package} $result->{available} is available", ++ description => "Current version is $result->{current}", ++ link => $result->{url} ? ++ $result->{url} : $result->{source}, ++ guid => "$result->{package}-$result->{available}" ++ ); ++ } else { ++ $rss->add_item( ++ title => "[$type] $result->{package}", ++ description => join("\n", (map { $result->{$_} || '' } @$columns)), ++ link => $result->{url}, ++ guid => "$type-$result->{package}" ++ ); ++ } ++ } ++ ++ return \$rss->as_string(); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatTextpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format/Text.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,88 @@ ++# $Id: Text.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output::File::Format::Text; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format::Text - File text format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::File> provides text format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Output::File::Format'; ++ ++sub extension { ++ return 'txt'; ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $content; ++ $content .= $title; ++ $content .= "\n"; ++ ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my @results; ++ $content .= join("\t", @$lead_columns, @$columns) . "\n"; ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ ++ $content .= "\n"; ++ $content .= "Page generated $time\n"; ++ ++ return \$content; ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $results) = @_; ++ ++ my $content; ++ $content .= join( ++ "\t", ++ (map { $results->[0]->{$_} || '' } @$lead_columns), ++ (map { $results->[0]->{$_} || '' } @$columns) ++ ) . "\n"; ++ for my $i (1 .. $#$results) { ++ $content .= join( ++ "\t", ++ (map { '' } @$lead_columns), ++ (map { $results->[$i]->{$_} || '' } @$columns) ++ ) . "\n"; ++ } ++ return $content; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFileFormatpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File/Format.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,66 @@ ++# $Id: Base.pm 579 2006-01-09 21:17:54Z guillomovitch $ ++package Youri::Check::Output::File::Format; ++ ++=head1 NAME ++ ++Youri::Check::Output::File::Format - Abstract file format support ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the format support interface for ++L<Youri::Check::Output::File>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', ++ test => 0, ++ verbose => 0, ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_id() ++ ++Returns format handler identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputFilepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/File.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,203 @@ ++# $Id: Text.pm 523 2005-10-11 08:36:49Z misc $ ++package Youri::Check::Output::File; ++ ++=head1 NAME ++ ++Youri::Check::Output::File - Report results in files ++ ++=head1 DESCRIPTION ++ ++This plugin reports results in files. Additional subplugins handle specific ++formats. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use File::Path; ++use DateTime; ++use Youri::Utils; ++use base 'Youri::Check::Output'; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ to => '', # target directory ++ noclean => 0, # don't clean up target directory ++ noempty => 0, # don't generate empty reports ++ formats => undef, ++ @_ ++ ); ++ ++ croak "no format defined" unless $options{formats}; ++ croak "formats should be an hashref" unless ref $options{formats} eq 'HASH'; ++ ++ my $now = DateTime->now(time_zone => 'local'); ++ my $time = "the " . $now->ymd() . " at " . $now->hms(); ++ ++ $self->{_to} = $options{to}; ++ $self->{_noclean} = $options{noclean}; ++ $self->{_noempty} = $options{noempty}; ++ $self->{_time} = $time; ++ ++ foreach my $id (keys %{$options{formats}}) { ++ print "Creating format $id\n" if $options{verbose}; ++ eval { ++ push( ++ @{$self->{_formats}}, ++ create_instance( ++ 'Youri::Check::Output::File::Format', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ %{$options{formats}->{$id}} ++ ) ++ ); ++ }; ++ print STDERR "Failed to create format $id: $@\n" if $@; ++ } ++ ++ croak "no formats created" unless @{$self->{_formats}}; ++} ++ ++sub _init_report { ++ my ($self) = @_; ++ ++ # clean up output directory ++ unless ($self->{_test} || $self->{_noclean} || !$self->{_to}) { ++ my @files = glob($self->{_to} . '/*'); ++ rmtree(\@files) if @files; ++ } ++} ++ ++sub _global_report { ++ my ($self, $resultset, $type, $columns, $links) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ] ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type global report", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ undef ++ ); ++ ++ # create and register file ++ my $extension = $format->extension(); ++ $self->_write_file( ++ "$self->{_to}/$type.$extension", ++ $content ++ ); ++ push( ++ @{$self->{_files}->{global}->{$type}}, ++ $extension ++ ); ++ } ++} ++ ++sub _individual_report { ++ my ($self, $resultset, $type, $columns, $links, $maintainer) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ], ++ { maintainer => [ $maintainer ] } ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type individual report for $maintainer", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ $maintainer ++ ); ++ ++ # create and register file ++ my $extension = $format->extension(); ++ $self->_write_file( ++ "$self->{_to}/$maintainer/$type.$extension", ++ $content ++ ); ++ push( ++ @{$self->{_files}->{maintainers}->{$maintainer}->{$type}}, ++ $extension ++ ); ++ } ++} ++ ++sub _finish_report { ++ my ($self, $types, $maintainers) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ next unless $format->can('get_index'); ++ my $extension = $format->extension(); ++ print STDERR "writing global index page\n" if $self->{_verbose}; ++ $self->_write_file( ++ "$self->{_to}/index.$extension", ++ $format->get_index( ++ $self->{_time}, ++ "QA global report", ++ $self->{_files}->{global}, ++ [ keys %{$self->{_files}->{maintainers}} ], ++ ) ++ ); ++ foreach my $maintainer (@$maintainers) { ++ print STDERR "writing index page for $maintainer\n" if $self->{_verbose}; ++ ++ $self->_write_file( ++ "$self->{_to}/$maintainer/index.$extension", ++ $format->get_index( ++ $self->{_time}, ++ "QA report for $maintainer", ++ $self->{_files}->{maintainers}->{$maintainer}, ++ undef, ++ ) ++ ); ++ } ++ } ++} ++ ++sub _write_file { ++ my ($self, $file, $content) = @_; ++ ++ return unless $content; ++ ++ my $dirname = dirname($file); ++ mkpath($dirname) unless -d $dirname; ++ ++ if ($self->{_test}) { ++ *OUT = *STDOUT; ++ } else { ++ open(OUT, ">$file") or die "Can't open file $file: $!"; ++ } ++ ++ print OUT $$content; ++ ++ close(OUT) unless $self->{_test}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatHTMLpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/HTML.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,158 @@ ++# $Id: Mail.pm 580 2006-01-11 22:59:36Z guillomovitch $ ++package Youri::Check::Output::Mail::Format::HTML; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail::Format::HTML - Mail HTML format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::Mail> provides HTML format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use CGI; ++use base 'Youri::Check::Output::Mail::Format'; ++ ++sub type { ++ return 'text/html'; ++} ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ style => <<EOF, # css style ++h1 { ++ text-align:center; ++} ++table { ++ border-style:solid; ++ border-width:1px; ++ border-color:black; ++ width:100%; ++} ++tr.odd { ++ background-color:white; ++} ++tr.even { ++ background-color:silver; ++} ++p.footer { ++ font-size:smaller; ++ text-align:center; ++} ++EOF ++ @_ ++ ); ++ ++ $self->{_style} = $options{style}; ++ $self->{_cgi} = CGI->new(); ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $body; ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my $line; ++ my @results; ++ $body .= $self->{_cgi}->start_table(); ++ $body .= $self->{_cgi}->Tr([ ++ $self->{_cgi}->th([ ++ @$lead_columns, ++ @$columns ++ ]) ++ ]); ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $body .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ $body .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ $links, ++ $line++ % 2 ? 'odd' : 'even', ++ \@results ++ ); ++ $body .= $self->{_cgi}->end_table(); ++ ++ my $content; ++ $content .= $self->{_cgi}->start_html( ++ -title => $title, ++ -style => { code => $self->{_style} } ++ ); ++ $content .= $self->{_cgi}->h1($title); ++ $content .= $body; ++ $content .= $self->{_cgi}->hr(); ++ $content .= $self->{_cgi}->p( ++ { class => 'footer' }, ++ "Page generated $time" ++ ); ++ $content .= $self->{_cgi}->end_html(); ++ ++ return \$content; ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $links, $class, $results) = @_; ++ ++ my $content; ++ $content .= $self->{_cgi}->end_Tr(); ++ for my $i (0 .. $#$results) { ++ $content .= $self->{_cgi}->start_Tr( ++ { class => $class } ++ ); ++ if ($i == 0) { ++ # first line contains spanned cells ++ $content .= $self->{_cgi}->td( ++ { rowspan => scalar @$results }, ++ [ ++ map { $results->[$i]->{$_} } ++ @$lead_columns ++ ] ++ ); ++ } ++ $content .= $self->{_cgi}->td( ++ [ ++ map { ++ $links->{$_} && $results->[$i]->{$links->{$_}} ? ++ $self->{_cgi}->a( ++ { href => $results->[$i]->{$links->{$_}} }, ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ ) : ++ $self->{_cgi}->escapeHTML($results->[$i]->{$_}) ++ } @$columns ++ ] ++ ); ++ $content .= $self->{_cgi}->end_Tr(); ++ } ++ ++ return $content; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatTextpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format/Text.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,83 @@ ++# $Id: Mail.pm 580 2006-01-11 22:59:36Z guillomovitch $ ++package Youri::Check::Output::Mail::Format::Text; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail::Format::Text - Mail text format support ++ ++=head1 DESCRIPTION ++ ++This format plugin for L<Youri::Check::Output::Mail> provides text format ++support. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use base 'Youri::Check::Output::Mail::Format'; ++ ++sub type { ++ return 'text/plain'; ++} ++ ++sub get_report { ++ my ($self, $time, $title, $iterator, $type, $columns, $links, $maintainer) = @_; ++ ++ my $content; ++ my $lead_columns = [ ++ $maintainer ? ++ qw/package media/ : ++ qw/package media maintainer/ ++ ]; ++ my @results; ++ $content .= join("\t", @$lead_columns, @$columns) . "\n"; ++ while (my $result = $iterator->get_result()) { ++ if (@results && $result->{package} ne $results[0]->{package}) { ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ @results = (); ++ } ++ push(@results, $result); ++ } ++ ++ $content .= $self->_get_formated_results( ++ $lead_columns, ++ $columns, ++ \@results ++ ); ++ ++ return \$content; ++} ++ ++sub _get_formated_results { ++ my ($self, $lead_columns, $columns, $results) = @_; ++ ++ my $content; ++ $content .= join( ++ "\t", ++ (map { $results->[0]->{$_} || '' } @$lead_columns), ++ (map { $results->[0]->{$_} || '' } @$columns) ++ ) . "\n"; ++ for my $i (1 .. $#$results) { ++ $content .= join( ++ "\t", ++ (map { '' } @$lead_columns), ++ (map { $results->[$i]->{$_} || '' } @$columns) ++ ) . "\n"; ++ } ++ return $content; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailFormatpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail/Format.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,66 @@ ++# $Id: Base.pm 579 2006-01-09 21:17:54Z guillomovitch $ ++package Youri::Check::Output::Mail::Format; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail::Format - Abstract mail format support ++ ++=head1 DESCRIPTION ++ ++This abstract class defines the format support interface for ++L<Youri::Check::Output::Mail>. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', ++ test => 0, ++ verbose => 0, ++ @_ ++ ); ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_id() ++ ++Returns format handler identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputMailpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output/Mail.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,156 @@ ++# $Id: Mail.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output::Mail; ++ ++=head1 NAME ++ ++Youri::Check::Output::Mail - Report results by mail ++ ++=head1 DESCRIPTION ++ ++This plugin reports results by mail. Additional subplugins handle specific ++formats. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use MIME::Entity; ++use Youri::Utils; ++use base 'Youri::Check::Output'; ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ from => '', # mail from header ++ to => '', # mail to header ++ reply_to => '', # mail reply-to header ++ mta => '', # mta path ++ noempty => 1, # don't generate empty reports ++ formats => {}, ++ @_ ++ ); ++ ++ croak "no format defined" unless $options{formats}; ++ croak "formats should be an hashref" unless ref $options{formats} eq 'HASH'; ++ ++ $self->{_from} = $options{from}; ++ $self->{_to} = $options{to}; ++ $self->{_reply_to} = $options{reply_to}; ++ $self->{_mta} = $options{mta}; ++ $self->{_noempty} = $options{noempty}; ++ ++ foreach my $id (keys %{$options{formats}}) { ++ print "Creating format $id\n" if $options{verbose}; ++ eval { ++ push( ++ @{$self->{_formats}}, ++ create_instance( ++ 'Youri::Check::Output::Mail::Format', ++ id => $id, ++ test => $options{test}, ++ verbose => $options{verbose}, ++ %{$options{formats}->{$id}} ++ ) ++ ); ++ }; ++ print STDERR "Failed to create format $id: $@\n" if $@; ++ } ++ ++ croak "no formats created" unless @{$self->{_formats}}; ++} ++ ++sub _global_report { ++ my ($self, $resultset, $type, $columns, $links) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ] ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type global report", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ undef ++ ); ++ ++ $self->_send_mail( ++ $format->type(), ++ $self->{_to}, ++ "$type global report", ++ $content, ++ ); ++ } ++} ++ ++sub _individual_report { ++ my ($self, $resultset, $type, $columns, $links, $maintainer) = @_; ++ ++ foreach my $format (@{$self->{_formats}}) { ++ my $iterator = $resultset->get_iterator( ++ $type, ++ [ 'package' ], ++ { maintainer => [ $maintainer ] } ++ ); ++ ++ return if $self->{_noempty} && ! $iterator->has_results(); ++ ++ my $content = $format->get_report( ++ $self->{_time}, ++ "$type individual report for $maintainer", ++ $iterator, ++ $type, ++ $columns, ++ $links, ++ $maintainer ++ ); ++ ++ $self->_send_mail( ++ $format->type(), ++ $maintainer, ++ "$type individual report for $maintainer", ++ $content, ++ ); ++ } ++ ++} ++ ++sub _send_mail { ++ my ($self, $type, $to, $subject, $content) = @_; ++ ++ return unless $content; ++ ++ my $mail = MIME::Entity->build( ++ 'Type' => $type, ++ 'From' => $self->{_from}, ++ 'Reply-To' => $self->{_reply_to}, ++ 'To' => $to, ++ 'Subject' => $subject, ++ 'Data' => $$content ++ ); ++ ++ if ($self->{_test}) { ++ $mail->print(\*STDOUT); ++ } else { ++ open(MAIL, "| $self->{_mta} -t -oi -oem") or die "Can't open MTA program: $!"; ++ $mail->print(\*MAIL); ++ close MAIL; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckOutputpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Output.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,190 @@ ++# $Id: Output.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Check::Output; ++ ++=head1 NAME ++ ++Youri::Check::Output - Abstract output plugin ++ ++=head1 DESCRIPTION ++ ++This abstract class defines output plugin interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Youri::Utils; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Check::Output object. ++ ++Generic parameters (subclasses may define additional ones): ++ ++=over ++ ++=item global true/false ++ ++Global reports generation (default: true). ++ ++=item individual true/false ++ ++Individual reports generation (default: true). ++ ++=back ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ id => '', ++ test => 0, ++ verbose => 0, ++ global => 1, ++ individual => 1, ++ config => undef, ++ @_ ++ ); ++ ++ croak "Neither global nor individual reporting selected" unless $options{global} || $options{individual}; ++ ++ my $self = bless { ++ _id => $options{id}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _global => $options{global}, ++ _individual => $options{individual}, ++ _config => $options{config} ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns plugin identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 run($resultset) ++ ++Reports the result stored in given L<Youri::Check::Resultset> object. ++ ++=cut ++ ++sub run { ++ my ($self, $resultset) = @_; ++ ++ $self->_init_report(); ++ ++ # get types and maintainers list from resultset ++ my @maintainers = $resultset->get_maintainers(); ++ my @types = $resultset->get_types(); ++ ++ foreach my $type (@types) { ++ # get formatting instructions from class ++ my $class = $self->{_config}->get($type . '_class'); ++ load($class); ++ my @columns = $class->columns(); ++ my %links = $class->links(); ++ ++ if ($self->{_global}) { ++ print STDERR "generating global report for $type\n" if $self->{_verbose}; ++ $self->_global_report( ++ $resultset, ++ $type, ++ \@columns, ++ \%links ++ ); ++ } ++ ++ if ($self->{_individual}) { ++ foreach my $maintainer (@maintainers) { ++ print STDERR "generating individual report for $type and $maintainer\n" if $self->{_verbose}; ++ ++ $self->_individual_report( ++ $resultset, ++ $type, ++ \@columns, ++ \%links, ++ $maintainer ++ ); ++ } ++ } ++ } ++ ++ $self->_finish_report(\@types, \@maintainers); ++} ++ ++sub _init_report { ++ # do nothing ++} ++ ++sub _global_report { ++ # do nothing ++} ++ ++sub _individual_report { ++ # do nothing ++} ++ ++sub _finish_report { ++ # do nothing ++} ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item run ++ ++As an alternative, the following hooks can be implemented: ++ ++=over ++ ++=item _init_report ++ ++=item _global_report ++ ++=item _individual_report ++ ++=item _finish_report ++ ++=back ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckResultsetDBIpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/DBI.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,372 @@ ++# $Id: Result.pm 485 2005-08-01 21:48:21Z guillomovitch $ ++package Youri::Check::Resultset::DBI; ++ ++=head1 NAME ++ ++Youri::Check::Resultset::DBI - DBI-based resultset ++ ++=head1 DESCRIPTION ++ ++This is a DBI-based L<Youri::Check::Resultset> implementation. ++ ++It can be created with any DBI-supported database. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use DBI 1.38; ++use base 'Youri::Check::Resultset'; ++ ++my %tables = ( ++ packages => { ++ id => 'SERIAL PRIMARY KEY', ++ package => 'TEXT', ++ media => 'TEXT', ++ maintainer => 'TEXT', ++ } ++); ++ ++my %queries = ( ++ add_package => ++ 'INSERT INTO packages (package, media, maintainer) VALUES (?, ?, ?)', ++ get_package_id => ++ 'SELECT id FROM packages WHERE package = ?', ++ get_maintainers => ++ 'SELECT DISTINCT(maintainer) FROM packages WHERE maintainer IS NOT NULL', ++); ++ ++=head1 CLASS METHODS ++ ++=head2 new(%hash) ++ ++Creates and returns a new Youri::Check::Resultset::DBI object. ++ ++Specific parameters: ++ ++=over ++ ++=item driver $driver ++ ++Use given string as DBI driver. ++ ++=item base $base ++ ++Use given string as database name. ++ ++=item port $port ++ ++Use given string as database port. ++ ++=item user $user ++ ++Use given string as database user. ++ ++=item pass $pass ++ ++Use given string as database password. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ driver => '', # driver ++ base => '', # base ++ port => '', # port ++ user => '', # user ++ pass => '', # pass ++ @_ ++ ); ++ ++ croak "No driver defined" unless $options{driver}; ++ croak "No base defined" unless $options{base}; ++ ++ my $datasource = "DBI:$options{driver}:dbname=$options{base}"; ++ $datasource .= ";host=$options{host}" if $options{host}; ++ $datasource .= ";port=$options{port}" if $options{port}; ++ ++ $self->{_dbh} = DBI->connect($datasource, $options{user}, $options{pass}, { ++ RaiseError => 1, ++ PrintError => 0, ++ AutoCommit => 1 ++ }) or croak "Unable to connect: $DBI::errstr"; ++ ++ $self->{_dbh}->trace($options{verbose} - 1) if $options{verbose} > 1; ++} ++ ++sub clone { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $clone = bless { ++ _test => $self->{_test}, ++ _verbose => $self->{_verbose}, ++ _resolver => $self->{_resolver}, ++ _dbh => $self->{_dbh}->clone() ++ }, ref $self; ++ ++ return $clone; ++} ++ ++sub reset { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ foreach my $table ($self->_get_tables()) { ++ my $query = "DROP TABLE $table"; ++ $self->{_dbh}->do($query); ++ } ++ ++ foreach my $table (keys %tables) { ++ $self->_create_table($table, $tables{$table}); ++ } ++} ++ ++sub _get_tables { ++ my ($self) = @_; ++ my @tables = $self->{_dbh}->tables(undef, undef, '%', 'TABLE'); ++ # unquote table name if needed ++ my $char = $self->{_dbh}->get_info(29); ++ @tables = map { substr($_, 1 , -1) } @tables if $char; ++ return @tables; ++} ++ ++sub _get_columns { ++ my ($self, $table) = @_; ++ # proper way would be to use column_info(), but unfortunatly DBD::SQLite ++ # doesn't support it :( ++ return ++ keys ++ %{$self->{_dbh}->selectrow_hashref("SELECT * from $table")}; ++} ++ ++sub _create_table { ++ my ($self, $name, $fields) = @_; ++ ++ my $query = "CREATE TABLE $name (" . ++ join(',', ++ map { "$_ $fields->{$_}" } ++ keys %$fields ++ ) . ++ ")"; ++ $self->{_dbh}->do($query); ++} ++ ++sub add_result { ++ my ($self, $type, $media, $package, $values) = @_; ++ croak "Not a class method" unless ref $self; ++ croak "No type defined" unless $type; ++ croak "No package defined" unless $package; ++ croak "No values defined" unless $values; ++ ++ my $key = "add_$type"; ++ my $sth = $self->{_sths}->{$key}; ++ ++ unless ($sth) { ++ my @fields = keys %$values; ++ $self->_create_table($type, { ++ 'package_id' => 'INT', ++ map { $_ => 'TEXT' } @fields ++ }); ++ my $query = "INSERT INTO $type (" . ++ join(',', 'package_id', @fields) . ++ ") VALUES (" . ++ join(',', '?', map { '?' } @fields) . ++ ")"; ++ $sth = $self->{_dbh}->prepare($query); ++ $self->{_sths}->{$key} = $sth; ++ } ++ ++ print "adding result for type $type and package $package\n" ++ if $self->{_verbose} > 0; ++ ++ $sth->execute( ++ $self->_get_package_id( ++ $package->get_canonical_name(), ++ $media->get_name(), ++ ), ++ values %$values ++ ); ++} ++ ++sub get_types { ++ my ($self) = @_; ++ ++ return ++ grep { ! $tables{$_} } ++ $self->_get_tables(); ++} ++ ++sub get_maintainers { ++ my ($self) = @_; ++ ++ return $self->_get_multiple_values('get_maintainers'); ++} ++ ++sub get_iterator { ++ my ($self, $id, $sort, $filter) = @_; ++ ++ die 'No id given, aborting' ++ unless $id; ++ die 'sort should be an arrayref' ++ if $sort and ref $sort ne 'ARRAY'; ++ die 'filter should be an hashref' ++ if $filter and ref $filter ne 'HASH'; ++ ++ my $query = $self->_get_iterator_query($id, $sort, $filter); ++ ++ my $sth = $self->{_dbh}->prepare($query); ++ $sth->execute(); ++ ++ return Youri::Check::Resultset::DBI::Iterator->new($sth); ++} ++ ++sub _get_iterator_query { ++ my ($self, $table, $sort, $filter) = @_; ++ ++ my @fields = ++ grep { ! /package_id/ } ++ $self->_get_columns($table); ++ ++ my $query = "SELECT DISTINCT " . ++ join(',', qw/package media maintainer/, @fields) . ++ " FROM $table, packages" . ++ " WHERE packages.id = $table.package_id"; ++ ++ if ($filter) { ++ foreach my $column (keys %{$filter}) { ++ foreach my $value (@{$filter->{$column}}) { ++ $query .= " AND $column = " . $self->{_dbh}->quote($value); ++ } ++ } ++ } ++ ++ if ($sort) { ++ $query .= " ORDER BY " . join(', ', @{$sort}); ++ } ++ ++ return $query; ++} ++ ++sub _get_package_id { ++ my ($self, $package, $media) = @_; ++ ++ my $id = $self->_get_single_value( ++ 'get_package_id', ++ $package ++ ); ++ $id = $self->_add_package($package, $media) unless $id; ++ ++ return $id; ++} ++ ++sub _add_package { ++ my ($self, $package, $media) = @_; ++ ++ my $maintainer = $self->{_resolver} ? ++ $self->{_resolver}->get_maintainer($package) : ++ undef; ++ ++ my $sth = ++ $self->{_sths}->{add_package} ||= ++ $self->{_dbh}->prepare($queries{add_package}); ++ ++ $sth->execute( ++ $package, ++ $media, ++ $maintainer ++ ); ++ ++ my $id = $self->{_dbh}->last_insert_id(undef, undef, 'packages', 'id'); ++ ++ return $id; ++} ++ ++sub _get_single_value { ++ my ($self, $query, @values) = @_; ++ ++ my $sth = ++ $self->{_sths}->{$query} ||= ++ $self->{_dbh}->prepare($queries{$query}); ++ ++ $sth->execute(@values); ++ ++ my @row = $sth->fetchrow_array(); ++ return @row ? $row[0]: undef; ++} ++ ++sub _get_multiple_values { ++ my ($self, $query, @values) = @_; ++ ++ my $sth = ++ $self->{_sths}->{$query} ||= ++ $self->{_dbh}->prepare($queries{$query}); ++ ++ $sth->execute(@values); ++ ++ my @results; ++ while (my @row = $sth->fetchrow_array()) { ++ push @results, $row[0]; ++ } ++ return @results; ++} ++ ++# close database connection ++sub DESTROY { ++ my ($self) = @_; ++ ++ foreach my $sth (values %{$self->{_sths}}) { ++ $sth->finish() if $sth; ++ } ++ ++ # warning, may be called before _dbh is created ++ $self->{_dbh}->disconnect() if $self->{_dbh}; ++} ++ ++package Youri::Check::Resultset::DBI::Iterator; ++ ++sub new { ++ my ($class, $sth) = @_; ++ ++ my $self = bless { ++ _sth => $sth, ++ _queue => [] ++ }, $class; ++ ++ return $self; ++} ++ ++sub has_results { ++ my ($self) = @_; ++ ++ return 1 if @{$self->{_queue}}; ++ ++ push( ++ @{$self->{_queue}}, ++ $self->{_sth}->fetchrow_hashref() ++ ); ++ ++ return defined $self->{_queue}->[-1]; ++} ++ ++sub get_result { ++ my ($self) = @_; ++ ++ return @{$self->{_queue}} ? ++ shift @{$self->{_queue}}: ++ $self->{_sth}->fetchrow_hashref(); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckResultsetIteratorpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset/Iterator.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,22 @@ ++# $Id: Base.pm 483 2005-08-01 21:39:05Z guillomovitch $ ++package Youri::Check::Resultset::Iterator; ++ ++=head1 INSTANCE METHODS ++ ++=head2 has_results() ++ ++Returns true if results are available. ++ ++=head2 get_result() ++ ++Returns next available result, as an field => value hash reference. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriCheckResultsetpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Check/Resultset.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,116 @@ ++# $Id: Base.pm 483 2005-08-01 21:39:05Z guillomovitch $ ++package Youri::Check::Resultset; ++ ++=head1 NAME ++ ++Youri::Check::Resultset - Abstract resultset ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Check::Resultset interface ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Scalar::Util qw/blessed/; ++use Youri::Utils; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%hash) ++ ++Creates and returns a new Youri::Check::Resultset object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ my %options = ( ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ resolver => undef, # maintainer resolver, ++ mode => 'output', # access mode ++ @_ ++ ); ++ ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my $self = bless { ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ _resolver => $options{resolver}, ++ _mode => $options{mode} ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 set_resolver() ++ ++Set L<Youri::Check::Maintainer::Resolver> object used to resolve package ++maintainers. ++ ++=cut ++ ++sub set_resolver { ++ my ($self, $resolver) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ croak "resolver should be a Youri::Check::Maintainer::Resolver object" ++ unless blessed $resolver && ++ $resolver->isa("Youri::Check::Maintainer::Resolver"); ++ ++ $self->{_resolver} = $resolver; ++} ++ ++=head2 clone() ++ ++Clone resultset object. ++ ++=head2 reset() ++ ++Reset resultset object, by deleting all contained results. ++ ++=head2 add_result($type, $media, $package, $values) ++ ++Add given hash reference as a new result for given type and L<Youri::Package> object. ++ ++=head2 get_maintainers() ++ ++Returns the list of all maintainers with results. ++ ++=head2 get_iterator($id, $sort, $filter) ++ ++Returns a L<Youri::Check::Resultset::Iterator> object over results for given input it, with optional sort and filter directives. ++ ++sort must be an arrayref of column names, such as [ 'package' ]. ++ ++filter must be a hashref of arrayref of acceptables values indexed by column names, such as { level => [ 'warning', 'error'] }. ++ ++=head1 SUBCLASSING ++ ++All instances methods have to be implemented. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriConfigpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Config.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Config.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Config.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,202 @@ ++# $Id: Config.pm 1709 2006-10-16 16:33:43Z warly $ ++package Youri::Config; ++ ++=head1 NAME ++ ++Youri::Application - Youri application handler ++ ++=head1 SYNOPSIS ++ ++ use Youri::Application; ++ ++ my $app = Youri::Application->new( ++ options => { ++ help => '|h!' ++ }, ++ directories => [ '/etc/youri', "$ENV{HOME}/.youri" ], ++ file => 'app.conf', ++ ); ++ ++ # get command line argument ++ my $foo = $app->get_arg('foo'); ++ ++ # get configuration file parameter ++ my $bar = $app->get_param('bar'); ++ ++=head1 DESCRIPTION ++ ++This class handle configuration for all YOURI applications. ++ ++The command line specification is used to manage arguments through ++Getopt::Long. Unless B<--config> argument is given, the list of directories is ++then scanned for a file with given name, and halt as soon as it find one. If no ++readable file is found, an exception is thrown. The file is then processed ++through YAML::AppConfig. If parsing fails, an exception is thrown. ++ ++=head1 CONFIGURATION FILE FORMAT ++ ++=head2 SHARED KEYS ++ ++In addition to the application-specific optional or mandatory parameters, all ++YOURI applications support the following optional top-level parameters: ++ ++=over ++ ++=item B<includes> ++ ++A list of additional configuration files. ++ ++=item B<foo> ++ ++An arbitrary variable, usable everywhere else in the file. ++ ++=back ++ ++=head2 PLUGIN DEFINITION ++ ++All YOURI application heavily rely on plugins defined in their configuration ++files. A plugin definition is composed from the following parameters: ++ ++=over ++ ++=item B<class> ++ ++The class of this plugin. ++ ++=item B<options> ++ ++The options of this plugin. ++ ++=back ++ ++=head1 SEE ALSO ++ ++YAML::AppConfig, Getopt::Long ++ ++=cut ++ ++use strict; ++use warnings; ++use YAML::AppConfig; ++use Getopt::Long; ++use File::Spec; ++use Pod::Usage; ++use Carp; ++ ++sub new { ++ my ($class, %options) = @_; ++ ++ ++ # command line arguments ++ my $args = { ++ verbose => 0 ++ }; ++ my @args; ++ if ($options{args}) { ++ while (my ($arg, $spec) = each %{$options{args}}) { ++ push(@args, ($arg . $spec) => \$args->{$arg}); ++ } ++ } ++ push(@args, ++ 'config=s' => \$args->{config}, ++ 'h|help' => \$args->{help}, ++ 'v|verbose+' => \$args->{verbose} ++ ); ++ GetOptions(@args); ++ ++ if ($args->{help}) { ++ if (!@ARGV) { ++ # standard help, available immediatly ++ my $filename = (caller)[1]; ++ pod2usage( ++ -input => $filename, ++ -verbose => 0 ++ ); ++ } ++ } ++ ++ # config files parameters ++ ++ # find configuration file to use ++ my $main_file; ++ if ($args->{config}) { ++ if (! -f $args->{config}) { ++ croak "Non-existing file $args->{config}"; ++ } elsif (! -r $args->{config}) { ++ croak "Non-readable file $args->{config}"; ++ } else { ++ $main_file = $args->{config}; ++ } ++ } else { ++ foreach my $directory (@{$options{directories}}) { ++ my $file = "$directory/$options{file}"; ++ next unless -f $file && -r $file; ++ $main_file = $file; ++ last; ++ } ++ croak 'No config file found, aborting' unless $main_file; ++ } ++ ++ my $params; ++ eval { ++ $params = YAML::AppConfig->new(file => $main_file); ++ }; ++ if ($@) { ++ croak "Invalid configuration file $main_file, aborting"; ++ } ++ ++ # process inclusions ++ my $includes = $params->get('includes'); ++ if ($includes) { ++ foreach my $include_file (@{$includes}) { ++ # convert relative path to absolute ones ++ $include_file = File::Spec->rel2abs( ++ $include_file, (File::Spec->splitpath($main_file))[1] ++ ); ++ ++ if (! -f $include_file) { ++ warn "Non-existing file $include_file, skipping"; ++ } elsif (! -r $include_file) { ++ warn "Non-readable file $include_file, skipping"; ++ } else { ++ eval { ++ $params->merge(file => $include_file); ++ }; ++ if ($@) { ++ carp "Invalid included configuration file $include_file, skipping"; ++ } ++ } ++ } ++ } ++ ++ my $self = bless { ++ _args => $args, ++ _params => $params ++ }, $class; ++ ++ return $self; ++} ++ ++sub get_arg { ++ my ($self, $arg) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_args}->{$arg}; ++} ++ ++sub get_param { ++ my ($self, $param) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_params}->get($param); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriMediaURPMpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Media/URPM.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,273 @@ ++# $Id: URPM.pm 1179 2006-08-05 08:30:57Z warly $ ++package Youri::Media::URPM; ++ ++=head1 NAME ++ ++Youri::Media::URPM - URPM-based media implementation ++ ++=head1 DESCRIPTION ++ ++This is an URPM-based L<Youri::Media> implementation. ++ ++It can be created either from local or remote full (hdlist) or partial ++(synthesis) compressed header files, or from a package directory. File-based ++inputs are only usable with this latest option. ++ ++=cut ++ ++use URPM; ++use File::Find; ++use File::Temp (); ++use Youri::Utils; ++use LWP::Simple; ++use Carp; ++use strict; ++use warnings; ++use Youri::Package::URPM; ++ ++use base 'Youri::Media'; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Media::URPM object. ++ ++Specific parameters: ++ ++=over ++ ++=item synthesis $synthesis ++ ++Path, URL or list of path or URL of synthesis file used for creating ++this media. If a list is given, the first successfully accessed will be used, ++so as to allow better reliability. ++ ++=item hdlist $hdlist ++ ++Path, URL or list of path or URL of hdlist file used for creating ++this media. If a list is given, the first successfully accessed will be used, ++so as to allow better reliability. ++ ++=item path $path ++ ++Path or list of pathes of package directory used for creating this ++media. If a list is given, the first successfully accessed will be used, so as ++to allow better reliability. ++ ++=item max_age $age ++ ++Maximum age of packages for this media. ++ ++=item rpmlint_config $file ++ ++rpmlint configuration file for this media. ++ ++=back ++ ++In case of multiple B<synthesis>, B<hdlist> and B<path> options given, they ++will be tried in this order, so as to minimize parsing time. ++ ++=cut ++ ++sub _init { ++ my $self = shift; ++ ++ my %options = ( ++ hdlist => '', # hdlist from which to create this media ++ synthesis => '', # synthesis from which to create this media ++ path => '', # directory from which to create this media ++ max_age => '', # maximum build age for packages ++ rpmlint_config => '', # rpmlint configuration for packages ++ @_ ++ ); ++ ++ my $urpm = URPM->new(); ++ SOURCE: { ++ if ($options{synthesis}) { ++ foreach my $file ( ++ ref $options{synthesis} eq 'ARRAY' ? ++ @{$options{synthesis}} : ++ $options{synthesis} ++ ) { ++ print "Attempting to retrieve synthesis $file\n" ++ if $options{verbose}; ++ my $synthesis = $self->_get_file($file); ++ if ($synthesis) { ++ $urpm->parse_synthesis($synthesis, keep_all_tags => 1); ++ last SOURCE; ++ } ++ } ++ } ++ ++ if ($options{hdlist}) { ++ foreach my $file ( ++ ref $options{hdlist} eq 'ARRAY' ? ++ @{$options{hdlist}} : ++ $options{hdlist} ++ ) { ++ print "Attempting to retrieve hdlist $file\n" ++ if $options{verbose}; ++ my $hdlist = $self->_get_file($file); ++ if ($hdlist) { ++ $urpm->parse_hdlist($hdlist, keep_all_tags => 1); ++ last SOURCE; ++ } ++ } ++ } ++ ++ if ($options{path}) { ++ foreach my $path ( ++ ref $options{path} eq 'ARRAY' ? ++ @{$options{path}} : ++ $options{path} ++ ) { ++ print "Attempting to scan directory $path\n" ++ if $options{verbose}; ++ unless (-d $path) { ++ carp "non-existing directory $path"; ++ next; ++ } ++ unless (-r $path) { ++ carp "non-readable directory $path"; ++ next; ++ } ++ ++ my $parse = sub { ++ return unless -f $File::Find::name; ++ return unless -r $File::Find::name; ++ return unless /\.rpm$/; ++ ++ $urpm->parse_rpm($File::Find::name, keep_all_tags => 1); ++ }; ++ ++ find($parse, $path); ++ last SOURCE; ++ } ++ } ++ ++ croak "no source specified"; ++ } ++ ++ $self->{_urpm} = $urpm; ++ $self->{_path} = $options{path}; ++ $self->{_max_age} = $options{max_age}; ++ $self->{_rpmlint_config} = $options{rpmlint_config}; ++ ++ return $self; ++} ++ ++sub _remove_all_archs { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $self->{_urpm}->{depslist} = []; ++} ++ ++sub _remove_archs { ++ my ($self, $skip_archs) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $urpm = $self->{_urpm}; ++ $urpm->{depslist} = [ ++ grep { ! $skip_archs->{$_->arch()} } @{$urpm->{depslist}} ++ ]; ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 max_age() ++ ++Returns maximum age of packages for this media. ++ ++=cut ++ ++sub max_age { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_max_age}; ++} ++ ++=head2 rpmlint_config() ++ ++Returns rpmlint configuration file for this media. ++ ++=cut ++ ++sub rpmlint_config { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_rpmlint_config}; ++} ++ ++sub get_package_class { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return "Youri::Package::URPM"; ++} ++ ++sub traverse_files { ++ my ($self, $function) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $callback = sub { ++ return unless -f $File::Find::name; ++ return unless -r $File::Find::name; ++ return unless $_ =~ /\.rpm$/; ++ ++ my $package = Youri::Package::URPM->new(file => $File::Find::name); ++ return if $self->{_skip_archs}->{$package->get_arch()}; ++ ++ $function->($File::Find::name, $package); ++ }; ++ ++ find($callback, $self->{_path}); ++} ++ ++sub traverse_headers { ++ my ($self, $function) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $self->{_urpm}->traverse(sub { ++ local $_; # workaround mysterious problem between URPM and AppConfig ++ $function->(Youri::Package::URPM->new(header => $_[0])); ++ }); ++ ++} ++ ++sub _get_file { ++ my ($self, $file) = @_; ++ ++ if ($file =~ /^(?:http|ftp):\/\/.*$/) { ++ my $tempfile = File::Temp->new(); ++ my $status = getstore($file, $tempfile->filename()); ++ unless (is_success($status)) { ++ carp "invalid URL $file: $status"; ++ return; ++ } ++ return $tempfile; ++ } else { ++ unless (-f $file) { ++ carp "non-existing file $file"; ++ return; ++ } ++ unless (-r $file) { ++ carp "non-readable file $file"; ++ return; ++ } ++ return $file; ++ } ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriMediapm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Media.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Media.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Media.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,311 @@ ++# $Id: Media.pm 1710 2006-10-16 16:35:11Z warly $ ++package Youri::Media; ++ ++=head1 NAME ++ ++Youri::Media - Abstract media class ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Media interface. ++ ++=cut ++ ++use Carp; ++use strict; ++use warnings; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Media object. ++ ++Generic parameters: ++ ++=over ++ ++=item id $id ++ ++Media id. ++ ++=item name $name ++ ++Media name. ++ ++=item type $type (source/binary) ++ ++Media type. ++ ++=item test true/false ++ ++Test mode (default: false). ++ ++=item verbose true/false ++ ++Verbose mode (default: false). ++ ++=item allow_deps $media_ids ++ ++list of ids of medias allowed to provide dependencies. ++ ++=item skip_tests $test_ids ++ ++list of ids of test plugins to skip. ++ ++=item skip_archs $arches ++ ++list of arches to skip. ++ ++=back ++ ++Subclass may define additional parameters. ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ name => '', # media name ++ canonical_name => '', # media canonical name ++ type => '', # media type ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ allow_deps => undef, # list of media ids from which deps are allowed ++ allow_srcs => undef, # list of media ids from which packages can be built ++ skip_tests => undef, # list of tests ids to skip ++ skip_archs => undef, # list of archs for which to skip tests ++ @_ ++ ); ++ ++ ++ croak "No type given" unless $options{type}; ++ croak "Wrong value for type: $options{type}" ++ unless $options{type} =~ /^(?:binary|source)$/o; ++ ++ # some options need to be arrays. Check it and convert to hashes ++ foreach my $option (qw(allow_deps allow_srcs skip_archs skip_tests)) { ++ next unless defined $options{$option}; ++ croak "$option should be an arrayref" unless ref $options{$option} eq 'ARRAY'; ++ $options{$option} = { ++ map { $_ => 1 } @{$options{$option}} ++ }; ++ } ++ ++ my $self = bless { ++ _id => $options{id}, ++ _name => $options{name} || $options{id}, ++ _type => $options{type}, ++ _allow_deps => $options{allow_deps}, ++ _allow_srcs => $options{allow_srcs}, ++ _skip_archs => $options{skip_archs}, ++ _skip_tests => $options{skip_tests}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ # remove unwanted archs ++ if ($options{skip_archs}->{all}) { ++ $self->_remove_all_archs() ++ } elsif ($options{skip_archs}) { ++ $self->_remove_archs($options{skip_archs}); ++ } ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_id() ++ ++Returns media identity. ++ ++=cut ++ ++sub get_id { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_id}; ++} ++ ++=head2 get_name() ++ ++Returns the name of this media. ++ ++=cut ++ ++sub get_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_name}; ++} ++ ++=head2 get_type() ++ ++Returns the type of this media. ++ ++=cut ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_type}; ++} ++ ++=head2 allow_deps() ++ ++Returns the list of id of medias allowed to provide dependencies for this ++media. ++ ++=cut ++ ++sub allow_deps { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_allow_deps}}; ++} ++ ++=head2 allow_dep($media_id) ++ ++Tells wether media with given id is allowed to provide dependencies for ++this media. ++ ++=cut ++ ++sub allow_dep { ++ my ($self, $dep) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_allow_deps}->{all} || ++ $self->{_allow_deps}->{$dep}; ++} ++ ++=head2 allow_srcs() ++ ++Returns the list medias where the source packages can be ++ ++=cut ++ ++sub allow_srcs { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_allow_srcs}}; ++} ++ ++=head2 allow_src($media_id) ++ ++Tells wether media with given id is allowed to host sources dependencies for ++this media. ++ ++=cut ++ ++sub allow_src { ++ my ($self, $src) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_allow_srcs}->{all} || $self->{_allow_srcs}->{$src}; ++} ++ ++=head2 skip_archs() ++ ++Returns the list of arch which are to be skipped for this media. ++ ++=cut ++ ++sub skip_archs { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_skip_archs}}; ++} ++ ++=head2 skip_arch($arch) ++ ++Tells wether given arch is to be skipped for this media. ++ ++=cut ++ ++sub skip_arch { ++ my ($self, $arch) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_skip_archs}->{all} || ++ $self->{_skip_archs}->{$arch}; ++} ++ ++=head2 skip_tests() ++ ++Returns the list of id of test which are to be skipped for this media. ++ ++=cut ++ ++sub skip_tests { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return keys %{$self->{_skip_tests}}; ++} ++ ++=head2 skip_test($test_id) ++ ++Tells wether test with given id is to be skipped for this media. ++ ++=cut ++ ++sub skip_test { ++ my ($self, $test) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_skip_tests}->{all} || ++ $self->{_skip_tests}->{$test}; ++} ++ ++=head2 get_package_class() ++ ++Return package class for this media. ++ ++=head2 traverse_files($function) ++ ++Apply given function to all files of this media. ++ ++=head2 traverse_headers($function) ++ ++Apply given function to all headers of this media. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item traverse_headers ++ ++=item traverse_files ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageRPMpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,58 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Package/URPM.pm 2257 2006-07-05T09:22:47.088572Z guillaume $ ++package Youri::Package::RPM; ++ ++=head1 NAME ++ ++Youri::Package::RPM - Base class for all RPM-based package implementation ++ ++=head1 DESCRIPTION ++ ++This bases class factorize code between various RPM-based package ++implementation. ++ ++=cut ++ ++use strict; ++use warnings; ++use base 'Youri::Package'; ++use Carp; ++ ++sub get_pattern { ++ my ($class, $name, $version, $release, $arch) = @_; ++ ++ return ++ ($name ? quotemeta($name) : '[\w-]+' ). ++ '-' . ++ ($version ? quotemeta($version) : '[^-]+' ). ++ '-' . ++ ($release ? quotemeta($release) : '[^-]+' ). ++ '\.' . ++ ($arch ? quotemeta($arch) : '\w+' ). ++ '\.rpm'; ++} ++ ++sub as_file { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_file}; ++} ++ ++sub is_debug { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $name = $self->get_name(); ++ my $group = $self->get_tag('group'); ++ ++ # debug packages' names must end in -debug, except kernel ++ if ($group =~ m,^Development/Debug$, && ++ ($name =~ /-debug$/o || $name =~ /^kernel-.*-debug/o)) { ++ return 1; ++ } ++ else { ++ return 0; ++ } ++} ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageRPM4pm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/RPM4.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,424 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Package/URPM.pm 2129 2006-06-23T09:41:01.599329Z guillomovitch $ ++package Youri::Package::RPM4; ++ ++=head1 NAME ++ ++Youri::Package::RPM4 - URPM-based rpm package implementation ++ ++=head1 DESCRIPTION ++ ++This is an RPM4-based L<Youri::Package> implementation for rpm. ++ ++=cut ++ ++use strict; ++use warnings; ++use Carp; ++use RPM4; ++use RPM4::Header; ++use RPM4::Sign; ++use File::Spec; ++use Scalar::Util qw/refaddr/; ++use base 'Youri::Package::RPM'; ++use overload ++ '""' => 'as_string', ++ '0+' => '_to_number', ++ fallback => 1; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package::RPM4 object. ++ ++Specific parameters: ++ ++=over ++ ++=item file $file ++ ++Path of file to use for creating this package. ++ ++=item header $header ++ ++L<RPM4::Header> object to use for creating this package. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ my $header; ++ HEADER: { ++ if (exists $options{header}) { ++ croak "undefined header" ++ unless $options{header}; ++ croak "invalid header" ++ unless $options{header}->isa('RPM4::Header'); ++ $header = $options{header}; ++ last HEADER; ++ } ++ ++ if (exists $options{file}) { ++ croak "undefined file" ++ unless $options{file}; ++ croak "non-existing file $options{file}" ++ unless -f $options{file}; ++ croak "non-readable file $options{file}" ++ unless -r $options{file}; ++ $header = RPM4::Header->new($options{file}); ++ croak "Can't get header from file $options{file}" if (!$header); ++ ++ last HEADER; ++ } ++ ++ croak "no way to extract header from arguments"; ++ } ++ ++ $self->{_header} = $header; ++ $self->{_file} = File::Spec->rel2abs($options{file}); ++} ++ ++sub compare_versions { ++ my ($class, $version1, $version2) = @_; ++ ++ return RPM4::rpmvercmp($version1, $version2); ++} ++ ++sub _depsense2flag { ++ my ($string) = @_; ++ my @flags = 0; ++ push(@flags, 'EQUAL') if ($string =~ /=/); ++ push(@flags, 'LESS') if ($string =~ /</); ++ push(@flags, 'GREATER') if ($string =~ />/); ++ return \@flags; ++} ++ ++sub check_ranges_compatibility { ++ my ($class, $range1, $range2) = @_; ++ my @deps1 = split(/ /, $range1); ++ my @deps2 = split(/ /, $range2); ++ $deps1[1] = _depsense2flag($range1); ++ $deps2[1] = _depsense2flag($range2); ++ my $dep1 = RPM4::Header::Dependencies( ++ "PROVIDENAME", ++ \@deps1, ++ ); ++ my $dep2 = RPM4::Header::Dependencies( ++ "PROVIDENAME", ++ \@deps2, ++ ); ++ ++ return $dep1->overlap($dep2); ++} ++ ++sub get_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('name'); ++} ++ ++sub get_version { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('version'); ++} ++ ++sub get_release { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('release'); ++} ++ ++sub get_revision { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%|EPOCH?{%{EPOCH}:}:{}|%{VERSION}-%{RELEASE}'); ++} ++ ++sub get_file_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%{NAME}-%{VERSION}-%{RELEASE}.%|SOURCERPM?{%{ARCH}}:{src}|.rpm'); ++} ++ ++ ++sub get_arch { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%|SOURCERPM?{%{ARCH}}:{src}|'); ++} ++ ++sub get_url { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('url'); ++} ++ ++sub get_summary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('summary'); ++} ++ ++sub get_description { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('description'); ++} ++ ++sub get_packager { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('packager'); ++} ++ ++sub is_source { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->issrc(); ++} ++ ++sub is_binary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return !$self->{_header}->issrc(); ++} ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_header}->issrc() ? ++ "source" : ++ "binary"; ++} ++ ++sub get_age { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('buildtime'); ++} ++ ++sub get_source_package { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->tag('sourcerpm'); ++} ++ ++sub get_canonical_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ $self->{_header}->sourcerpmname() =~ /^(\S+)-[^-]+-[^-]+\.src\.rpm$/; ++ return $1; ++} ++ ++sub get_tag { ++ my ($self, $tag) = @_; ++ croak "Not a class method" unless ref $self; ++ #croak "invalid tag $tag" unless $self->{_header}->can($tag); ++ return $self->{_header}->tag($tag); ++} ++ ++ ++sub _get_dependencies { ++ my ($self, $deptype) = @_; ++ my $deps = $self->{_header}->dep($deptype); ++ my @deps_list; ++ if ($deps) { ++ $deps->init(); ++ while ($deps->next() >= 0) { ++ my @deps = $deps->info(); ++ $deps[1] =~ m/^rpmlib\(/ and next; # skipping internal rpmlib dep ++ $deps[2] =~ s/^=$/==/; # rpm say foo = 1, not foo == 1, == come from URPM, which sucks ++ my $range = $deps[3] ? ($deps[2] . ' ' . $deps[3]) : undef; ++ push(@deps_list, [ $deps[1], $range ]); ++ } ++ } ++ @deps_list ++} ++ ++sub get_requires { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('REQUIRENAME'); ++} ++ ++sub get_provides { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('PROVIDENAME'); ++} ++ ++sub get_obsoletes { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('OBSOLETENAME'); ++} ++ ++sub get_conflicts { ++ my ($self) = @_; ++ ++ return $self->_get_dependencies('CONFLICTNAME'); ++} ++ ++sub get_files { ++ my ($self) = @_; ++ ++ my $files = $self->{_header}->files(); ++ my @fileslist; ++ if ($files) { ++ $files->init(); ++ while ($files->next() >= 0) { ++ my $smode = $files->mode(); ++ my $umode = 0; ++ foreach (0..15) { # converting unsigned to signed int :\ ++ $umode |= $smode & (1 << $_); ++ } ++ push(@fileslist, [ $files->filename(), $umode, $files->md5() || '' ]); ++ } ++ } ++ @fileslist ++} ++ ++sub get_gpg_key { ++ my ($self) = @_; ++ ++ my $signature = $self->{_header}->queryformat('%{SIGGPG:pgpsig}'); ++ ++ return if $signature eq '(not a blob)'; ++ ++ my $key_id = (split(/\s+/, $signature))[-1]; ++ ++ return substr($key_id, 8); ++} ++ ++sub get_information { ++ my ($self) = @_; ++ ++ return $self->{_header}->queryformat(<<EOF); ++Name : %-27{NAME} Relocations: %|PREFIXES?{[%{PREFIXES} ]}:{(not relocatable)}| ++Version : %-27{VERSION} Vendor: %{VENDOR} ++Release : %-27{RELEASE} Build Date: %{BUILDTIME:date} ++Install Date: %|INSTALLTIME?{%-27{INSTALLTIME:date}}:{(not installed) }| Build Host: %{BUILDHOST} ++Group : %-27{GROUP} Source RPM: %{SOURCERPM} ++Size : %-27{SIZE}%|LICENSE?{ License: %{LICENSE}}| ++Signature : %|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}| ++%|PACKAGER?{Packager : %{PACKAGER}\n}|%|URL?{URL : %{URL}\n}|Summary : %{SUMMARY} ++Description :\n%{DESCRIPTION} ++EOF ++} ++ ++sub get_changes { ++ my ($self) = @_; ++ ++ my @names = $self->{_header}->tag('changelogname'); ++ my @time = $self->{_header}->tag('changelogtime'); ++ my @text = $self->{_header}->tag('changelogtext'); ++ ++ my @changes; ++ foreach my $i (0 .. $#names) { ++ $changes[$i] = [ ++ $names[$i], ++ $time[$i], ++ $text[$i], ++ ]; ++ } ++ ++ return @changes; ++} ++ ++sub get_last_change { ++ my ($self) = @_; ++ ++ return [ ++ ($self->{_header}->tag('changelogname'))[0], ++ ($self->{_header}->tag('changelogtime'))[0], ++ ($self->{_header}->tag('changelogtext'))[0], ++ ]; ++} ++ ++sub as_string { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->fullname(); ++} ++ ++sub as_formated_string { ++ my ($self, $format) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat($format); ++} ++ ++sub _to_number { ++ return refaddr($_[0]); ++} ++ ++sub compare { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->compare($package->{_header}) || 0; ++} ++ ++sub satisfy_range { ++ my ($self, $range) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->check_range_compatibility($self->get_revision(), $range); ++} ++ ++sub sign { ++ my ($self, $name, $path, $passphrase) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # check if parent directory is writable ++ my $parent = (File::Spec->splitpath($self->{_file}))[1]; ++ croak "Unsignable package, parent directory is read-only" ++ unless -w $parent; ++ ++ my $sign = RPM4::Sign->new( ++ name => $name, ++ path => $path, ++ ); ++ $sign->{passphrase} = $passphrase; ++ ++ $sign->rpmssign($self->{_file}) ++} ++ ++sub extract { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ system("rpm2cpio $self->{_file} | cpio -id >/dev/null 2>&1"); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageTestpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/Test.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,151 @@ ++# $Id: /local/youri/soft/core/trunk/lib/Youri/Package/URPM.pm 2133 2006-09-20T21:40:20.575763Z guillaume $ ++package Youri::Package::Test; ++ ++=head1 NAME ++ ++Youri::Package::Test - Fake test package ++ ++=head1 DESCRIPTION ++ ++This is just a fake package object, intended for testing purposes. ++ ++=cut ++ ++use strict; ++use warnings; ++use Carp; ++use base 'Youri::Package::RPM'; ++use overload ++ '""' => 'as_string', ++ '0+' => '_to_number', ++ fallback => 1; ++ ++our $AUTOLOAD; ++ ++my @tags = qw/ ++ name ++ version ++ release ++ filename ++ arch ++ url ++ summary ++ description ++ packager ++ buildtime ++ sourcerpm ++/; ++ ++my %tags = map { $_ => 1 } @tags; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package::Test object. ++ ++Specific parameters: ++ ++=over ++ ++=item tag $tag ++ ++Use given value for given tag ++ ++=back ++ ++=cut ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ $self->{"_$_"} = $options{$_} foreach keys %options; ++} ++ ++sub get_revision { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_epoch} ? ++ "$self->{_epoch}:$self->{_version}-$self->{_release}" : ++ "$self->{_version}-$self->{_release}"; ++} ++ ++sub get_tag { ++ my ($self, $tag) = @_; ++ croak "Not a class method" unless ref $self; ++ croak "invalid tag $tag" unless $tags{$tag}; ++ return $self->{'_' . $tag}; ++} ++ ++sub is_source { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_arch} eq 'src'; ++} ++ ++sub is_binary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_arch} ne 'src'; ++} ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_arch} eq 'src' ? ++ "source" : ++ "binary"; ++} ++ ++sub get_canonical_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ if ($self->{_arch} eq 'src') { ++ return $self->{_name}; ++ } else { ++ if ($self->{_sourcerpm}) { ++ $self->{_sourcerpm} =~ /^(\S+)-[^-]+-[^-]+\.src\.rpm$/; ++ return $1; ++ } else { ++ return undef; ++ } ++ } ++} ++ ++sub as_string { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_name} ? $self->{_name} : '' . ++ '-' . ++ $self->{_version} ? $self->{_version} : '' . ++ '-' . ++ $self->{_release} ? $self->{_release} : ''; ++} ++ ++sub _to_number { ++ return refaddr($_[0]); ++} ++ ++sub AUTOLOAD { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my $method = $AUTOLOAD; ++ $method =~ s/.*:://; ++ return if $method eq 'DESTROY'; ++ croak "invalid method" unless $method =~ /^get_(\w+)$/; ++ ++ my $tag = $1; ++ croak "invalid tag $tag" unless $tags{$tag}; ++ return $self->{'_' . $tag}; ++} ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackageURPMpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package/URPM.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,399 @@ ++# $Id: URPM.pm 266577 2010-03-02 14:51:24Z bogdano $ ++package Youri::Package::URPM; ++ ++=head1 NAME ++ ++Youri::Package::URPM - URPM-based rpm package implementation ++ ++=head1 DESCRIPTION ++ ++This is an URPM-based L<Youri::Package> implementation for rpm. ++ ++It is merely a wrapper over URPM::Package class, with a more structured ++interface. ++ ++=cut ++ ++use strict; ++use warnings; ++use Carp; ++use URPM; ++use File::Spec; ++use Expect; ++use Scalar::Util qw/refaddr/; ++use base 'Youri::Package::RPM'; ++use overload ++ '""' => 'as_string', ++ '0+' => '_to_number', ++ fallback => 1; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package::URPM object. ++ ++Specific parameters: ++ ++=over ++ ++=item file $file ++ ++Path of file to use for creating this package. ++ ++=item header $header ++ ++L<URPM::Package> object to use for creating this package. ++ ++=back ++ ++=cut ++ ++sub _init { ++ my ($self, %options) = @_; ++ ++ my $header; ++ HEADER: { ++ if (exists $options{header}) { ++ croak "undefined header" ++ unless $options{header}; ++ croak "invalid header" ++ unless $options{header}->isa('URPM::Package'); ++ $header = $options{header}; ++ last HEADER; ++ } ++ ++ if (exists $options{file}) { ++ croak "undefined file" ++ unless $options{file}; ++ croak "non-existing file $options{file}" ++ unless -f $options{file}; ++ croak "non-readable file $options{file}" ++ unless -r $options{file}; ++ my $urpm = URPM->new(); ++ $urpm->parse_rpm($options{file}, keep_all_tags => 1); ++ $header = $urpm->{depslist}->[0]; ++ croak "non-rpm file $options{file}" unless $header; ++ last HEADER; ++ } ++ ++ croak "no way to extract header from arguments"; ++ } ++ ++ $self->{_header} = $header; ++ $self->{_file} = File::Spec->rel2abs($options{file}); ++} ++ ++sub compare_versions { ++ my ($class, $version1, $version2) = @_; ++ ++ return URPM::rpmvercmp($version1, $version2); ++} ++ ++sub check_ranges_compatibility { ++ my ($class, $range1, $range2) = @_; ++ ++ return URPM::ranges_overlap($range1, $range2); ++} ++ ++sub get_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->name(); ++} ++ ++sub get_version { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->version(); ++} ++ ++sub get_release { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->release(); ++} ++ ++sub get_revision { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat('%|EPOCH?{%{EPOCH}:}:{}|%{VERSION}-%{RELEASE}'); ++} ++ ++sub get_file_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_file} || die "_file is not defined in header-only objects!\n"; ++} ++ ++sub get_arch { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->arch(); ++} ++ ++sub get_url { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->url(); ++} ++ ++sub get_summary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->summary(); ++} ++ ++sub get_description { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->description(); ++} ++ ++sub get_packager { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->packager(); ++} ++ ++sub is_source { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->arch() eq 'src'; ++} ++ ++sub is_binary { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->arch() ne 'src'; ++} ++ ++sub get_type { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_header}->arch() eq 'src' ? ++ "source" : ++ "binary"; ++} ++ ++sub get_age { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->buildtime(); ++} ++ ++sub get_source_package { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->sourcerpm(); ++} ++ ++sub get_canonical_name { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ if ($self->{_header}->arch() eq 'src') { ++ return $self->{_header}->name(); ++ } else { ++ $self->{_header}->sourcerpm() =~ /^(\S+)-[^-]+-[^-]+\.src\.rpm$/; ++ return $1; ++ } ++} ++ ++sub get_tag { ++ my ($self, $tag) = @_; ++ croak "Not a class method" unless ref $self; ++ croak "invalid tag $tag" unless $self->{_header}->can($tag); ++ return $self->{_header}->$tag(); ++} ++ ++sub get_requires { ++ my ($self) = @_; ++ ++ return map { ++ $_ =~ /^([^[]+)(?:\[\*\])?(?:\[(.+)\])?$/; ++ [ $1, $2 ] ++ } $self->{_header}->requires(); ++} ++ ++sub get_provides { ++ my ($self) = @_; ++ ++ return map { ++ $_ =~ /^([^[]+)(?:\[(.+)\])?$/; ++ [ $1, $2 && $2 ne '*' ? $2 : undef ] ++ } $self->{_header}->provides(); ++} ++ ++sub get_obsoletes { ++ my ($self) = @_; ++ ++ return map { ++ $_ =~ /^([^[]+)(?:\[(.+)\])?$/; ++ [ $1, $2 && $2 ne '*' ? $2 : undef ] ++ } $self->{_header}->obsoletes(); ++} ++ ++sub get_conflicts { ++ my ($self) = @_; ++ ++ return $self->{_header}->conflicts(); ++} ++ ++sub get_files { ++ my ($self) = @_; ++ ++ my @modes = $self->{_header}->files_mode(); ++ my @md5sums = $self->{_header}->files_md5sum(); ++ ++ return map { ++ [ $_, shift @modes, shift @md5sums ] ++ } $self->{_header}->files(); ++} ++ ++sub get_gpg_key { ++ my ($self) = @_; ++ ++ my $signature = $self->{_header}->queryformat('%{SIGGPG:pgpsig}'); ++ ++ return if $signature eq '(not a blob)'; ++ ++ my $key_id = (split(/\s+/, $signature))[-1]; ++ ++ return substr($key_id, 8); ++} ++ ++sub get_information { ++ my ($self) = @_; ++ ++ return $self->{_header}->queryformat(<<EOF); ++Name : %-27{NAME} Relocations: %|PREFIXES?{[%{PREFIXES} ]}:{(not relocatable)}| ++Version : %-27{VERSION} Vendor: %{VENDOR} ++Release : %-27{RELEASE} Build Date: %{BUILDTIME:date} ++Install Date: %|INSTALLTIME?{%-27{INSTALLTIME:date}}:{(not installed) }| Build Host: %{BUILDHOST} ++Group : %-27{GROUP} Source RPM: %{SOURCERPM} ++Size : %-27{SIZE}%|LICENSE?{ License: %{LICENSE}}| ++Signature : %|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}| ++%|PACKAGER?{Packager : %{PACKAGER}\n}|%|URL?{URL : %{URL}\n}|Summary : %{SUMMARY} ++Description :\n%{DESCRIPTION} ++EOF ++} ++ ++sub get_changes { ++ my ($self) = @_; ++ ++ my @names = $self->{_header}->changelog_name(); ++ my @time = $self->{_header}->changelog_time(); ++ my @text = $self->{_header}->changelog_text(); ++ ++ my @changes; ++ foreach my $i (0 .. $#names) { ++ $changes[$i] = [ ++ $names[$i], ++ $time[$i], ++ $text[$i], ++ ]; ++ } ++ ++ return @changes; ++} ++ ++sub get_last_change { ++ my ($self) = @_; ++ ++ return [ ++ ($self->{_header}->changelog_name())[0], ++ ($self->{_header}->changelog_time())[0], ++ ($self->{_header}->changelog_text())[0], ++ ]; ++} ++ ++sub as_string { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->fullname(); ++} ++ ++sub as_formated_string { ++ my ($self, $format) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->queryformat($format); ++} ++ ++sub _to_number { ++ return refaddr($_[0]); ++} ++ ++sub compare { ++ my ($self, $package) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_header}->compare_pkg($package->{_header}); ++} ++ ++sub satisfy_range { ++ my ($self, $range) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->check_ranges_compatibility("== " . $self->get_revision(), $range); ++} ++ ++sub sign { ++ my ($self, $name, $path, $passphrase, $target) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ # check if parent directory is writable ++ my $parent = (File::Spec->splitpath($self->{_file}))[1]; ++ croak "Unsignable package, parent directory is read-only" ++ unless -w $parent; ++ ++ # FIXME Will have to change that ++ # we sign with cooker key even fro 2007.0 because this is for testing section ++ return !system("sudo -H /root/bin/resign_cooker $self->{_file}"); ++ ++ my $command = ++ 'LC_ALL=C rpm --resign ' . $self->{_file} . ++ ' --define "_gpg_name ' . $name . '"' . ++ ' --define "_gpg_path ' . $path . '"'; ++ my $expect = Expect->spawn($command) or die "Couldn't spawn command $command: $!\n"; ++ $expect->log_stdout(0); ++ $expect->expect(20, -re => 'Enter pass phrase:'); ++ $expect->send("$passphrase\n"); ++ ++ $expect->soft_close(); ++} ++ ++sub extract { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ system("rpm2cpio $self->{_file} | cpio -id >/dev/null 2>&1"); ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriPackagepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Package.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Package.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Package.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,336 @@ ++# $Id: Package.pm 223952 2007-06-23 13:54:13Z pixel $ ++package Youri::Package; ++ ++=head1 NAME ++ ++Youri::Package - Abstract package class ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Package interface. ++ ++=cut ++ ++use Carp; ++use strict; ++use warnings; ++ ++use constant DEPENDENCY_NAME => 0; ++use constant DEPENDENCY_RANGE => 1; ++ ++use constant FILE_NAME => 0; ++use constant FILE_MODE => 1; ++use constant FILE_MD5SUM => 2; ++ ++use constant CHANGE_AUTHOR => 0; ++use constant CHANGE_TIME => 1; ++use constant CHANGE_TEXT => 2; ++ ++=head1 CLASS METHODS ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Package object. ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ @_ ++ ); ++ ++ my $self = bless { ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head2 get_pattern($name, $version, $release, $arch) ++ ++Returns a pattern matching a file for a package, using available informations. ++ ++=head2 compare_revisions($revision1, $revision2) ++ ++Compares two revision tokens, and returns a numeric value: ++ ++=over ++ ++=item positive if first revision is higher ++ ++=item null if both revisions are equal ++ ++=item negative if first revision is lower ++ ++=back ++ ++=head2 check_ranges_compatibility($range1, $range2) ++ ++Returns a true value if given revision ranges are compatible. ++ ++=head1 INSTANCE METHODS ++ ++=head2 as_file() ++ ++Returns the file corresponding to this package. ++ ++=head2 as_string() ++ ++Returns a string representation of this package. ++ ++=head2 as_formated_string(I<format>) ++ ++Returns a string representation of this package, formated according to ++I<format>. Format is a string, where each %{foo} token will get replaced by ++equivalent tag value. ++ ++=head2 get_name() ++ ++Returns the name of this package. ++ ++=head2 get_version() ++ ++Returns the version of this package. ++ ++=head2 get_release() ++ ++Returns the release of this package. ++ ++=head2 get_revision() ++ ++Returns the revision of this package. ++ ++=head2 get_arch() ++ ++Returns the architecture of this package. ++ ++=head2 get_file_name() ++ ++Returns the file name of this package (name-version-release.arch.extension). ++ ++=head2 is_source() ++ ++Returns true if this package is a source package. ++ ++=head2 is_binary() ++ ++Returns true if this package is a binary package. ++ ++=head2 is_debug() ++ ++Returns true if this package is a debug package. ++ ++=head2 get_type() ++ ++Returns the type (binary/source) of this package. ++ ++=head2 get_age() ++ ++Returns the age of this package ++ ++=head2 get_url() ++ ++Returns the URL of this package ++ ++=head2 get_summary() ++ ++Returns the summary of this package ++ ++=head2 get_description() ++ ++Returns the description of this package ++ ++=head2 get_packager() ++ ++Returns the packager of this package. ++ ++=head2 get_source_package() ++ ++Returns the name of the source package of this package. ++ ++=head2 get_tag($tag) ++ ++Returns the value of tag $tag of this package. ++ ++=head2 get_canonical_name() ++ ++Returns the canonical name of this package, shared by its multiple components, ++usually the one from the source package. ++ ++=head2 get_requires() ++ ++Returns the list of dependencies required by this package, each dependency ++being represented as an array reference, with the following informations: ++ ++=over ++ ++=item B<name> ++ ++Name of the dependency (index DEPENDENCY_NAME) ++ ++=item B<range> ++ ++Range of the dependency (index DEPENDENCY_RANGE) ++ ++=back ++ ++For more conveniency, fields index are available as constant in this package. ++ ++=head2 get_provides() ++ ++Returns the list of dependencies provided by this package, each dependency ++being represented as an array reference, using the same structure as previous method. ++ ++=head2 get_obsoletes() ++ ++Returns the list of other packages obsoleted by this one, each one ++being represented as an array reference, using the same structure as previous method. ++ ++=head2 get_conflicts() ++ ++Returns the list of other packages conflicting with this one. ++ ++=head2 get_files() ++ ++Returns the list of files contained in this package, each file being ++represented as an array reference, with the following informations: ++ ++=over ++ ++=item B<name> ++ ++Name of the file (index FILE_NAME). ++ ++=item B<mode> ++ ++Mode of the file (index FILE_MODE). ++ ++=item B<md5sum> ++ ++Md5sum of the file (index FILE_MD5SUM). ++ ++=back ++ ++For more conveniency, fields index are available as constant in this package. ++ ++=head2 get_gpg_key() ++ ++Returns the gpg key id of package signature. ++ ++=head2 get_information() ++ ++Returns formated informations about the package. ++ ++=head2 get_changes() ++ ++Returns the list of changes for this package, each change being ++represented as an array reference, with the following informations: ++ ++=over ++ ++=item B<author> ++ ++Author of the change (index CHANGE_AUTHOR). ++ ++=item B<time> ++ ++Time of the change (index CHANGE_TIME). ++ ++=item B<text> ++ ++Raw textual description of the change (index CHANGE_TEXT). ++ ++=back ++ ++For more conveniency, fields index are available as constant in this package. ++ ++=head2 get_last_change() ++ ++Returns the last change for this package, as as structure described before. ++ ++=head2 compare($package) ++ ++Compares ordering with other package, according to their corresponding revision ++tokens, and returns a numeric value: ++ ++=over ++ ++=item positive if this package is newer ++ ++=item null if both have same revision ++ ++=item negative if this package is older ++ ++=back ++ ++=head2 satisfy_range($range) ++ ++Returns a true value if this package revision satisfies given revision range. ++ ++=head2 sign($name, $path, $passphrase) ++ ++Signs the package with given name, keyring path and passphrase. ++ ++=head2 extract() ++ ++Extract package content in local directory. ++ ++=head1 SUBCLASSING ++ ++All instances methods have to be implemented. ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++sub get_file { ++ my ($self) = @_; ++ carp "Deprecated method, use as_file now"; ++ ++ return $self->as_file(); ++} ++ ++sub get_full_name { ++ my ($self) = @_; ++ carp "Deprecated method, use as_string now"; ++ ++ return $self->as_string(); ++} ++ ++sub compare_versions { ++ my ($self, $version1, $version2) = @_; ++ carp "Deprecated method, use compare_revisions now"; ++ ++ return $self->compare_revisions($version1, $version2); ++} ++ ++sub compare_ranges { ++ my ($self, $range1, $range2) = @_; ++ carp "Deprecated method, use are_range_compatible now"; ++ ++ return $self->check_ranges_compatibility($range1, $range2); ++} ++ ++sub get_revision_name { ++ my ($self) = @_; ++ carp "Deprecated method, use as_formated_string('%name-%version-%release') now"; ++ ++ return $self->as_formated_string('%{name}-%{version}-%{release}'); ++} ++ ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositoryMandriva_uploadpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,546 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Upload/Action/RSS.pm 857 2006-01-29T10:15:43.298856Z guillaume $ ++package Youri::Repository::Mandriva_upload; ++ ++=head1 NAME ++ ++Youri::Repository::PLF - PLF repository implementation ++ ++=head1 DESCRIPTION ++ ++This module implements PLF repository. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use File::Find 'find'; ++use base qw/Youri::Repository/; ++use MDV::Distribconf::Build; ++use SVN::Client; ++ ++use constant { ++ PACKAGE_CLASS => 'Youri::Package::URPM', ++ PACKAGE_CHARSET => 'utf8' ++}; ++ ++memoize('_get_media_config'); ++ ++my %translate_arch = ( ++ i386 => 'i586', ++ sparc64 => 'sparcv9', ++); ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ noarch => 'i586', # noarch packages policy ++ src => 'i586', ++ install_root => '', ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ queue => '', ++ rejected => '', ++ @_ ++ ); ++ foreach my $var ('upload_state') { ++ $self->{"_$var"} = []; ++ foreach my $value (split ' ', $options{$var}) { ++ push @{$self->{"_$var"}}, $value ++ } ++ } ++ print "Initializing repository\n"; ++ foreach my $v ('rejected', 'svn', 'queue', 'noarch', 'install_root', 'upload_root', 'verbose') { ++ $self->{"_$v"} = $options{$v} ++ } ++ foreach my $target (@{$options{targets}}) { ++ $self->{$target} = []; ++ print "Adding $target ($options{$target}{arch})\n" if $self->{_verbose}; ++ foreach my $value (split ' ', $options{$target}{arch}) { ++ push @{$self->{_arch}{$target}}, $value; ++ push @{$self->{_extra_arches}}, $value ++ } ++ } ++ $self ++} ++ ++sub get_group_id { ++ my ($user) = @_; ++ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); ++ $year+=1900; ++ $mon++; ++ my $hostname = `hostname`; ++ my ($host) = $hostname =~ /([^.]*)/; ++ sprintf "$year%02d%02d%02d%02d%02d.$user.$host.${$}_", $mon, $mday, $hour, $min, $sec; ++} ++ ++sub get_target_arch { ++ my ($self, $target) = $_; ++ return $self->{_arch}{$target} ++} ++ ++sub set_arch_changed { ++ my ($self, $target, $arch) = @_; ++ if ($arch eq 'noarch') { ++ $self->{_arch_changed}{$_} = 1 foreach @{$self->{_arch}{$target}} ++ } elsif ($arch eq 'src') { ++ $self->{_arch_changed} = $self->{_src} ++ } else { ++ $self->{_arch_changed}{$arch} = 1 ++ } ++} ++ ++sub get_arch_changed { ++ my ($self, $target) = @_; ++ return [ keys %{$self->{_arch_changed}} ] ++} ++ ++sub set_install_dir_changed { ++ my ($self, $install_dir) = @_; ++ $self->{_install_dir_changed}{$install_dir} = 1; ++} ++ ++sub get_install_dir_changed { ++ my ($self) = @_; ++ return [ keys %{$self->{_install_dir_changed}} ]; ++} ++ ++sub _get_media_config { ++ my ($self, $target) = @_; ++ my %media; ++ my $real_target = $target; ++ $real_target =~ s/_force//; ++ foreach my $arch (@{$self->{_arch}{$target}}) { ++ my $root = "$self->{_install_root}/$real_target/$arch"; ++ my $distrib = MDV::Distribconf::Build->new($root); ++ print "Getting media config from $root\n" if $self->{_verbose}; ++ $self->{distrib}{$arch} = $distrib; ++ $distrib->loadtree or die "$root does not seem to be a distribution tree\n"; ++ $distrib->parse_mediacfg; ++ foreach my $media ($distrib->listmedia) { ++ my $rpms = $distrib->getvalue($media, 'rpms'); ++ my $debug_for = $distrib->getvalue($media, 'debug_for'); ++ my $srpms = $distrib->getvalue($media, 'srpms'); ++ my $path = $distrib->getfullpath($media, 'path'); ++ if (!$rpms) { ++ if (-d $path) { ++ print "MEDIA defining $media in $path\n" if $self->{_verbose} > 1; ++ $media{$arch}{$media} = $path ++ } else { ++ print "ERROR $path does not exist for media $media on $arch\n" ++ } ++ } else { ++ my ($media) = split ' ', $rpms; ++ if (-d $path) { ++ print "MEDIA defining SOURCE media for $media in $path\n" if $self->{_verbose} > 1; ++ $media{src}{$media} = $path ++ } else { ++ print "ERROR $path does not exist for source media $media on $arch\n" ++ } ++ } ++ } ++ } ++ \%media ++} ++ ++sub get_package_class { ++ return PACKAGE_CLASS; ++} ++ ++sub get_package_charset { ++ return PACKAGE_CHARSET; ++} ++ ++sub get_upload_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ return ++ $self->{_upload_root} . ++ "/$self->{_queue}/$target/" . ++ _get_section($self, $package, $target, $user_context, $app_context) . ++ '/' . ++ ($user_context->{prefix} ? '' : get_group_id($user_context->{user})) ++} ++ ++sub get_install_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ return $self->_get_path($package, $target, $user_context, $app_context); ++} ++ ++ ++sub get_distribution_paths { ++ my ($self, $package, $target) = @_; ++ ++ return $self->_get_distribution_paths($package, $target); ++} ++ ++sub get_archive_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ return $self->_get_path($package, $target, $user_context, $app_context); ++} ++ ++sub get_reject_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ return $self->{_rejected}; ++} ++ ++ ++sub _get_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $section = $self->_get_section($package, $target, $user_context, $app_context); ++ my $arch = $app_context->{arch} || $package->get_arch(); ++ $arch = $translate_arch{$arch} || $arch; ++ if ($arch eq 'noarch') { ++ $arch = $self->{_noarch} ++ } elsif ($arch eq 'src') { ++ return "$target/SRPMS/$section" ++ } ++ "$target/$arch/media/$section" ++} ++ ++sub _get_distribution_paths { ++ my ($self, $package, $target) = @_; ++ ++ my $arch = $package->get_arch(); ++ $arch = $translate_arch{$arch} || $arch; ++ if ($arch eq 'noarch') { ++ map { "$target/$_" } $self->get_extra_arches; ++ } elsif ($arch eq 'src') { ++ die "no way to get distribution path using a $arch package"; ++ } else { ++ "$target/$arch"; ++ } ++} ++ ++sub get_arch { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ my $arch = $package->get_arch(); ++ $arch = $translate_arch{$arch} || $arch; ++ if ($arch eq 'noarch') { ++ $arch = $self->{_noarch} ++ } ++ $arch ++} ++ ++sub get_version_path { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $section = $self->_get_section($package, $target, $user_context, $app_context); ++ ++ return "$self->{_module}/$section"; ++} ++ ++=head2 get_replaced_packages($package, $target, $user_context, $app_context) ++ ++Overrides parent method to add libified packages. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @replaced_packages = ++ $self->SUPER::get_replaced_packages($package, $target, $user_context, $app_context); ++ ++ # mandriva lib policy: ++ # library package names change with revision, making mandatory to ++ # duplicate older revisions search with a custom pattern ++ my $name = $package->get_name(); ++ if ($name =~ /^(lib\w+[a-zA-Z_])[\d_\.]+([-\w]*)$/) { ++ push(@replaced_packages, ++ grep { $package->compare($_) > 0 } ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $user_context, $app_context), ++ PACKAGE_CLASS->get_pattern( ++ $1 . '[\d_\.]+' . $2, # custom name pattern ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ # kernel packages have the version in the name ++ # binary dkms built for old kernels have to be removed too ++ if ($name =~ /^kernel-([^\d]*-)?([\d.]*)-(.*)$/) { # "desktop", "2.6.28", "2mnb" ++ push(@replaced_packages, ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $user_context, $app_context), ++ PACKAGE_CLASS->get_pattern( ++ '(kernel-' . $1 . '\d.*|.*-kernel-[\d.]*-' . $1 . '\d.*)', ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ return @replaced_packages; ++ ++} ++ ++sub _get_main_section { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $section = $self->_get_section($package, $target, $user_context, $app_context); ++ my ($main_section) = $section =~ m,^([^/]+),; ++ $main_section ++} ++ ++sub _get_section { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ ++ my $name = $package->get_name(); ++ my $cname = $package->get_canonical_name(); ++ my $version = $package->get_version(); ++ my $release = $package->get_release(); ++ my $section = $user_context->{section}; ++ my $media = $self->_get_media_config($target); ++ my $arch = $package->get_arch(); ++ my $file = $package->as_file(); ++ $file =~ s,/+,/,g; # unneeded? ++ # FIXME: use $self->get_arch() ++ $arch = $self->{_noarch} if $arch eq 'noarch'; ++ $arch = $translate_arch{$arch} || $arch; ++ ++ if (!$section) { ++ $section = $self->{packages}{$file}{section}; ++ print "Section undefined, repository says it is '$section' for '$file'\n" if $self->{_verbose}; ++ } ++ if ($section && $section !~ /debug_/ && $package->is_debug()) { ++ $section = "debug_$section" ++ } ++ ++ # if have section already, check if it exists, and may return immediately ++ if ($section) { ++ print "Using requested section $section\n"; ++ if ($media->{$arch}{$section}) { ++ return $section ++ } else { ++ die "FATAL youri: unknown section $section for target $target for arch $arch\n" ++ } ++ } ++ # else, try to find section automatically ++ ++ # pattern for search of src package with specific version-release, ++ # should be searched first, because we prefer to find the precise ++ # section a package is already in ++ my $specific_source_pattern = PACKAGE_CLASS->get_pattern( ++ $cname, ++ $version, ++ $release, ++ 'src' ++ ); ++ ++ my $source_pattern = PACKAGE_CLASS->get_pattern( ++ $cname, ++ undef, ++ undef, ++ 'src' ++ ); ++ ++ # if a media has no source media configured, or if it is a debug ++ # package, we search in binary media ++ ++ # pattern for search when a binary media has no src media configured ++ my $specific_binary_pattern = PACKAGE_CLASS->get_pattern( ++ $name, ++ $version, ++ $release, ++ $arch ++ ); ++ ++ # last resort pattern: previous existing binary packages ++ my $binary_pattern = PACKAGE_CLASS->get_pattern( ++ $name, ++ undef, ++ undef, ++ $arch ++ ); ++ ++ # first try to find section for the specific version, as it is possibly already there; ++ # this is the case for when called in Youri::Submit::Action::Archive, to find the ++ # section the package got installed ++ print "Looking for package $name with version $version-$release\n"; ++ foreach my $m (keys %{$media->{$arch}}) { ++ print " .. section '$m' path '".$media->{$arch}{$m}."'\n" if $self->{_verbose}; ++ # - prefer source for non-debug packages, use binary if there is no source media configured ++ # - debug packages must be searched in binary medias, due to their ++ # src section != binary section; NOTE: should/need we search in ++ # src medias and add the 'debug_' prefix? ++ if (!$package->is_debug() && $media->{src}{$m}) { ++ next unless $self->get_files('', $media->{src}{$m}, $specific_source_pattern); ++ } else { ++ next unless $self->get_files('', $media->{$arch}{$m}, $specific_binary_pattern); ++ } ++ $section = $m; ++ last; ++ } ++ ++ # if still not found, try finding any version of the package in a ++ # /release subsection (safe default: /release is default for cooker, ++ # should be locked for released distros, and we don't risk wrongly ++ # choosing /backports, /testing, or /updates); ++ # this is the case for when called at submit, to find the section where ++ # the package already resides ++ if (!$section) { ++ # debug packages should be found by previous specific version search ++ # NOTE: as above, should/need we search here and add the 'debug_' prefix? ++ # ... probably... as at least mdv-youri-submit-force will process debug packages ++ if ($package->is_debug() && $self->{_verbose}) { ++ print "Warning: debug package $name with version $version-$release not found.\n"; ++ } ++ ++ print "Warning: Looking for any section with a package $name of any version\n"; ++ foreach my $m (keys %{$media->{$arch}}) { ++ print " .. section '$m' path '".$media->{$arch}{$m}."'\n" if $self->{_verbose}; ++ # NOTE: !$package->is_debug() test is here to prevent when above FATAL error is removed ++ next if $m !~ /release/ || ($m =~ /debug/ && !$package->is_debug()); ++ # - prefer source ++ if ($media->{src}{$m}) { ++ next unless $self->get_files('', $media->{src}{$m}, $source_pattern); ++ } else { ++ next unless $self->get_files('', $media->{$arch}{$m}, $binary_pattern); ++ } ++ $section = $m; ++ last; ++ } ++ } ++ ++ # FIXME: doing this here is wrong; this way the caller can never know if ++ # a section was actually found or not; should return undef and let the ++ # caller set a default (Note: IIRC PLF|Zarb has this right, see there) -spuk ++ print STDERR "Warning: Can't guess destination: section missing, defaulting to contrib/release\n" unless $section; ++ $section ||= 'contrib/release'; ++ ++ # next time we don't need to search everything again ++ $self->{packages}{$file}{section} = $section; ++ ++ print "Section is '$section'.\n"; ++ ++ return $section; ++} ++ ++sub get_upload_newer_revisions { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ my $name = $package->get_full_name; ++ $name =~ s/^\@\d+://; ++ my $pattern = $self->get_package_class()->get_pattern($package->get_name(), undef, undef, $arch); ++ my $media = $self->_get_media_config($target); ++ my @packages; ++ foreach my $state (@{$self->{_upload_state}}) { ++ foreach my $m (keys %{$media->{$arch}}) { ++ my $path = "$self->{_upload_root}/$state/$target/$m"; ++ print "Looking for package $package revisions for $target in $path (pattern $pattern)\n" if $self->{_verbose}; ++ find( ++ sub { ++ s/\d{14}\.[^.]*\.[^.]*\.\d+_//; ++ s/^\@\d+://; ++ return if ! /^$pattern/; ++ return if /\.info$/; ++ print "Find $_\n"; ++ push @packages, $File::Find::name if $package->check_ranges_compatibility("== $name", "< $_") ++ }, $path); ++ } ++ } ++ return ++ @packages; ++} ++ ++sub package_in_svn { ++ my ($self, $srpm_name) = @_; ++ my $ctx = new SVN::Client( ++ auth => [SVN::Client::get_simple_provider(), ++ SVN::Client::get_simple_prompt_provider(\&simple_prompt,2), ++ SVN::Client::get_username_provider()] ++ ); ++ ++ my $svn_entry = $ctx->ls("$self->{_svn}/$srpm_name", 'HEAD', 0); ++ if ($svn_entry) { ++ print "Package $srpm_name is in the SVN\n"; ++ return 1 ++ } ++} ++ ++sub get_svn_url { ++ my ($self) = @_; ++ $self->{_svn} ++} ++ ++sub get_revisions { ++ my ($self, $package, $target, $user_context, $app_context, $filter) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package revisions for $target\n" if $self->{_verbose} > 0; ++ ++ my $arch = $app_context->{arch} || $user_context->{arch} || $package->get_arch(); ++ my $media_arch = $arch eq 'noarch' ? $self->{_noarch} : $arch; ++ my $path = $arch eq 'src' ? "$target/SRPMS/" : "$target/$media_arch/media"; ++ my $media = $self->_get_section($package, $target, $user_context, $app_context); ++ my $name = $package->get_name(); ++ my @packages = map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ "$path/$media", ++ $self->get_package_class()->get_pattern( ++ $name, ++ undef, ++ undef, ++ $package->get_arch(), ++ ) ++ ); ++ ++ @packages = grep { $filter->($_) } @packages if $filter; ++ ++ return ++ sort { $b->compare($a) } # sort by revision order ++ @packages; ++} ++ ++sub reject { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ ++} ++ ++sub get_archive_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->{_archive_root} ++} ++ ++ ++# 20060801 warly ++# ++# Upload steps ++# SRPMS are uploaded in /home/mandrake/uploads/todo/$target/$media/group_id ++# ++# ++# ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositoryMandriva_upload_prepm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository/Mandriva_upload_pre.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,274 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Upload/Action/RSS.pm 857 2006-01-29T10:15:43.298856Z guillaume $ ++package Youri::Repository::Mandriva_upload_pre; ++ ++=head1 NAME ++ ++Youri::Repository::PLF - PLF repository implementation ++ ++=head1 DESCRIPTION ++ ++This module implements PLF repository. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use File::Find 'find'; ++use base qw/Youri::Repository/; ++use SVN::Client; ++use constant { ++ PACKAGE_CLASS => 'Youri::Package::URPM', ++ PACKAGE_CHARSET => 'utf8' ++}; ++ ++memoize('_get_section'); ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ module => 'SPECS', # CVS module ++ noarch => 'i586', # noarch packages policy ++ svn => '', ++ upload_root => '', ++ @_ ++ ); ++ ++ $self->{_module} = $options{module}; ++ $self->{_noarch} = $options{noarch}; ++ $self->{_svn} = $options{svn}; ++ $self->{_upload_root} = $options{upload_root}; ++ ++ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); ++ $year+=1900; ++ my $hostname = `hostname`; ++ my ($host) = $hostname =~ /([^.]*)/; ++ $self->{group_dir} = sprintf "$ENV{SUDO_USER}.$host.$$.$year%02d%02d%02d%02d%02d", $mon, $mday, $hour, $min, $sec; ++} ++ ++sub get_package_class { ++ return PACKAGE_CLASS; ++} ++ ++sub package_in_svn { ++ my ($self, $srpm_name) = @_; ++ my $ctx = new SVN::Client( ++ auth => [SVN::Client::get_simple_provider(), ++ SVN::Client::get_simple_prompt_provider(\&simple_prompt,2), ++ SVN::Client::get_username_provider()] ++ ); ++ ++ my $svn_entry = $ctx->ls("$self->{_svn}/", 'HEAD', 0); ++ foreach (keys %{$svn_entry}) { ++ if ($srpm_name eq $_) { ++ print "Package $_ is in the SVN\n"; ++ return 1 ++ } ++ } ++} ++ ++sub get_svn_url { ++ my ($self) = @_; ++ $self->{_svn} ++} ++ ++sub get_revisions { ++ my ($self, $package, $target, $define, $filter) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my $arch = $define->{arch} || $package->get_arch; ++ if ($arch eq 'src') { ++ $arch = 'SRPMS' ++ } else { ++ $arch .= '/media' ++ } ++ my @packages; ++ foreach my $dir ('main', 'contrib') { ++ print "Looking into $self->{_install_root}/$target/$arch/$dir/release\n"; ++ push @packages, ++ map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ "$target/$arch/$dir/release" , ++ $self->get_package_class()->get_pattern($package->get_name(),undef, undef, $arch) ++ ); ++ } ++ ++ @packages = grep { $filter->($_) } @packages if $filter; ++ ++ return ++ sort { $b->compare($a) } # sort by revision order ++ @packages; ++} ++ ++sub get_package_charset { ++ return PACKAGE_CHARSET; ++} ++ ++sub get_upload_dir { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ my $section = $self->_get_section($package, $target, $define); ++ my $media_path = $section eq 'main' ? $target : $target =~ /^cooker/ ? "contrib" : "$target/contrib"; ++ my $arch_path = $arch eq 'src' ? 'SRPMS' : 'RPMS'; ++ my $force = $target =~ /_force/ ? 'force' : ''; ++ $self->{_upload_root} . "/$media_path/$force/$arch_path/" ++} ++ ++sub get_arch { ++ my ($self, $package, $target, $define) = @_; ++ my $arch = $package->get_arch(); ++ if ($arch eq 'noarch') { ++ $arch = $self->{_noarch} ++ } ++ $arch ++} ++ ++sub get_install_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub get_archive_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub _get_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $arch = $package->get_arch; ++ if ($arch eq 'src') { ++ $arch = 'SRPMS' ++ } else { ++ $arch .= '/media' ++ } ++ my $section = $self->_get_section($package, $target, $define); ++ ++ return "$target/$arch/$section/release/"; ++} ++ ++ ++sub get_version_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section = $self->_get_section($package, $target, $define); ++ ++ return "$self->{_module}/$section/release/"; ++} ++ ++=head2 get_replaced_packages($package, $target, $define) ++ ++Overrides parent method to add libified packages. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @replaced_packages = ++ $self->SUPER::get_replaced_packages($package, $target, $define); ++ ++ # mandriva lib policy: ++ # library package names change with revision, making mandatory to ++ # duplicate older revisions search with a custom pattern ++ my $name = $package->get_name(); ++ if ($name =~ /^(lib\w+[a-zA-Z_])[\d_\.]+([-\w]*)$/) { ++ push(@replaced_packages, ++ grep { $package->compare($_) > 0 } ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $define), ++ PACKAGE_CLASS->get_pattern( ++ $1 . '[\d_\.]+' . $2, # custom name pattern ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ return @replaced_packages; ++ ++} ++ ++sub _get_section { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section; ++ ++ # try to find section automatically ++ my $arch = $package->get_arch(); ++ $arch = $self->{_noarch} if $arch eq 'noarch'; ++ ++ my $source_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_canonical_name(), ++ undef, ++ undef, ++ 'src' ++ ); ++ ++ my $binary_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_name(), ++ undef, ++ undef, ++ $arch ++ ); ++ ++ # for each potential section, try to match ++ # a suitable source patten in source directory ++ # a suitable binary patten in binary directory ++ foreach my $dir (qw/main contrib/) { ++ next unless ++ $self->get_files( ++ $self->{_install_root}, ++ "$target/SRPMS/$dir/release", ++ $source_pattern ++ ) || $self->get_files( ++ $self->{_install_root}, ++ "$target/$arch/media/$dir/release", ++ $binary_pattern ++ ); ++ print "Section is $dir\n"; ++ $section = $dir; ++ last; ++ } ++ ++ # use defined section if not found ++ $section = $define->{section} unless $section; ++ ++ $section || 'contrib' ++} ++ ++sub get_upload_newer_revisions { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ my $arch = $package->get_arch(); ++ my $pattern = $self->get_package_class()->get_pattern($package->get_name(), undef, undef, $arch); ++ print "Looking for package $package revisions for $target in $self->{_upload_root} (pattern $pattern)\n"; ++ my @packages; ++ foreach my $dir ('cooker', 'contrib') { ++ find(sub { return if ! /^$pattern/; print "Find $_\n"; push @packages, $File::Find::name if $package->compare($self->get_package_class()->new(file => $File::Find::name)) <= 0 }, "$self->{_upload_root}/$dir"); ++ } ++ return ++ @packages; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositoryPLFpm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository/PLF.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,196 @@ ++# $Id: /local/youri/soft/trunk/lib/Youri/Upload/Action/RSS.pm 857 2006-01-29T10:15:43.298856Z guillaume $ ++package Youri::Repository::PLF; ++ ++=head1 NAME ++ ++Youri::Repository::PLF - PLF repository implementation ++ ++=head1 DESCRIPTION ++ ++This module implements PLF repository. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use Memoize; ++use base qw/Youri::Repository/; ++use constant { ++ PACKAGE_CLASS => 'Youri::Package::URPM', ++ PACKAGE_CHARSET => 'utf8' ++}; ++ ++memoize('_get_section'); ++ ++ ++sub _init { ++ my $self = shift; ++ my %options = ( ++ module => 'SPECS', # CVS module ++ noarch => 'noarch', # noarch packages policy ++ @_ ++ ); ++ ++ $self->{_module} = $options{module}; ++ $self->{_noarch} = $options{noarch}; ++} ++ ++sub get_package_class { ++ return PACKAGE_CLASS; ++} ++ ++sub get_package_charset { ++ return PACKAGE_CHARSET; ++} ++ ++sub get_install_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub get_archive_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ return $self->_get_path($package, $target, $define); ++} ++ ++sub _get_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section = $self->_get_section($package, $target, $define); ++ ++ my $subpath = $self->_get_subpath($package, $target); ++ ++ return "$section/$subpath"; ++} ++ ++ ++sub get_version_path { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section = $self->_get_section($package, $target, $define); ++ ++ return "$self->{_module}/$section"; ++} ++ ++=head2 get_replaced_packages($package, $target, $define) ++ ++Overrides parent method to add libified packages. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $define) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ my @replaced_packages = ++ $self->SUPER::get_replaced_packages($package, $target, $define); ++ ++ # mandriva lib policy: ++ # library package names change with revision, making mandatory to ++ # duplicate older revisions search with a custom pattern ++ my $name = $package->get_name(); ++ if ($name =~ /^(lib\w+[a-zA-Z_])[\d_\.]+([-\w]*)$/) { ++ push(@replaced_packages, ++ grep { $package->compare($_) > 0 } ++ map { PACKAGE_CLASS->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $define), ++ PACKAGE_CLASS->get_pattern( ++ $1 . '[\d_\.]+' . $2, # custom name pattern ++ undef, ++ undef, ++ $package->get_arch() ++ ), ++ ) ++ ); ++ } ++ ++ return @replaced_packages; ++ ++} ++ ++sub _get_section { ++ my ($self, $package, $target, $define) = @_; ++ ++ my $section; ++ ++ # try to find section automatically ++ my $arch = $package->get_arch(); ++ ++ my $source_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_canonical_name(), ++ undef, ++ undef, ++ 'src' ++ ); ++ ++ my $binary_pattern = PACKAGE_CLASS->get_pattern( ++ $package->get_name(), ++ undef, ++ undef, ++ $arch ++ ); ++ ++ my $source_subpath = $self->_get_subpath($package, $target, 'src'); ++ my $binary_subpath = $self->_get_subpath($package, $target, $arch); ++ ++ # for each potential section, try to match ++ # a suitable source patten in source directory ++ # a suitable binary patten in binary directory ++ foreach my $dir (qw/free non-free/) { ++ next unless ++ $self->get_files( ++ $self->{_install_root}, ++ "$dir/$source_subpath", ++ $source_pattern ++ ) || $self->get_files( ++ $self->{_install_root}, ++ "$dir/$binary_subpath", ++ $binary_pattern ++ ); ++ $section = $dir; ++ last; ++ } ++ ++ # use defined section if not found ++ $section = $define->{section} unless $section; ++ ++ die "Can't guess destination: section missing" unless $section; ++ ++ return $section; ++} ++ ++sub _get_subpath { ++ my ($self, $package, $target, $arch) = @_; ++ ++ my $subpath; ++ ++ # use package arch if not specified ++ $arch = $package->get_arch() unless $arch; ++ ++ if ($arch eq 'src') { ++ $subpath = 'src'; ++ } else { ++ if ($arch eq 'noarch') { ++ $subpath = "$target/$self->{_noarch}"; ++ } else { ++ $subpath = "$target/$arch"; ++ } ++ } ++ ++ return $subpath; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriRepositorypm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Repository.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,492 @@ ++# $Id: Base.pm 631 2006-01-26 22:22:23Z guillomovitch $ ++package Youri::Repository; ++ ++=head1 NAME ++ ++Youri::Repository - Abstract repository ++ ++=head1 DESCRIPTION ++ ++This abstract class defines Youri::Repository interface. ++ ++=cut ++ ++use warnings; ++use strict; ++use Carp; ++use File::Basename; ++use Youri::Package; ++ ++=head1 CLASS METHODS ++ ++ ++=head2 new(%args) ++ ++Creates and returns a new Youri::Repository object. ++ ++No generic parameters (subclasses may define additional ones). ++ ++Warning: do not call directly, call subclass constructor instead. ++ ++=cut ++ ++sub new { ++ my $class = shift; ++ croak "Abstract class" if $class eq __PACKAGE__; ++ ++ my %options = ( ++ install_root => '', # path to top-level directory ++ archive_root => '', # path to top-level directory ++ version_root => '', # path to top-level directory ++ test => 0, # test mode ++ verbose => 0, # verbose mode ++ @_ ++ ); ++ ++ ++ croak "no install root" unless $options{install_root}; ++ croak "invalid install root" unless -d $options{install_root}; ++ ++ my $self = bless { ++ _install_root => $options{install_root}, ++ _archive_root => $options{archive_root}, ++ _version_root => $options{version_root}, ++ _test => $options{test}, ++ _verbose => $options{verbose}, ++ }, $class; ++ ++ $self->_init(%options); ++ ++ return $self; ++} ++ ++sub _init { ++ # do nothing ++} ++ ++=head1 INSTANCE METHODS ++ ++=head2 get_package_class() ++ ++Return package class for this repository. ++ ++=cut ++ ++sub get_package_class { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ return $self->{_package_class}; ++} ++ ++=head2 get_package_charset() ++ ++Return package charset for this repository. ++ ++=cut ++ ++sub get_package_charset { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ return $self->{_package_charset}; ++} ++ ++=head2 get_extra_arches() ++ ++Return the list of additional archictectures to handle when dealing with noarch ++packages. ++ ++=cut ++ ++sub get_extra_arches { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ return @{$self->{_extra_arches}}; ++} ++ ++ ++=head2 get_older_revisions($package, $target, $user_context, $app_context) ++ ++Get all older revisions from a package found in its installation directory, as a ++list of L<Youri::Package> objects. ++ ++=cut ++ ++sub get_older_revisions { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package older revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ return $self->get_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context, ++ sub { return $package->compare($_[0]) > 0 } ++ ); ++} ++ ++=head2 get_last_older_revision($package, $target, $user_context, $app_context) ++ ++Get last older revision from a package found in its installation directory, as a ++single L<Youri::Package> object. ++ ++=cut ++ ++sub get_last_older_revision { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package last older revision for $target\n" ++ if $self->{_verbose} > 0; ++ ++ return ( ++ $self->get_older_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ ) ++ )[0]; ++} ++ ++=head2 get_newer_revisions($package, $target, $user_context, $app_context) ++ ++Get all newer revisions from a package found in its installation directory, as ++a list of L<Youri::Package> objects. ++ ++=cut ++ ++sub get_newer_revisions { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package newer revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ return $self->get_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context, ++ sub { return $_[0]->compare($package) > 0 } ++ ); ++} ++ ++ ++=head2 get_revisions($package, $target, $user_context, $app_context, $filter) ++ ++Get all revisions from a package found in its installation directory, using an ++optional filter, as a list of L<Youri::Package> objects. ++ ++=cut ++ ++sub get_revisions { ++ my ($self, $package, $target, $user_context, $app_context, $filter) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for package $package revisions for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my @packages = ++ map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ ), ++ $self->get_package_class()->get_pattern( ++ $package->get_name(), ++ undef, ++ undef, ++ $package->get_arch(), ++ ) ++ ); ++ @packages = grep { $filter->($_) } @packages if $filter; ++ ++ return ++ sort { $b->compare($a) } # sort by revision order ++ @packages; ++} ++ ++=head2 get_obsoleted_packages($package, $target, $user_context, $app_context) ++ ++Get all packages obsoleted by given one, as a list of L<Youri::Package> ++objects. ++ ++=cut ++ ++sub get_obsoleted_packages { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for packages obsoleted by $package for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my @packages; ++ foreach my $obsolete ($package->get_obsoletes()) { ++ my $pattern = $self->get_package_class()->get_pattern($obsolete->[Youri::Package::DEPENDENCY_NAME]); ++ my $range = $obsolete->[Youri::Package::DEPENDENCY_RANGE]; ++ push(@packages, ++ grep { $range ? $_->satisfy_range($range) : 1 } ++ map { $self->get_package_class()->new(file => $_) } ++ $self->get_files( ++ $self->{_install_root}, ++ $self->get_install_path( ++ $package, $target, ++ $user_context, ++ $app_context ++ ), ++ $pattern ++ ) ++ ); ++ } ++ ++ return @packages; ++} ++ ++=head2 get_replaced_packages($package, $target, $user_context, $app_context) ++ ++Get all packages replaced by given one, as a list of L<Youri::Package> ++objects. ++ ++=cut ++ ++sub get_replaced_packages { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ print "Looking for packages replaced by $package for $target\n" ++ if $self->{_verbose} > 0; ++ ++ my @list; ++ ++ # collect all older revisions ++ push(@list, $self->get_older_revisions( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ )); ++ ++ # noarch packages are potentially linked from other directories ++ if ($package->get_arch() eq 'noarch') { ++ foreach my $arch ($self->get_extra_arches()) { ++ push(@list, $self->get_older_revisions( ++ $package, ++ $target, ++ $user_context, ++ { arch => $arch } ++ )); ++ } ++ } ++ ++ # collect all obsoleted packages ++ push(@list, $self->get_obsoleted_packages( ++ $package, ++ $target, ++ $user_context, ++ $app_context ++ )); ++ ++ return @list; ++} ++ ++=head2 get_files($path, $pattern) ++ ++Get all files found in a directory, using an optional filtering pattern ++(applied to the whole file name), as a list of files. ++ ++=cut ++ ++sub get_files { ++ my ($self, $root, $path, $pattern) = @_; ++ croak "Not a class method" unless ref $self; ++ # debugging for bug 34999 ++ print "Looking for files matching $pattern in $root/$path\n"; ++# if $self->{_verbose} > 1; ++ ++ my $grep = ""; ++ $grep = "-regextype posix-egrep -regex '.*\/$pattern'" if ($pattern); ++ # XXX: run find in a directory the user is guaranteed to have read ++ # permissions! find simply exits with error if the user doesn't have ++ # read permission on the *current* dir; as this code is run thru many ++ # sudo invocations, sometimes the user calling it has $HOME chmoded to ++ # 0700, making find fail when run as mandrake ++ # debugging for bug 34999 ++ print ".. running command: find -L $root/$path $grep -type f\n"; ++ my @files = map { chop; $_; } `cd && find -L $root/$path $grep -type f`; ++ die "FATAL: get_files(): find failed!" if ($?); ++ ++ return @files; ++} ++ ++=head2 get_install_root() ++ ++Returns installation root ++ ++=cut ++ ++sub get_install_root { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_install_root}; ++} ++ ++ ++=head2 get_distribution_roots() ++ ++Returns distribution roots (ie install_root + target + arch) ++(it returns a list in case of noarch) ++ ++=cut ++ ++sub get_distribution_roots { ++ my ($self, $package, $target) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ map { ++ $self->_get_dir($self->{_install_root}, $_); ++ } $self->get_distribution_paths($package, $target); ++} ++ ++=head2 get_install_dir($package, $target, $user_context, $app_context) ++ ++Returns install destination directory for given L<Youri::Package> object ++and given target. ++ ++=cut ++ ++sub get_install_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->_get_dir( ++ $self->{_install_root}, ++ $self->get_install_path($package, $target, $user_context, $app_context) ++ ); ++} ++ ++=head2 get_archive_root() ++ ++Returns archiving root ++ ++=cut ++ ++sub get_archive_root { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_archive_root}; ++} ++ ++=head2 get_archive_dir($package, $target, $user_context, $app_context) ++ ++Returns archiving destination directory for given L<Youri::Package> object ++and given target. ++ ++=cut ++ ++sub get_archive_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->_get_dir( ++ $self->{_archive_root}, ++ $self->get_archive_path($package, $target, $user_context, $app_context) ++ ); ++} ++ ++ ++=head2 get_version_root() ++ ++Returns versionning root ++ ++=cut ++ ++sub get_version_root { ++ my ($self) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->{_version_root}; ++} ++ ++=head2 get_version_dir($package, $target, $user_context, $app_context) ++ ++Returns versioning destination directory for given L<Youri::Package> ++object and given target. ++ ++=cut ++ ++sub get_version_dir { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return $self->_get_dir( ++ $self->{_version_root}, ++ $self->get_version_path($package, $target, $user_context, $app_context) ++ ); ++} ++ ++sub _get_dir { ++ my ($self, $root, $path) = @_; ++ ++ return substr($path, 0, 1) eq '/' ? ++ $path : ++ $root . '/' . $path; ++} ++ ++=head2 get_install_file($package, $target, $user_context, $app_context) ++ ++Returns install destination file for given L<Youri::Package> object and ++given target. ++ ++=cut ++ ++sub get_install_file { ++ my ($self, $package, $target, $user_context, $app_context) = @_; ++ croak "Not a class method" unless ref $self; ++ ++ return ++ $self->get_install_dir($package, $target, $user_context, $app_context) . ++ '/' . ++ $package->get_file_name(); ++} ++ ++=head2 get_install_path($package, $target, $user_context, $app_context) ++ ++Returns installation destination path (relative to repository root) for given ++L<Youri::Package> object and given target. ++ ++=head2 get_archive_path($package, $target, $user_context, $app_context) ++ ++Returns archiving destination path (relative to repository root) for given ++L<Youri::Package> object and given target. ++ ++=head2 get_version_path($package, $target, $user_context, $app_context) ++ ++Returns versioning destination path (relative to repository root) for given ++L<Youri::Package> object and given target. ++ ++=head1 SUBCLASSING ++ ++The following methods have to be implemented: ++ ++=over ++ ++=item get_install_path ++ ++=item get_archive_path ++ ++=item get_version_path ++ ++=back ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunklibYouriUtilspm">Added: build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm (rev 0) ++++ build_system/mdv-youri-core/trunk/lib/Youri/Utils.pm 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,98 @@ ++# $Id: Utils.pm 1713 2006-10-16 16:39:53Z warly $ ++package Youri::Utils; ++ ++=head1 NAME ++ ++Youri::Utils - Youri shared functions ++ ++=head1 DESCRIPTION ++ ++This module implement some helper functions for all youri applications. ++ ++=cut ++ ++use base qw(Exporter); ++use Carp; ++use strict; ++use warnings; ++ ++our @EXPORT = qw( ++ create_instance ++ load_class ++ add2hash ++ add2hash_ ++); ++ ++=head2 create_instance($class, $config, $options) ++ ++Create an instance from a plugin implementing given interface, using given ++configuration and local options. ++Returns a plugin instance, or undef if something went wrong. ++ ++=cut ++ ++sub create_instance { ++ my ($interface, $config, $options) = @_; ++ ++ croak 'No interface given' unless $interface; ++ croak 'No config given' unless $config; ++ ++ my $class = $config->{class}; ++ if (!$class) { ++ carp "No class given, can't load plugin"; ++ return; ++ } ++ ++ # ensure loaded ++ load_class($class); ++ ++ # check interface ++ if (!$class->isa($interface)) { ++ carp "$class is not a $interface"; ++ return; ++ } ++ ++ # instantiate ++ no strict 'refs'; ++ ++ return $class->new( ++ $config->{options} ? %{$config->{options}} : (), ++ $options ? %{$options} : (), ++ ); ++} ++ ++sub load_class { ++ my ($class) = @_; ++ ++ $class .= '.pm'; ++ $class =~ s/::/\//g; ++ require $class; ++} ++ ++# structure helpers ++ ++sub add2hash { ++ my ($a, $b) = @_; ++ while (my ($k, $v) = each %{$b || {}}) { ++ $a->{$k} ||= $v; ++ } ++ return $a; ++} ++ ++sub add2hash_ { ++ my ($a, $b) = @_; ++ while (my ($k, $v) = each %{$b || {}}) { ++ exists $a->{$k} or $a->{$k} = $v; ++ } ++ return $a; ++} ++ ++=head1 COPYRIGHT AND LICENSE ++ ++Copyright (C) 2002-2006, YOURI project ++ ++This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ++ ++=cut ++ ++1; + +<a id="build_systemmdvyouricoretrunkt00distributiont">Added: build_system/mdv-youri-core/trunk/t/00distribution.t</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/t/00distribution.t (rev 0) ++++ build_system/mdv-youri-core/trunk/t/00distribution.t 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,15 @@ ++#!/usr/bin/perl ++# $Id: 00distribution.t 1179 2006-08-05 08:30:57Z warly $ ++ ++use Test::More; ++ ++BEGIN { ++ eval { ++ require Test::Distribution; ++ }; ++ if($@) { ++ plan skip_all => 'Test::Distribution not installed'; ++ } else { ++ import Test::Distribution only => [ qw/use pod description/ ]; ++ } ++} + + +Property changes on: build_system/mdv-youri-core/trunk/t/00distribution.t +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyouricoretrunktcowsay30311mdv20070noarchrpm">Added: build_system/mdv-youri-core/trunk/t/cowsay-3.03-11mdv2007.0.noarch.rpm</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/cowsay-3.03-11mdv2007.0.noarch.rpm +___________________________________________________________________ +<a id="svnmimetype">Added: svn:mime-type</a> + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktgpghomepubringgpg">Added: build_system/mdv-youri-core/trunk/t/gpghome/pubring.gpg</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/gpghome/pubring.gpg +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktgpghomesecringgpg">Added: build_system/mdv-youri-core/trunk/t/gpghome/secring.gpg</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/gpghome/secring.gpg +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktgpghometrustdbgpg">Added: build_system/mdv-youri-core/trunk/t/gpghome/trustdb.gpg</a> +=================================================================== +(Binary files differ) + + +Property changes on: build_system/mdv-youri-core/trunk/t/gpghome/trustdb.gpg +___________________________________________________________________ +Added: svn:mime-type + + application/octet-stream + +<a id="build_systemmdvyouricoretrunktpackaget">Added: build_system/mdv-youri-core/trunk/t/package.t</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/t/package.t (rev 0) ++++ build_system/mdv-youri-core/trunk/t/package.t 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,482 @@ ++#!/usr/bin/perl ++# $Id: /local/youri/soft/trunk/t/version.t 2257 2006-07-05T09:22:47.088572Z guillaume $ ++ ++use Test::More; ++use Test::Exception; ++use Youri::Utils; ++use File::Temp qw/tempdir/; ++use File::Basename; ++use strict; ++ ++my @classes = qw/ ++ Youri::Package::URPM ++ Youri::Package::RPM4 ++/; ++my $dir = dirname($0); ++my $rpm = 'cowsay-3.03-11mdv2007.0.noarch.rpm'; ++my $fake_rpm = 'foobar.rpm'; ++plan(tests => 37 * scalar @classes); ++ ++foreach my $class (@classes) { ++ load_class($class); ++ ++ my $temp_dir = tempdir(CLEANUP => 1); ++ my $file = "$dir/$rpm"; ++ my $fake_file = "$temp_dir/$fake_rpm"; ++ ++ # instanciation errors ++ dies_ok { $class->new(file => undef) } 'undefined file'; ++ dies_ok { $class->new(file => $fake_file) } 'non-existant file'; ++ system('touch', $fake_file); ++ chmod 0000, $fake_file; ++ dies_ok { $class->new(file => $fake_file) } 'non-readable file'; ++ chmod 0644, $fake_file; ++ dies_ok { $class->new(file => $fake_file) } 'non-rpm file'; ++ ++ my $package = $class->new(file => $file); ++ isa_ok($package, $class); ++ ++ # tag value access ++ is($package->get_name(), 'cowsay', 'get name directly'); ++ is($package->get_tag('name'), 'cowsay', 'get name indirectly'); ++ is($package->get_version(), '3.03', 'get version directly'); ++ is($package->get_tag('version'), '3.03', 'get version indirectly'); ++ is($package->get_release(), '11mdv2007.0', 'get release directly'); ++ is($package->get_tag('release'), '11mdv2007.0', 'get release indirectly'); ++ is($package->get_arch(), 'noarch', 'get arch directly'); ++ is($package->get_tag('arch'), 'noarch', 'get arch indirectly'); ++ is($package->get_summary(), 'Configurable talking cow', 'get summary directly'); ++ is($package->get_tag('summary'), 'Configurable talking cow', 'get summary indirectly'); ++ is($package->get_url(), 'http://www.nog.net/~tony/warez/cowsay.shtml', 'get url directly'); ++ is($package->get_tag('url'), 'http://www.nog.net/~tony/warez/cowsay.shtml', 'get url indirectly'); ++ is($package->get_packager(), 'Guillaume Rousse <guillomovitch@mandriva.org>', 'get packager directly'); ++ is($package->get_tag('packager'), 'Guillaume Rousse <guillomovitch@mandriva.org>', 'get packager indirectly'); ++ is($package->get_file_name(), 'cowsay-3.03-11mdv2007.0.noarch.rpm', 'file name'); ++ is($package->get_revision(), '3.03-11mdv2007.0', 'revision'); ++ ++ # name formating ++ is($package->as_formated_string('%{name}-%{version}-%{release}'), 'cowsay-3.03-11mdv2007.0', 'formated string name'); ++ is($package->as_string(), 'cowsay-3.03-11mdv2007.0.noarch', 'default string'); ++ is($package, 'cowsay-3.03-11mdv2007.0.noarch', 'stringification'); ++ ++ # type ++ ok(!$package->is_source(), 'not a source package'); ++ ok($package->is_binary(), 'a binary package'); ++ is($package->get_type(), 'binary', 'a binary package'); ++ ++ # gpg key ++ is($package->get_gpg_key(), '26752624', 'get gpg key'); ++ ++ # dependencies ++ is_deeply( ++ [ $package->get_requires() ], ++ [ ++ [ 'perl-base', undef ], ++ [ 'perl(Cwd)', undef ], ++ [ 'perl(File::Basename)', undef ], ++ [ 'perl(Getopt::Std)', undef ], ++ [ 'perl(Text::Tabs)', undef ], ++ [ 'perl(Text::Wrap)', undef ] ++ ], ++ 'requires' ++ ); ++ is_deeply( ++ [ $package->get_provides() ], ++ [ ++ [ 'cowsay', '== 3.03-11mdv2007.0'] ++ ], ++ 'provides' ++ ); ++ is_deeply( ++ [ $package->get_obsoletes() ], ++ [ ], ++ 'obsoletes' ++ ); ++ is_deeply( ++ [ $package->get_conflicts() ], ++ [ ], ++ 'conflicts' ++ ); ++ ++ # files ++ is_deeply( ++ [ $package->get_files() ], ++ [ ++ [ ++ '/etc/bash_completion.d/cowsay', ++ 33188, ++ '6048be1dd827011c15cab0c3db1f438d' ++ ], ++ [ ++ '/usr/bin/cowsay', ++ 33261, ++ 'b405026c6040eeb4781ca5c523129fe4' ++ ], ++ [ ++ '/usr/bin/cowthink', ++ 41471, ++ '' ++ ], ++ [ ++ '/usr/share/cows', ++ 16877, ++ '' ++ ], ++ [ ++ '/usr/share/cows/beavis.zen.cow', ++ 33188, ++ '582b2ddb72122d3aa078730abd0456b3' ++ ], ++ [ ++ '/usr/share/cows/bong.cow', ++ 33188, ++ '045f9bf39c027dded9a7145f619bac02' ++ ], ++ [ ++ '/usr/share/cows/bud-frogs.cow', ++ 33188, ++ '5c61632eb06305d613061882e1955cd2' ++ ], ++ [ ++ '/usr/share/cows/bunny.cow', ++ 33188, ++ '05eb914d3b96aea903542cb29f5c42c7' ++ ], ++ [ ++ '/usr/share/cows/cheese.cow', ++ 33188, ++ 'f3618110a22d8e9ecde888c1f5e38b61' ++ ], ++ [ ++ '/usr/share/cows/cower.cow', ++ 33188, ++ 'd73ea60eec692555a34a9f3eec981578' ++ ], ++ [ ++ '/usr/share/cows/daemon.cow', ++ 33188, ++ 'a7dd7588ee0386a0f29e88e4881885ee' ++ ], ++ [ ++ '/usr/share/cows/default.cow', ++ 33188, ++ 'f1206515a0f27e9d5cf09c188e46bc82' ++ ], ++ [ ++ '/usr/share/cows/dragon-and-cow.cow', ++ 33188, ++ '0ca99b8edd1a9d14fd231a88d9746b39' ++ ], ++ [ ++ '/usr/share/cows/dragon.cow', ++ 33188, ++ '448f736bf56dccafa2635e71e7485345' ++ ], ++ [ ++ '/usr/share/cows/duck.cow', ++ 33188, ++ 'd8ffcd64667d2e3697a3e8b65e8bea9d' ++ ], ++ [ ++ '/usr/share/cows/elephant-in-snake.cow', ++ 33188, ++ 'c5a9f406277e0e8a674bd3ffb503738f' ++ ], ++ [ ++ '/usr/share/cows/elephant.cow', ++ 33188, ++ 'e355c72e893787376c047805d4a1fe9d' ++ ], ++ [ ++ '/usr/share/cows/eyes.cow', ++ 33188, ++ 'b2eb5b612fae17877895aa6edafa0a5f' ++ ], ++ [ ++ '/usr/share/cows/flaming-sheep.cow', ++ 33188, ++ '3213cfa04a069f42d71115ca623a2f95' ++ ], ++ [ ++ '/usr/share/cows/ghostbusters.cow', ++ 33188, ++ 'df294e6278bcb275aecb0fbd6b2546ba' ++ ], ++ [ ++ '/usr/share/cows/girafe.cow', ++ 33188, ++ '6d2e142313109b6a5a0a45dba0f11351' ++ ], ++ [ ++ '/usr/share/cows/head-in.cow', ++ 33188, ++ '365287a5d1f34a53f8716285e79c28df' ++ ], ++ [ ++ '/usr/share/cows/hellokitty.cow', ++ 33188, ++ 'e0bbea69c4cbcfb3d799740ccc8a0b0e' ++ ], ++ [ ++ '/usr/share/cows/kenny.cow', ++ 33188, ++ '16ce8c334a7547197ac4c9e8a1d6ae90' ++ ], ++ [ ++ '/usr/share/cows/kiss.cow', ++ 33188, ++ '2a7bdd4a20741b7769af463bf09e64e8' ++ ], ++ [ ++ '/usr/share/cows/kitty.cow', ++ 33188, ++ '76d65a3ebfbacb16a654c1aa1af6ed27' ++ ], ++ [ ++ '/usr/share/cows/koala.cow', ++ 33188, ++ 'cc524706707f32253dd06fc548334f11' ++ ], ++ [ ++ '/usr/share/cows/kosh.cow', ++ 33188, ++ 'e4e28e0f472bd524fd1b44c67ae357c2' ++ ], ++ [ ++ '/usr/share/cows/luke-koala.cow', ++ 33188, ++ '63bbc35da73cd22b8cf25f86dcf9f870' ++ ], ++ [ ++ '/usr/share/cows/mech-and-cow', ++ 33188, ++ '12c0320b33704d8564dd97278d056204' ++ ], ++ [ ++ '/usr/share/cows/meow.cow', ++ 33188, ++ 'a6092008647ed37cfe1663d10e388cbb' ++ ], ++ [ ++ '/usr/share/cows/milk.cow', ++ 33188, ++ 'd26ac36e13e77dabb408e104fc8e0167' ++ ], ++ [ ++ '/usr/share/cows/moofasa.cow', ++ 33188, ++ '5fcdd4a9f3bf521c337af0a066b14512' ++ ], ++ [ ++ '/usr/share/cows/moose.cow', ++ 33188, ++ 'dcfa09df7d2b9afa112dab374bf06e99' ++ ], ++ [ ++ '/usr/share/cows/mutilated.cow', ++ 33188, ++ '24cdaef0a29fb44dc673abf19a8ba631' ++ ], ++ [ ++ '/usr/share/cows/phaco.cow', ++ 33188, ++ 'f277c1bf92ce2a3f6058955ba93758aa' ++ ], ++ [ ++ '/usr/share/cows/pumpkin.cow', ++ 33188, ++ 'c661ea78714c1ce31559f77d73694473' ++ ], ++ [ ++ '/usr/share/cows/ren.cow', ++ 33188, ++ '3d7941d454779e000adc1c91e5f0b20b' ++ ], ++ [ ++ '/usr/share/cows/satanic.cow', ++ 33188, ++ 'a69ca42a31486757ddcb322a1e68f886' ++ ], ++ [ ++ '/usr/share/cows/shark.cow', ++ 33188, ++ 'd8950ec63abb00bbd9d96ec63637c1ac' ++ ], ++ [ ++ '/usr/share/cows/sheep.cow', ++ 33188, ++ '543b75f295cbd51326f5a40f111469f1' ++ ], ++ [ ++ '/usr/share/cows/skeleton.cow', ++ 33188, ++ '64f6ec1a0c170508e72269d533492e57' ++ ], ++ [ ++ '/usr/share/cows/small.cow', ++ 33188, ++ '50cb1c55628c439fc81f96db9d855252' ++ ], ++ [ ++ '/usr/share/cows/sodomized.cow', ++ 33188, ++ 'b4888afcca51629cc3138b283608b837' ++ ], ++ [ ++ '/usr/share/cows/stegosaurus.cow', ++ 33188, ++ 'fb0e45d101a3ecba9cf6e112facbbc7e' ++ ], ++ [ ++ '/usr/share/cows/stimpy.cow', ++ 33188, ++ '9b4ec6e0750ba0eeaaa432d8d3413559' ++ ], ++ [ ++ '/usr/share/cows/supermilker.cow', ++ 33188, ++ '316573fb585e4a6b375373c85be025b1' ++ ], ++ [ ++ '/usr/share/cows/surgery.cow', ++ 33188, ++ '7f25005083c1fde19d4e548c005ef000' ++ ], ++ [ ++ '/usr/share/cows/telebears.cow', ++ 33188, ++ '15f00abb070d9018ce6ef3441e936ef4' ++ ], ++ [ ++ '/usr/share/cows/three-eyes.cow', ++ 33188, ++ 'c85faef9496f4a5b111bd92bfd7e7528' ++ ], ++ [ ++ '/usr/share/cows/turkey.cow', ++ 33188, ++ '484b5bc69c09d420d7fd5586d8570f04' ++ ], ++ [ ++ '/usr/share/cows/turtle.cow', ++ 33188, ++ '87eed5a00e88860b78dbec04efcdede3' ++ ], ++ [ ++ '/usr/share/cows/tux.cow', ++ 33188, ++ 'dc1db4eac66c99179ef6adb15dd75bda' ++ ], ++ [ ++ '/usr/share/cows/udder.cow', ++ 33188, ++ 'd97f78887c3b218a54876edc51f2963b' ++ ], ++ [ ++ '/usr/share/cows/vader-koala.cow', ++ 33188, ++ '7b5dd51278f0fa217a70a9b499f97a07' ++ ], ++ [ ++ '/usr/share/cows/vader.cow', ++ 33188, ++ '97b4ef9fc4c26082f253e9f0f35c4590' ++ ], ++ [ ++ '/usr/share/cows/www.cow', ++ 33188, ++ 'ef4c0bc8330f329666e1705f97f283cc' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03', ++ 16877, ++ '' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03/INSTALL', ++ 33188, ++ '3333fd2865107626d5dffc0dbfb7e244' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03/LICENSE', ++ 33188, ++ 'f879dda90a5a9928253a63ecd76406e6' ++ ], ++ [ ++ '/usr/share/doc/cowsay-3.03/README', ++ 33188, ++ 'a5c1c61e4920c278a735cdaaca62453e' ++ ], ++ [ ++ '/usr/share/man/man1/cowsay.1.bz2', ++ 33188, ++ '01fdd49d0b477f20099aae384fe8c1b2' ++ ], ++ [ ++ '/usr/share/man/man1/cowthink.1.bz2', ++ 41471, ++ '' ++ ] ++ ], ++ 'files' ++ ); ++ ++ # changelog ++ is_deeply( ++ [ $package->get_changes() ], ++ [ ++ [ ++ 'Guillaume Rousse <guillomovitch@mandriva.org> 3.03-11mdv2007.0', ++ 1149847200, ++ '- %mkrel' . "\n" . ++ '- rpmbuildupdate aware', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandriva.org> 3.03-10mdk ', ++ 1117879200, ++ '- fix man page (fix #16291)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandrake.org> 3.03-9mdk ', ++ 1090058400, ++ '- hurry businesman compliant (aka two new wonderful cows)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandrake.org> 3.03-8mdk ', ++ 1089540000, ++ '- apologies to the girafes (with one only f)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@mandrake.org> 3.03-7mdk ', ++ 1086429600, ++ '- #mandrakefr compliant (aka four new additional cows)', ++ ], ++ [ ++ 'Guillaume Rousse <guillomovitch@linux-mandrake.com> 3.03-6mdk', ++ 1061460000, ++ '- save.the.world patch', ++ ] ++ ], ++ 'changelog' ++ ); ++ is_deeply( ++ $package->get_last_change(), ++ [ ++ 'Guillaume Rousse <guillomovitch@mandriva.org> 3.03-11mdv2007.0', ++ 1149847200, ++ '- %mkrel' . "\n" . ++ '- rpmbuildupdate aware', ++ ], ++ 'last change' ++ ); ++ is($package->compare($package), 0, 'compare'); ++ ++ # signature test ++ system('cp', $file, $temp_dir); ++ $package = $class->new(file => "$temp_dir/$rpm"); ++ ++ $package->sign('Youri', 't/gpghome', 'Youri rulez'); ++ ++ $package = $class->new(file => "$temp_dir/$rpm"); ++ is($package->get_gpg_key(), '2333e817', 'get gpg key'); ++} + + +Property changes on: build_system/mdv-youri-core/trunk/t/package.t +___________________________________________________________________ +Added: svn:executable + + * + +<a id="build_systemmdvyouricoretrunktversiont">Added: build_system/mdv-youri-core/trunk/t/version.t</a> +=================================================================== +--- build_system/mdv-youri-core/trunk/t/version.t (rev 0) ++++ build_system/mdv-youri-core/trunk/t/version.t 2011-01-05 13:23:45 UTC (rev 210) +@@ -0,0 +1,71 @@ ++#!/usr/bin/perl ++# $Id: version.t 1179 2006-08-05 08:30:57Z warly $ ++ ++use Test::More; ++use Youri::Check::Input::Updates; ++use strict; ++ ++my @differents = ( ++ [ '3.0.0', '1.0.0' ], ++ [ '3.0.0', '1.99.9' ], ++ [ '3.0.1', '3.0' ], ++ [ '3.0pl1', '3.0' ], ++ [ '3.0', '3.0beta1' ], ++ [ '3.0', '3.0beta' ], ++ [ '3.0', '3.0alpha1' ], ++ [ '3.0', '3.0alpha' ], ++ [ '3.0', '3.0pre1' ], ++ [ '3.0', '3.0pre' ], ++ [ '3.0pre', '3.0beta' ], ++ [ '3.0beta', '3.0alpha' ], ++ [ '1.0.0-p1', '1.0.0RC1' ], ++ [ '0.9.7f', '0.9.7e' ], ++ [ '10', '9' ], ++); ++ ++my @equals = ( ++ [ '1.0.0', '1.0.0' ], ++ [ '0.9Beta1', '0.9beta1' ], ++ [ '0.9beta1', '0.9 beta 1' ], ++ [ '0.3-alpha', '0.3_alpha' ], ++ [ '0.02', '.02' ], ++ [ '2.0.11', '15aug2000' ], ++ [ '2.0.11', '20060401' ], ++ [ '20', '20060401' ], ++); ++ ++plan tests => 2 * @differents + 2 * @equals; ++ ++foreach my $different (@differents) { ++ ok( ++ Youri::Check::Input::Updates::is_newer( ++ $different->[0], ++ $different->[1] ++ ), ++ "$different->[0] is newer as $different->[1]" ++ ); ++ ok( ++ !Youri::Check::Input::Updates::is_newer( ++ $different->[1], ++ $different->[0] ++ ), ++ "$different->[1] is older as $different->[0]" ++ ); ++} ++ ++foreach my $equal (@equals) { ++ ok( ++ !Youri::Check::Input::Updates::is_newer( ++ $equal->[0], ++ $equal->[1] ++ ), ++ "$equal->[0] is equal as $equal->[1]" ++ ); ++ ok( ++ !Youri::Check::Input::Updates::is_newer( ++ $equal->[1], ++ $equal->[0] ++ ), ++ "$equal->[1] is equal as $equal->[0]" ++ ); ++} + + +Property changes on: build_system/mdv-youri-core/trunk/t/version.t +___________________________________________________________________ +Added: svn:executable + + * + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/80473389/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/80473389/attachment-0001.html new file mode 100644 index 000000000..c23d34397 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/80473389/attachment-0001.html @@ -0,0 +1,103 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[656] - add a module to handle various websites, mainly for storing</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>656</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:09:50 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- add a module to handle various websites, mainly for storing +them. +- add the redirection of donate, asked by rda on sysadm ml</pre> + +<h3>Added Paths</h3> +<ul> +<li>puppet/modules/websites/</li> +<li>puppet/modules/websites/manifests/</li> +<li><a href="#puppetmoduleswebsitesmanifestsinitpp">puppet/modules/websites/manifests/init.pp</a></li> +<li>puppet/modules/websites/templates/</li> +<li><a href="#puppetmoduleswebsitestemplatesvhost_donateconf">puppet/modules/websites/templates/vhost_donate.conf</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmoduleswebsitesmanifestsinitpp">Added: puppet/modules/websites/manifests/init.pp</a> +=================================================================== +--- puppet/modules/websites/manifests/init.pp (rev 0) ++++ puppet/modules/websites/manifests/init.pp 2011-01-05 19:09:50 UTC (rev 656) +@@ -0,0 +1,8 @@ ++class websites { ++ # should expire on June 2011 ++ class donate { ++ apache::vhost_other_app { "donate.$domain": ++ vhost_file => "websites/vhost_donate.conf", ++ } ++ } ++} + +<a id="puppetmoduleswebsitestemplatesvhost_donateconf">Added: puppet/modules/websites/templates/vhost_donate.conf</a> +=================================================================== +--- puppet/modules/websites/templates/vhost_donate.conf (rev 0) ++++ puppet/modules/websites/templates/vhost_donate.conf 2011-01-05 19:09:50 UTC (rev 656) +@@ -0,0 +1,14 @@ ++<VirtualHost *:80> ++ ServerName donate.<%= domain %> ++ ++ RewriteEngine on ++ RewriteRule ^/(.*)$ http://www.<%= domain %>/$1/donate/ [R=permanent,L] ++ #DocumentRoot /dev/null ++ CustomLog /var/log/httpd/donate_log combined ++ ErrorLog /var/log/httpd/error_donate_log ++ ++ <Location /> ++ Allow from all ++ </Location> ++ ++</VirtualHost> + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/80473389/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/80473389/attachment.html new file mode 100644 index 000000000..c23d34397 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/80473389/attachment.html @@ -0,0 +1,103 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[656] - add a module to handle various websites, mainly for storing</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>656</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:09:50 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- add a module to handle various websites, mainly for storing +them. +- add the redirection of donate, asked by rda on sysadm ml</pre> + +<h3>Added Paths</h3> +<ul> +<li>puppet/modules/websites/</li> +<li>puppet/modules/websites/manifests/</li> +<li><a href="#puppetmoduleswebsitesmanifestsinitpp">puppet/modules/websites/manifests/init.pp</a></li> +<li>puppet/modules/websites/templates/</li> +<li><a href="#puppetmoduleswebsitestemplatesvhost_donateconf">puppet/modules/websites/templates/vhost_donate.conf</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmoduleswebsitesmanifestsinitpp">Added: puppet/modules/websites/manifests/init.pp</a> +=================================================================== +--- puppet/modules/websites/manifests/init.pp (rev 0) ++++ puppet/modules/websites/manifests/init.pp 2011-01-05 19:09:50 UTC (rev 656) +@@ -0,0 +1,8 @@ ++class websites { ++ # should expire on June 2011 ++ class donate { ++ apache::vhost_other_app { "donate.$domain": ++ vhost_file => "websites/vhost_donate.conf", ++ } ++ } ++} + +<a id="puppetmoduleswebsitestemplatesvhost_donateconf">Added: puppet/modules/websites/templates/vhost_donate.conf</a> +=================================================================== +--- puppet/modules/websites/templates/vhost_donate.conf (rev 0) ++++ puppet/modules/websites/templates/vhost_donate.conf 2011-01-05 19:09:50 UTC (rev 656) +@@ -0,0 +1,14 @@ ++<VirtualHost *:80> ++ ServerName donate.<%= domain %> ++ ++ RewriteEngine on ++ RewriteRule ^/(.*)$ http://www.<%= domain %>/$1/donate/ [R=permanent,L] ++ #DocumentRoot /dev/null ++ CustomLog /var/log/httpd/donate_log combined ++ ErrorLog /var/log/httpd/error_donate_log ++ ++ <Location /> ++ Allow from all ++ </Location> ++ ++</VirtualHost> + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/a25cf069/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/a25cf069/attachment-0001.html new file mode 100644 index 000000000..c81799314 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/a25cf069/attachment-0001.html @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[657] - update dns to give the new address for donation</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>657</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:09:52 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- update dns to give the new address for donation</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulesbindtemplateszonesmageiaorgzone">puppet/modules/bind/templates/zones/mageia.org.zone</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulesbindtemplateszonesmageiaorgzone">Modified: puppet/modules/bind/templates/zones/mageia.org.zone</a> +=================================================================== +--- puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:50 UTC (rev 656) ++++ puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:52 UTC (rev 657) +@@ -3,7 +3,7 @@ + ; $Id$ + $TTL 3D + @ IN SOA ns0.mageia.org. root.mageia.org. ( +- 2010121501 ; Serial ++ 2010121502 ; Serial + 21600 ; Refresh + 3600 ; Retry + 2419200 ; Expire +@@ -68,8 +68,8 @@ + svn IN CNAME valstar + meetbot IN CNAME krampouezh + +-donate IN CNAME www-aufml +-donation IN CNAME www-aufml ++donate IN CNAME alamut ++donation IN CNAME alamut + + puppetmaster IN CNAME valstar + pkgsubmit IN CNAME valstar + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/a25cf069/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/a25cf069/attachment.html new file mode 100644 index 000000000..c81799314 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/a25cf069/attachment.html @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[657] - update dns to give the new address for donation</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>657</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:09:52 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- update dns to give the new address for donation</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulesbindtemplateszonesmageiaorgzone">puppet/modules/bind/templates/zones/mageia.org.zone</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulesbindtemplateszonesmageiaorgzone">Modified: puppet/modules/bind/templates/zones/mageia.org.zone</a> +=================================================================== +--- puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:50 UTC (rev 656) ++++ puppet/modules/bind/templates/zones/mageia.org.zone 2011-01-05 19:09:52 UTC (rev 657) +@@ -3,7 +3,7 @@ + ; $Id$ + $TTL 3D + @ IN SOA ns0.mageia.org. root.mageia.org. ( +- 2010121501 ; Serial ++ 2010121502 ; Serial + 21600 ; Refresh + 3600 ; Retry + 2419200 ; Expire +@@ -68,8 +68,8 @@ + svn IN CNAME valstar + meetbot IN CNAME krampouezh + +-donate IN CNAME www-aufml +-donation IN CNAME www-aufml ++donate IN CNAME alamut ++donation IN CNAME alamut + + puppetmaster IN CNAME valstar + pkgsubmit IN CNAME valstar + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/b4bcb9b0/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/b4bcb9b0/attachment-0001.html new file mode 100644 index 000000000..a94bd5211 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/b4bcb9b0/attachment-0001.html @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[211] - merge trunk@210</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>211</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 16:09:20 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- merge trunk@210</pre> + +<h3>Property Changed</h3> +<ul> +<li><a href="#identityCatDapbrancheslive">identity/CatDap/branches/live/</a></li> +</ul> + +</div> +<div id="patch"><pre> + +<a id="identityCatDapbrancheslive">Property changes on: identity/CatDap/branches/live</a> +___________________________________________________________________ +<a id="svnmergeinfo">Modified: svn:mergeinfo</a> + - /identity/CatDap/trunk:64,66-68 + + /identity/CatDap/trunk:64,66-68,210 + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/b4bcb9b0/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/b4bcb9b0/attachment.html new file mode 100644 index 000000000..a94bd5211 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/b4bcb9b0/attachment.html @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[211] - merge trunk@210</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>211</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 16:09:20 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- merge trunk@210</pre> + +<h3>Property Changed</h3> +<ul> +<li><a href="#identityCatDapbrancheslive">identity/CatDap/branches/live/</a></li> +</ul> + +</div> +<div id="patch"><pre> + +<a id="identityCatDapbrancheslive">Property changes on: identity/CatDap/branches/live</a> +___________________________________________________________________ +<a id="svnmergeinfo">Modified: svn:mergeinfo</a> + - /identity/CatDap/trunk:64,66-68 + + /identity/CatDap/trunk:64,66-68,210 + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/c743e0e4/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/c743e0e4/attachment-0001.html new file mode 100644 index 000000000..fd49a6933 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/c743e0e4/attachment-0001.html @@ -0,0 +1,77 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[659] add missing rpm</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>659</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:40:18 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add missing rpm</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulescatdapmanifestsinitpp">puppet/modules/catdap/manifests/init.pp</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulescatdapmanifestsinitpp">Modified: puppet/modules/catdap/manifests/init.pp</a> +=================================================================== +--- puppet/modules/catdap/manifests/init.pp 2011-01-05 19:09:53 UTC (rev 658) ++++ puppet/modules/catdap/manifests/init.pp 2011-01-05 19:40:18 UTC (rev 659) +@@ -9,7 +9,7 @@ + "perl-Catalyst-P-S-State-Cookie", "perl-Catalyst-P-S-Store-File", "perl-Catalyst-View-Email", + "perl-Catalyst-View-TT", "perl-Config-General", "perl-Crypt-CBC", "perl-Data-UUID", + "perl-Email-Valid", "perl-Moose", "perl-namespace-autoclean", "perl-Test-Simple", +-"perl-Crypt-Blowfish", "perl-Email-Date-Format", "perl-YAML-LibYAML", ++"perl-Crypt-Blowfish", "perl-Email-Date-Format", "perl-YAML-LibYAML","perl-Catalyst-Plugin-Unicode-Encoding", + ] + + package { $rpm_requirement: + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/c743e0e4/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/c743e0e4/attachment.html new file mode 100644 index 000000000..fd49a6933 --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/c743e0e4/attachment.html @@ -0,0 +1,77 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[659] add missing rpm</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>659</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 20:40:18 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>add missing rpm</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulescatdapmanifestsinitpp">puppet/modules/catdap/manifests/init.pp</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulescatdapmanifestsinitpp">Modified: puppet/modules/catdap/manifests/init.pp</a> +=================================================================== +--- puppet/modules/catdap/manifests/init.pp 2011-01-05 19:09:53 UTC (rev 658) ++++ puppet/modules/catdap/manifests/init.pp 2011-01-05 19:40:18 UTC (rev 659) +@@ -9,7 +9,7 @@ + "perl-Catalyst-P-S-State-Cookie", "perl-Catalyst-P-S-Store-File", "perl-Catalyst-View-Email", + "perl-Catalyst-View-TT", "perl-Config-General", "perl-Crypt-CBC", "perl-Data-UUID", + "perl-Email-Valid", "perl-Moose", "perl-namespace-autoclean", "perl-Test-Simple", +-"perl-Crypt-Blowfish", "perl-Email-Date-Format", "perl-YAML-LibYAML", ++"perl-Crypt-Blowfish", "perl-Email-Date-Format", "perl-YAML-LibYAML","perl-Catalyst-Plugin-Unicode-Encoding", + ] + + package { $rpm_requirement: + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/effa0b80/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/effa0b80/attachment-0001.html new file mode 100644 index 000000000..6152ede1c --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/effa0b80/attachment-0001.html @@ -0,0 +1,63 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[208] version 1.9.2</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>208</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 00:44:41 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>version 1.9.2</pre> + +<h3>Added Paths</h3> +<ul> +<li>build_system/repsys/tags/1.9.2/</li> +</ul> + +</div> +<div id="patch"><pre> +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/effa0b80/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/effa0b80/attachment.html new file mode 100644 index 000000000..6152ede1c --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/effa0b80/attachment.html @@ -0,0 +1,63 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[208] version 1.9.2</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>208</dd> +<dt>Author</dt> <dd>boklm</dd> +<dt>Date</dt> <dd>2011-01-05 00:44:41 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>version 1.9.2</pre> + +<h3>Added Paths</h3> +<ul> +<li>build_system/repsys/tags/1.9.2/</li> +</ul> + +</div> +<div id="patch"><pre> +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/feb9fe4b/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110105/feb9fe4b/attachment-0001.html new file mode 100644 index 000000000..432eefa6e --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/feb9fe4b/attachment-0001.html @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[653] - do not try to do ssl when we cannot, this confuse epoll</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>653</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 01:59:39 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- do not try to do ssl when we cannot, this confuse epoll</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulespostfixtemplatesmaincf">puppet/modules/postfix/templates/main.cf</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulespostfixtemplatesmaincf">Modified: puppet/modules/postfix/templates/main.cf</a> +=================================================================== +--- puppet/modules/postfix/templates/main.cf 2011-01-03 18:00:40 UTC (rev 652) ++++ puppet/modules/postfix/templates/main.cf 2011-01-05 00:59:39 UTC (rev 653) +@@ -62,10 +62,12 @@ + unknown_local_recipient_reject_code = 450 + smtp-filter_destination_concurrency_limit = 2 + lmtp-filter_destination_concurrency_limit = 2 +-smtpd_use_tls = yes +-smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem +-smtpd_tls_key_file = /etc/pki/tls/private/postfix.pem +-smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt ++# disabled for the time being, as the certificate do not exist ++# FIXME create the cert in puppet ++smtpd_use_tls = no ++#smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem ++#smtpd_tls_key_file = /etc/pki/tls/private/postfix.pem ++#smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt + + <%- if all_tags.include?('postfix::smtp_server') -%> + smtpd_etrn_restrictions = reject + +</pre></div> + +</body> +</html>
\ No newline at end of file diff --git a/zarb-ml/mageia-sysadm/attachments/20110105/feb9fe4b/attachment.html b/zarb-ml/mageia-sysadm/attachments/20110105/feb9fe4b/attachment.html new file mode 100644 index 000000000..432eefa6e --- /dev/null +++ b/zarb-ml/mageia-sysadm/attachments/20110105/feb9fe4b/attachment.html @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" +"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>[653] - do not try to do ssl when we cannot, this confuse epoll</title> +</head> +<body> + +<style type="text/css"><!-- +#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } +#msg dl.meta dt { float: left; width: 6em; font-weight: bold; } +#msg dt:after { content:':';} +#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } +#msg dl a { font-weight: bold} +#msg dl a:link { color:#fc3; } +#msg dl a:active { color:#ff0; } +#msg dl a:visited { color:#cc6; } +h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } +#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; } +#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; } +#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; } +#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; } +#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; } +#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; } +#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; } +#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; } +#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; } +#logmsg pre { background: #eee; padding: 1em; } +#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;} +#logmsg dl { margin: 0; } +#logmsg dt { font-weight: bold; } +#logmsg dd { margin: 0; padding: 0 0 0.5em 0; } +#logmsg dd:before { content:'\00bb';} +#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; } +#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; } +#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; } +#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; } +#logmsg table th.Corner { text-align: left; } +#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; } +#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } +#patch { width: 100%; } +--></style> +<div id="msg"> +<dl class="meta"> +<dt>Revision</dt> <dd>653</dd> +<dt>Author</dt> <dd>misc</dd> +<dt>Date</dt> <dd>2011-01-05 01:59:39 +0100 (Wed, 05 Jan 2011)</dd> +</dl> + +<h3>Log Message</h3> +<pre>- do not try to do ssl when we cannot, this confuse epoll</pre> + +<h3>Modified Paths</h3> +<ul> +<li><a href="#puppetmodulespostfixtemplatesmaincf">puppet/modules/postfix/templates/main.cf</a></li> +</ul> + +</div> +<div id="patch"><pre> +<a id="puppetmodulespostfixtemplatesmaincf">Modified: puppet/modules/postfix/templates/main.cf</a> +=================================================================== +--- puppet/modules/postfix/templates/main.cf 2011-01-03 18:00:40 UTC (rev 652) ++++ puppet/modules/postfix/templates/main.cf 2011-01-05 00:59:39 UTC (rev 653) +@@ -62,10 +62,12 @@ + unknown_local_recipient_reject_code = 450 + smtp-filter_destination_concurrency_limit = 2 + lmtp-filter_destination_concurrency_limit = 2 +-smtpd_use_tls = yes +-smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem +-smtpd_tls_key_file = /etc/pki/tls/private/postfix.pem +-smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt ++# disabled for the time being, as the certificate do not exist ++# FIXME create the cert in puppet ++smtpd_use_tls = no ++#smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem ++#smtpd_tls_key_file = /etc/pki/tls/private/postfix.pem ++#smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt + + <%- if all_tags.include?('postfix::smtp_server') -%> + smtpd_etrn_restrictions = reject + +</pre></div> + +</body> +</html>
\ No newline at end of file |