source: branches/gsoc11-statistics/base/portmgr/autosubmit.tcl @ 105085

Last change on this file since 105085 was 59836, checked in by jmr@…, 11 years ago

new mportlistall proc, various slight efficiency improvements

  • Property svn:executable set to *
File size: 3.7 KB
Line 
1#!/usr/bin/env tclsh
2
3package require macports
4package require sqlite3
5
6proc open_db { db_file } {
7        # Open/create our database
8        sqlite3 db $db_file
9        db timeout 10000
10        if { [llength [db eval {pragma table_info('SubmitInfo')}]] == 0 } {
11                db eval {
12                        create table SubmitInfo (
13                                porturl text unique,
14                                portname text,
15                                last_mod_date datetime,
16                                submitted_mod_date datetime,
17                                submit_date datetime
18                        )
19                }
20        }
21}
22
23
24proc close_db {} {
25        db close
26}
27
28
29proc sql_date { datetime } {
30        return [clock format $datetime -format "%Y-%m-%d %H:%M:%S"]
31}
32
33
34proc submit_ports {} {
35        global prefix submit_options verbose
36
37        if {[catch {set res [mportlistall]} result]} {
38                puts "port search failed: $result"
39                exit 1
40        }
41       
42        foreach {name array} $res {
43                array unset portinfo
44                array set portinfo $array
45       
46                if {![info exists portinfo(porturl)]} {
47                        puts stderr "Internal error: no porturl for $name"
48                        continue
49                }
50               
51                set porturl $portinfo(porturl)
52                if { 0 != [regexp {file://(.*)} $porturl match path] } {
53                        set portdir [file normalize $path]
54                } else {
55                        set portdir [file normalize [macports::getportdir $porturl]]
56                }
57                set portfile "${portdir}/Portfile"
58                if { $verbose } { puts "checking ${name}" }
59       
60                if {[file readable $portfile]} {
61                        set mod_date [sql_date [file mtime $portfile]]
62                        set cur_date [sql_date [clock seconds]]
63                       
64                        set post ""
65                        set none 1
66                        db eval { select * from submitinfo where porturl=$porturl } values {
67                                set none 0
68                               
69                                if { $values(last_mod_date) == "" || $values(last_mod_date) != $mod_date } {
70                               
71                                        # The last_mod_date has changed, so just update it to provide
72                                        # hysteresis for file changes
73                                        if { $verbose } { puts "    update ${name} mod date to $mod_date" }
74                                        set post { update submitinfo set last_mod_date=$mod_date where porturl=$porturl }                               
75                               
76                                } elseif { $values(submitted_mod_date) != $mod_date } {
77                               
78                                        # last_mod_date is correct and stable, but has not yet been submitted
79                                        # so let's submit it
80       
81                                        # Open the port
82                                        set err 0
83                                        if {[catch {set workername [mportopen $porturl [array get submit_options]]} result]} {
84                                                global errorInfo
85                                                ui_debug "$errorInfo"
86                                                puts "Unable to open port: $result"
87                                                set err 1
88                                        }
89       
90                                        # Submit the port
91                                        if { !$err && [catch {set result [mportexec $workername submit]} result]} {
92                                                global errorInfo
93                                                ui_debug "$errorInfo"
94                                                puts "Unable to execute port: $result"
95                                                set err 1
96                                        }
97                       
98                                        # Close the port
99                                        mportclose $workername
100                                       
101                                        # Update the date in the database for this item
102                                        if { !$err && !$result } {
103                                                set post { update submitinfo set submitted_mod_date=$mod_date, submit_date=$cur_date where porturl=$porturl }
104                                        }
105                                } else {
106                               
107                                        # The port has already been submitted
108                                        if { $verbose } { puts "   submission up to date as of $values(submit_date)" }
109                                }
110                               
111                        }
112                       
113                        if { $none } {
114                                # No record yet, so just create a record for this port
115                                # Do nothing else yet to provide hysteresis for file changes
116                                if { $verbose } { puts "    set ${name} mod date to $mod_date" }
117                                set post { insert into submitinfo (porturl,portname,last_mod_date) values ($porturl, $name, $mod_date) }                               
118                        }
119                       
120                        # Do update or insert post processing
121                        if { $post != "" } {
122                                db eval $post
123                        }
124                }
125               
126        }
127}
128
129
130# Globals
131set SUBMITTER_NAME "autosubmit"
132set SUBMITTER_EMAIL "autosubmit@macports.org"
133array set submit_options "submitter_name $SUBMITTER_NAME submitter_email $SUBMITTER_EMAIL"
134
135# Do argument processing
136set verbose 0
137if { [lsearch $argv -v] >= 0 } {
138        set verbose 1
139}
140
141# Initialize mports api
142mportinit
143
144# Submit ports
145set db_file [file normalize "${macports::macports_user_dir}/autosubmit.db"]
146if { $verbose } { puts "Using database at $db_file" }
147open_db $db_file
148submit_ports
149close_db
Note: See TracBrowser for help on using the repository browser.