Source code of /package/_check_debian_rules/rules-check

Last modified: 2015-05-06 23:08:07

Download

#!/usr/bin/php
<?php

error_reporting
(E_ALL E_NOTICE E_STRICT E_DEPRECATED);

require_once 
__DIR__ '/../share/includes/common_functions.inc.php';

# TODO: rules-check should usually only check BEFORE packaging, but lintian checks the state AFTER packaging...

# TODO: usr/ ist nicht in package/ ... wird das also behandelt?

# ---

// This is like __DIR__, but does not resolve symlinks
// (useful for sharing StatMon source codes locally by symlinking)
define('DIR'dirname($_SERVER['SCRIPT_FILENAME']));

require 
DIR '/config.inc.php';

# ---

$rules_file SOURCE_PATH '/package/debian/rules';

$rules file_get_contents($rules_file);
$rules preg_replace('^\s*#(.*)$mU'''$rules); // remove comments

# ---

echo "* Check lintian output of PREVIOUS build\n";

$loc_good true;
$gl glob(SOURCE_PATH '/_out/*.deb');

if (
count($gl) == 0) {
    
$loc_good false;
    echo 
"No DEB files found!\n";
}

foreach (
$gl as $g) {
    echo 
"Check $g ...\n";

    
$err = -1;
    
$out = array();

    
$cmd "lintian -I -E --pedantic --fail-on-warnings -- ".escapeshellarg($g);
    echo 
"$cmd\n";
    
exec($cmd$out$err);
    if (
$err != 0$loc_good false;

    echo 
implode("\n"$out)."\n";
}

if (
$loc_good) {
    echo 
"[OK] lintian did not find problems\n";
} else {
    echo 
"[!!] Please review the errors/warnings above.\n";
}

# ---

echo "* Check if some files are symbolic links (dpkg-buildpackage does not dereference them)\n";

$loc_good true;
foreach (
$virtual_directories as $xa => &$xb) {
    
$files getAllFiles(SOURCE_PATH '/package/'.$xa.'/'truetrue);

    foreach (
$files as &$file) {
        if (
strpos($file'/.') !== false) continue;
        if (
is_link($file)) {
            echo 
"[!!] Is symlink: $file\n";
            
$loc_good false;
        }
    }
}

if (
$loc_good) {
    echo 
"[ OK ]\n";
}

# ---

echo "* Check if all files in the virtual directories are listed in $rules_file\n";

$loc_good true;
foreach (
$virtual_directories as $xa => &$xb) {
    
$files getAllFiles(SOURCE_PATH '/package/'.$xa.'/'truetrue);

    foreach (
$files as &$file) {
        if (
is_dir($file)) $file .= '/';
        
$xfile substr($filestrlen(SOURCE_PATH '/package/'.$xa.'/'));
        
$source $xa.'/'.$xfile;
        if (
strpos('/'.$source'/.') !== false) continue; # exclude hidden files or dirs which begin with a '.'
        
if (!is_dir($file)) {
            
$m pathinfo($source); $m $m['dirname'];
            
$m substr($mstrlen($xa.'/'));
        } else 
$m '';
        
$t_dir $xb.($m == '' '' '/'.$m);
        
$target 'debian/gwhois'.$t_dir;

        if ((
$t_dir != '') && is_dir($t_dir)) $target .= '/';

        if (
is_dir($file)) {
            if (
$xfile != ''$target .= "$xfile";
            if (
substr($target, -1) == '/'$target substr($target0strlen($target)-1);

            
# TODO: chmod
            # $chmod = substr(sprintf('%o', fileperms($file)), -4);
            
$await_line "install -d $target";

            
$is_ignored false;
            foreach (
$ignore_install_dirs as &$ign) {
                if ((
strpos($target"$ign/") !== false) || preg_match(''.preg_quote($ign'').'$'$target)) {
                    
$is_ignored true;
                    break;
                }
            }
            if (
$is_ignored) continue;

            
# no \n since "install -d" enforces also subdirectories
            # if (strpos($rules, "$await_line\n") === false) {
            
if ((strpos($rules"$await_line\n") === false) &&
                (
strpos($rules"$await_line/") === false)) {
                echo 
"[!!] Missing line:\n";
                echo 
"     $await_line\n";
                
$loc_good false;
            }
        } else {
            if (
$xa == 'man') {
                
$await_line "dh_installman $source";

                if (
strpos($rules"$await_line\n") === false) {
                    echo 
"[!!] Missing line:\n";
                    echo 
"     $await_line\n";
                    
$loc_good false;
                }
            } else {
                
$chmod substr(sprintf('%o'fileperms($file)), -4);
                
$await_line "install -oroot -gstaff -m$chmod $source $target";

                
# if (strpos($rules, "$await_line\n") === false) {
                
if ((strpos($rules"$await_line\n") === false) &&
                    (
strpos($rules"$await_line/") === false)) {
                    echo 
"[!!] Missing line:\n";
                    echo 
"     $await_line\n";
                    
$loc_good false;
                }
            }
        }
    }
}

if (
$loc_good) {
    echo 
"[ OK ]\n";
}

# ---

echo "* Check if all cache directories are listed in $rules_file\n";

$loc_good true;
foreach (
$tmp_dirs as &$x) {
    
$dirs getAllFiles(SOURCE_PATH $xtruetruefalse);

    foreach (
$dirs as &$dir) {
        
$target preg_replace('^'.preg_quote(SOURCE_PATH'').'''debian/gwhois'$dir);

        
$await_line "install -d $target";

        
$is_ignored false;
        foreach (
$ignore_install_dirs as &$ign) {
            if ((
strpos($target"$ign/") !== false) || preg_match(''.preg_quote($ign'').'$'$target)) {
                
$is_ignored true;
                break;
            }
        }
        if (
$is_ignored) continue;

        
# no \n since "install -d" enforces also subdirectories
        # if (strpos($rules, "$await_line\n") === false) {
        
if ((strpos($rules"$await_line\n") === false) &&
            (
strpos($rules"$await_line/") === false)) {
            echo 
"[!!] Missing line:\n";
            echo 
"     $await_line\n";
            
$loc_good false;
        }
    }
}

if (
$loc_good) {
    echo 
"[ OK ]\n";
}

# ---

echo "* Check if there are non-existing files in $rules_file\n";

$loc_good true;
preg_match_all('install -oroot -gstaff -m.... (.*) ismU'$rules$m);
foreach (
$m[1] as &$x) {
    foreach (
$virtual_directories as $xa => &$xb) {
        
$x preg_replace('^'.preg_quote($xa'').'isU'$xb$x);
    }
    if (
$x[0] != '/') {
        
$bbx explode('/'$x);
        
$virtual_directoriesdir $bbx[0];
        echo 
"[!!] WARNING: Unknown virtual directory $virtual_directoriesdir in package!\n";
        
$loc_good false;
    }

    
$f SOURCE_PATH.$x;

    if (!
file_exists($f)) {
        echo 
"[!!] Missing file $f\n";
        
$loc_good false;
    }
}

if (
$loc_good) {
    echo 
"[ OK ]\n";
}

# ---

echo "* Check if there are non-existing files in $rules_file\n";

$loc_good true;
preg_match_all('install -d debian/gwhois(/.*)$ismU'$rules$m);
foreach (
$m[1] as &$x) {
    if (!
is_dir($x)) {
        echo 
"[!!] Missing directory $x\n";
        
$loc_good false;
    }
}

if (
$loc_good) {
    echo 
"[ OK ]\n";
}

#---

echo "* Check if there are non-existing manuals in $rules_file\n";

$loc_good true;
preg_match_all('dh_installman (.*)$mU'$rules$m);
foreach (
$m[1] as &$x) {
    
# TODO: lieber von SOURCE_PATH abhaengig machen
    
$f "/usr/share/$x";

    if (!
file_exists($f)) {
        echo 
"[!!] Missing manual $f\n";
        
$loc_good false;
    }
}

if (
$loc_good) {
    echo 
"[ OK ]\n";
}

#---

# TODO: prüfen, dass keine dateien doppelt (z.b. mit unterschiedlichen chmod) in rules sind
# TODO: debian/dirs, debian/docs, ... pruefen