Projects
New Ticket     Wiki     Browse Source     Timeline     Roadmap     Bug Reports     Search

Ticket #12211: macports-portlint.patch

File macports-portlint.patch, 8.9 KB (added by afb@…, 17 months ago)

macports-portlint.patch

  • src/port/port.tcl

     
    22062206        install         action_target 
    22072207        clean           action_target 
    22082208        test            action_target 
     2209        lint            action_target 
    22092210        submit          action_target 
    22102211        trace           action_target 
    22112212        livecheck       action_target 
  • src/port/port.1

     
    467467.Ss test 
    468468Tests 
    469469.Ar portname . 
     470.Ss lint 
     471Verifies Portfile for 
     472.Ar portname . 
    470473.Ss archive 
    471474Archive the port for a later 
    472475.Ar unarchive . 
  • src/port1.0/Makefile

     
    22 
    33SRCS=   port.tcl portchecksum.tcl portconfigure.tcl portextract.tcl         \ 
    44        portfetch.tcl portmain.tcl portbuild.tcl portpatch.tcl portutil.tcl \ 
    5         portinstall.tcl portdepends.tcl portdestroot.tcl \ 
     5        portinstall.tcl portdepends.tcl portdestroot.tcl portlint.tcl \ 
    66        portclean.tcl porttest.tcl portactivate.tcl portsubmit.tcl \ 
    77        port_autoconf.tcl portstartupitem.tcl porttrace.tcl portlivecheck.tcl \ 
    88        portdistcheck.tcl portmirror.tcl 
  • src/port1.0/portlint.tcl

     
     1# et:ts=4 
     2# portlint.tcl 
     3# $Id: portlint.tcl $ 
     4 
     5package provide portlint 1.0 
     6package require portutil 1.0 
     7 
     8set org.macports.lint [target_new org.macports.lint lint_main] 
     9target_runtype ${org.macports.lint} always 
     10target_provides ${org.macports.lint} lint 
     11target_requires ${org.macports.lint} main 
     12target_prerun ${org.macports.lint} lint_start 
     13 
     14set_ui_prefix 
     15 
     16set lint_required [list \ 
     17        "name" \ 
     18        "version" \ 
     19        "description" \ 
     20        "long_description" \ 
     21        "categories" \ 
     22        "maintainers" \ 
     23        "platforms" \ 
     24        "homepage" \ 
     25        "master_sites" \ 
     26        "checksums" \ 
     27        ] 
     28 
     29set lint_optional [list \ 
     30        "epoch" \ 
     31        "revision" \ 
     32        "worksrcdir" \ 
     33        "distname" \ 
     34        "use_automake" \ 
     35        "use_autoconf" \ 
     36        "use_configure" \ 
     37        ] 
     38 
     39 
     40proc seems_utf8 {str} { 
     41    set len [string length $str] 
     42    for {set i 0} {$i<$len} {incr i} { 
     43        set c [scan [string index $str $i] %c] 
     44        if {$c < 0x80} { 
     45            # ASCII 
     46            continue 
     47        } elseif {($c & 0xE0) == 0xC0} { 
     48            set n 1 
     49        } elseif {($c & 0xF0) == 0xE0} { 
     50            set n 2 
     51        } elseif {($c & 0xF8) == 0xF0} { 
     52            set n 3 
     53        } elseif {($c & 0xFC) == 0xF8} { 
     54            set n 4 
     55        } elseif {($c & 0xFE) == 0xFC} { 
     56            set n 5 
     57        } else { 
     58            return false 
     59        } 
     60        for {set j 0} {$j<$n} {incr j} { 
     61            incr i 
     62            if {$i == $len} { 
     63                return false 
     64            } elseif {([scan [string index $str $i] %c] & 0xC0) != 0x80} { 
     65                return false 
     66            } 
     67        } 
     68    } 
     69    return true 
     70} 
     71 
     72 
     73proc lint_start {args} { 
     74    global UI_PREFIX portname 
     75    ui_msg "$UI_PREFIX [format [msgcat::mc "Verifying Portfile for %s"] ${portname}]" 
     76} 
     77 
     78proc lint_main {args} { 
     79        global UI_PREFIX portname portpath 
     80        set portfile ${portpath}/Portfile 
     81 
     82        set warnings 0 
     83        set errors 0 
     84 
     85    ################################################################### 
     86    ui_debug "$portfile" 
     87 
     88    set require_blank false 
     89    set require_after "" 
     90    set seen_portsystem false 
     91    set seen_portgroup false 
     92    set in_description false 
     93 
     94    set f [open $portfile RDONLY] 
     95    # read binary (to check UTF-8) 
     96    fconfigure $f -encoding binary 
     97    set lineno 1 
     98    while {1} { 
     99        set line [gets $f] 
     100        if {[eof $f]} { 
     101            close $f 
     102            break 
     103        } 
     104        ui_debug "$lineno: $line" 
     105 
     106        if {![seems_utf8 $line]} { 
     107            ui_error "Line $lineno seems to contain an invalid UTF-8 sequence" 
     108            incr errors 
     109        } 
     110 
     111        if {[string equal "PortSystem" $require_after] && \ 
     112            [string match "PortGroup*" $line]} { 
     113            set require_blank false 
     114        } 
     115 
     116        if {$require_blank && ($line != "")} { 
     117            ui_warn "Line $lineno should be a newline (after $require_after)" 
     118            incr warnings 
     119        } 
     120        set require_blank false 
     121 
     122        if {[string match "* " $line] || [string match "*\t" $line]} { 
     123            ui_warn "Line $lineno has trailing whitespace before newline" 
     124            incr warnings 
     125        } 
     126 
     127        if {($lineno == 1) && ![string match "*\$Id*" $line]} { 
     128            ui_warn "Line 1 is missing RCS tag (\$Id)" 
     129            incr warnings 
     130        } elseif {($lineno == 1)} { 
     131            ui_info "OK: Line 1 has RCS tag (\$Id)" 
     132            set require_blank true 
     133            set require_after "RCS tag" 
     134        } 
     135 
     136        if {[string match "PortSystem*" $line]} { 
     137            if ($seen_portsystem) { 
     138                 ui_error "Line $lineno repeats PortSystem information" 
     139                 incr errors 
     140            } 
     141            ### TODO: check version 
     142            set seen_portsystem true 
     143            set require_blank true 
     144            set require_after "PortSystem" 
     145        } 
     146        if {[string match "PortGroup*" $line]} { 
     147            if ($seen_portgroup) { 
     148                 ui_error "Line $lineno repeats PortGroup information" 
     149                 incr errors 
     150            } 
     151            ### TODO: check group 
     152            set seen_portgroup true 
     153            set require_blank true 
     154            set require_after "PortGroup" 
     155        } 
     156 
     157        # TODO: check tabs and whitespace for variables 
     158        # TODO: check for repeated variable definitions 
     159        # TODO: check the definition order of variables 
     160        # TODO: check length of description against max 
     161 
     162        if {[string match "long_description*" $line]} { 
     163            set in_description true 
     164        } 
     165        if {$in_description && ([string range $line end end] != "\\")} { 
     166            set in_description false 
     167            set require_blank true 
     168            set require_after "long_description" 
     169        } elseif {$in_description} { 
     170            set require_blank false 
     171        } 
     172 
     173        ### TODO: more checks to Portfile syntax 
     174 
     175        incr lineno 
     176    } 
     177 
     178    ################################################################### 
     179 
     180    global os.platform os.arch os.version 
     181    global portversion portrevision portepoch 
     182    # hoping for "noarch" : 
     183    set portarch ${os.arch} 
     184    global description long_description categories maintainers platforms homepage master_sites checksums 
     185     
     186    global lint_required lint_optional 
     187 
     188    if (!$seen_portsystem) { 
     189        ui_error "Didn't find PortSystem specification" 
     190        incr errors 
     191    }  else { 
     192        ui_info "OK: Found PortSystem specification" 
     193    } 
     194    if ($seen_portgroup) { 
     195        ui_info "OK: Found PortGroup specification" 
     196    } 
     197 
     198    foreach req_var $lint_required { 
     199        if {$req_var == "name"} { 
     200            set var "portname" 
     201        } elseif {$req_var == "version"} { 
     202            set var "portversion" 
     203        } else { 
     204            set var $req_var 
     205        } 
     206       if {![info exists $var]} { 
     207            ui_error "Missing required variable: $req_var" 
     208            incr errors 
     209        } else { 
     210            ui_info "OK: Found required variable: $req_var" 
     211        } 
     212    } 
     213 
     214    # TODO: check platforms against known names 
     215    # TODO: check categories against known ones 
     216 
     217    foreach opt_var $lint_optional { 
     218       if {$opt_var == "epoch"} { 
     219            set var "portepoch" 
     220        } elseif {$opt_var == "revision"} { 
     221            set var "portrevision" 
     222        } else { 
     223            set var $opt_var 
     224       } 
     225       if {[info exists $var]} { 
     226            # TODO: check whether it was seen (or default) 
     227            ui_info "OK: Found optional variable: $opt_var" 
     228       } 
     229    } 
     230 
     231    # TODO: check that ports revision is numeric 
     232    # TODO: check that any port epoch is numeric 
     233 
     234    if {[string match "*darwinports@opendarwin.org*" $maintainers]} { 
     235        ui_warn "Using legacy email for no/open maintainer" 
     236        incr warnings 
     237    } 
     238 
     239    ### TODO: more checks to Tcl variables/sections 
     240 
     241    ui_debug "Name: $portname" 
     242    ui_debug "Epoch: $portepoch" 
     243    ui_debug "Version: $portversion" 
     244    ui_debug "Revision: $portrevision" 
     245    ui_debug "Arch: $portarch" 
     246    ################################################################### 
     247 
     248        ui_msg "$UI_PREFIX [format [msgcat::mc "%d errors and %d warnings found."] $errors $warnings]" 
     249 
     250        return {$errors > 0} 
     251} 
  • src/port1.0/port.tcl

     
    4646package require portactivate 1.0 
    4747package require portclean 1.0 
    4848package require porttest 1.0 
     49package require portlint 1.0 
    4950package require portsubmit 1.0 
    5051package require porttrace 1.0 
    5152package require portdistcheck 1.0