What happened to this site? And what's that frog about?

Version ID

From the old Equi4 Software site wiki 

Version IDs are produced by the SDX "version" command. They are designed to make it easy to identify the version of a particular starkit. An example: $ sdx version critcl.kit 2003/02/08 14:34:36 29946-43727 critcl.kit $

The first two values reported are the modification date and time of the most recent file found inside the starkit.

The third value is based on the 32-bit CRC of all names, dates, and sizes found inside the starkit.

The Tcl code on which the version ID calculation is based, is:

  proc traverse {args} {
    set sig 0
    set mod 0
    while {[llength $args] > 0} {
      set d [lindex $args 0]
      set args [lrange $args 1 end]
      foreach path [lsort [glob -nocomplain [file join $d *]]] {
        set t [file tail $path]
        switch -- $t CVS - RCS - core - a.out continue
        lappend sig $t
        if {[file isdir $path]} {
          lappend args $path
        } else {
          set m [file mtime $path]
          if {$m > $mod} { set mod $m }
          lappend sig $m [file size $path]
        }
      }
    }
    list [vfs::crc [join $sig " "]] $mod
  }

For purposes of readability, the resulting 32-bit value is formatted as 5 digits, dash, 5 digits:

  proc version_id {dir {name ""}} {
    lassign [traverse $dir] sig mod
    set time [clock format $mod -format {%Y/%m/%d %H:%M:%S} -gmt 1]
    puts [format {%s  %d-%d  %s} $time [expr {(($sig>>16) & 0xFFFF) + 10000}] \
                                        [expr {($sig & 0xFFFF) + 10000}] $name]
  }

Some comments:

    • traversal is on sorted glob lists, to make this deterministic
    • the "sdx version" command can also be used with directories
    • the reported time is in GMT, to make it independent of location
    • version ID's do not checksum the file data itself, just their names, sizes, and dates
    • version ID's do not depend on the size or modification time of the starkit as a whole
    • names RCS, CVS, core, and a.out are ignored (to match what "sdx wrap" does)




Powered by Mavrig