source: trunk/base/src/port/portindex.tcl @ 66868

Last change on this file since 66868 was 66868, checked in by jmr@…, 8 years ago

portindex: add -p option to generate an index for use on a different platform

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.3 KB
Line 
1#!/bin/sh
2# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
3# Run the Tcl interpreter \
4exec @TCLSH@ "$0" "$@"
5
6# Traverse through all ports, creating an index and archiving port directories
7# if requested
8# $Id: portindex.tcl 66868 2010-04-24 14:33:14Z jmr@macports.org $
9
10catch {source \
11    [file join "@macports_tcl_dir@" macports1.0 macports_fastload.tcl]}
12package require macports
13package require Pextlib
14
15# Globals
16set archive 0
17set full_reindex 0
18set stats(total) 0
19set stats(failed) 0
20set stats(skipped) 0
21array set ui_options        [list]
22array set global_options    [list]
23array set global_variations [list]
24set port_options            [list]
25
26# Pass global options into mportinit
27mportinit ui_options global_options global_variations
28
29# Standard procedures
30proc print_usage args {
31    global argv0
32    puts "Usage: $argv0 \[-adf\] \[-p plat_ver_arch\] \[-o output directory\] \[directory\]"
33    puts "-a:\tArchive port directories (for remote sites). Requires -o option"
34    puts "-o:\tOutput all files to specified directory"
35    puts "-d:\tOutput debugging information"
36    puts "-f:\tDo a full re-index instead of updating"
37    puts "-p:\tPretend to be on another platform"
38}
39
40proc pindex {portdir} {
41    global target oldfd oldmtime qindex fd directory archive outdir stats full_reindex
42    global macports::prefix ui_options port_options
43    set save_prefix $prefix
44    set prefix {\${prefix}}
45
46    # try to reuse the existing entry if it's still valid
47    if {$full_reindex != "1" && $archive != "1" && [info exists qindex([string tolower [file tail $portdir]])]} {
48        try {
49            set mtime [file mtime [file join $directory $portdir Portfile]]
50            if {$oldmtime > $mtime} {
51                set offset $qindex([string tolower [file tail $portdir]])
52                seek $oldfd $offset
53                gets $oldfd line
54                set name [lindex $line 0]
55                set len [lindex $line 1]
56                set line [read $oldfd $len]
57
58                if {[info exists ui_options(ports_debug)]} {
59                    puts "Reusing existing entry for $portdir"
60                }
61
62                puts $fd [list $name $len]
63                puts -nonewline $fd $line
64
65                incr stats(skipped)
66                return
67            }
68        } catch {*} {
69            ui_warn "failed to open old entry for ${portdir}, making a new one"
70        }
71    }
72
73    if {[catch {set interp [mportopen file://[file join $directory $portdir] $port_options]} result]} {
74        puts stderr "Failed to parse file $portdir/Portfile: $result"
75        # revert the prefix.
76        set prefix $save_prefix
77        incr stats(failed)
78    } else {
79        # revert the prefix.
80        set prefix $save_prefix
81        array set portinfo [mportinfo $interp]
82        mportclose $interp
83        set portinfo(portdir) $portdir
84        puts "Adding port $portdir"
85        if {$archive == "1"} {
86            if {![file isdirectory [file join $outdir [file dirname $portdir]]]} {
87                if {[catch {file mkdir [file join $outdir [file dirname $portdir]]} result]} {
88                    puts stderr "$result"
89                    exit 1
90                }
91            }
92            set portinfo(portarchive) [file join [file dirname $portdir] [file tail $portdir]].tgz
93            cd [file join $directory [file dirname $portinfo(portdir)]]
94            puts "Archiving port $portinfo(name) to [file join $outdir $portinfo(portarchive)]"
95            set tar [macports::findBinary tar $macports::autoconf::tar_path]
96            set gzip [macports::findBinary gzip $macports::autoconf::gzip_path]
97            if {[catch {exec $tar -cf - [file tail $portdir] | $gzip -c >[file join $outdir $portinfo(portarchive)]} result]} {
98                puts stderr "Failed to create port archive $portinfo(portarchive): $result"
99                exit 1
100            }
101        }
102
103        set keepkeys {categories depends_fetch depends_extract depends_build depends_lib depends_run description epoch homepage long_description maintainers name platforms revision variants version portdir portarchive replaced_by license}
104        foreach availkey [array names portinfo] {
105            if {[lsearch -exact ${keepkeys} $availkey] == -1} {
106                unset portinfo($availkey)
107            }
108        }
109        set output [array get portinfo]
110        set len [expr [string length $output] + 1]
111        puts $fd [list $portinfo(name) $len]
112        puts $fd $output
113        incr stats(total)
114    }
115}
116
117if {[expr $argc > 4]} {
118    print_usage
119    exit 1
120}
121
122for {set i 0} {$i < $argc} {incr i} {
123    set arg [lindex $argv $i]
124    switch -regex -- $arg {
125        {^-.+} {
126            if {$arg == "-a"} { # Turn on archiving
127                set archive 1
128            } elseif {$arg == "-d"} { # Turn on debug output
129                set ui_options(ports_debug) yes
130            } elseif {$arg == "-o"} { # Set output directory
131                incr i
132                set outdir [lindex $argv $i]
133            } elseif {$arg == "-p"} { # Set platform
134                incr i
135                set platlist [split [lindex $argv $i] _]
136                set os_platform [lindex $platlist 0]
137                set os_major [lindex $platlist 1]
138                set os_arch [lindex $platlist 2]
139                lappend port_options os.platform $os_platform os.major $os_major os.arch $os_arch
140            } elseif {$arg == "-f"} { # Completely rebuild index
141                set full_reindex yes
142            } else {
143                puts stderr "Unknown option: $arg"
144                print_usage
145                exit 1
146            }
147        }
148        default {
149            set directory $arg
150        }
151    }
152}
153
154if {$archive == 1 && ![info exists outdir]} {
155    puts stderr "You must specify an output directory with -o when using the -a option"
156    print_usage
157    exit 1
158}
159
160if {![info exists directory]} {
161    set directory .
162}
163
164# cd to input directory
165if {[catch {cd $directory} result]} {
166    puts stderr "$result"
167    exit 1
168} else {
169    set directory [pwd]
170}
171
172# Set output directory to full path
173if {[info exists outdir]} {
174    if {[catch {file mkdir $outdir} result]} {
175        puts stderr "$result"
176        exit 1
177    }
178    if {[catch {cd $outdir} result]} {
179        puts stderr "$result"
180        exit 1
181    } else {
182        set outdir [pwd]
183    }
184} else {
185    set outdir $directory
186}
187
188puts "Creating port index in $outdir"
189set outpath [file join $outdir PortIndex]
190# open old index for comparison
191if {[file isfile $outpath] && [file isfile ${outpath}.quick]} {
192    set oldmtime [file mtime $outpath]
193    if {![catch {set oldfd [open $outpath r]}] && ![catch {set quickfd [open ${outpath}.quick r]}]} {
194        if {![catch {set quicklist [read $quickfd]}]} {
195            foreach entry [split $quicklist "\n"] {
196                set qindex([lindex $entry 0]) [lindex $entry 1]
197            }
198        }
199        close $quickfd
200    }
201}
202
203set tempportindex [mktemp "/tmp/mports.portindex.XXXXXXXX"]
204set fd [open $tempportindex w]
205mporttraverse pindex $directory
206if {[info exists oldfd]} {
207    close $oldfd
208}
209close $fd
210file rename -force $tempportindex $outpath
211mports_generate_quickindex $outpath
212puts "\nTotal number of ports parsed:\t$stats(total)\
213      \nPorts successfully parsed:\t[expr $stats(total) - $stats(failed)]\
214      \nPorts failed:\t\t\t$stats(failed)\
215      \nUp-to-date ports skipped:\t$stats(skipped)\n"
Note: See TracBrowser for help on using the repository browser.