Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/system/smlnj/internal/versiontool.sml
ViewVC logotype

Diff of /sml/trunk/src/system/smlnj/internal/versiontool.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1639, Thu Sep 30 15:53:06 2004 UTC revision 1689, Sat Nov 13 06:25:04 2004 UTC
# Line 1  Line 1 
1  (* versiontool.sml  (* versiontool.sml
2   *   *
3   *   A CM tool for automatically generating file version.sml   *   A CM tool for automatically generating file version.sml
4   *   from a template, incorporating current version, release,   *   from a template, incorporating current version and release.
  *   and date/time.  
5   *   *
6   * Copyright (c) 2004 by The Fellowship of SML/NJ   * Copyright (c) 2004 by The Fellowship of SML/NJ
7   *   *
8   * Author: Matthias Blume (blume@tti-c.org)   * Author: Matthias Blume (blume@tti-c.org)
9   *)   *)
10  structure VersionTool = struct  structure VersionTool = struct
   
11    local    local
   
12      val bump_release =      val bump_release =
13          ref (Option.isSome (OS.Process.getEnv "VERSIONTOOL_BUMP_RELEASE"))          ref (Option.isSome (OS.Process.getEnv "VERSIONTOOL_BUMP_RELEASE"))
14    
15      fun getVersion file =      fun getVersion file =
16          let val s = TextIO.openIn file          let val s = TextIO.openIn file
17          in          in case TextIO.inputLine s of
             case TextIO.inputLine s of  
18                  SOME l =>                  SOME l =>
19                    let val _ = TextIO.closeIn s                    let val _ = TextIO.closeIn s
20                        val fl = String.tokens                        val fl = String.tokens
21                                     (fn c => Char.isSpace c orelse c = #".") l                                     (fn c => Char.isSpace c orelse c = #".") l
22                    in                 in map (fn f => getOpt (Int.fromString f, 0)) fl
                       map (fn f => getOpt (Int.fromString f, 0)) fl  
23                    end                    end
24                | NONE => [0, 0]                | NONE => [0, 0]
25          end handle _ => [0, 0]          end handle _ => [0, 0]
26    
27      fun getRelease file =      fun getRelease file =
28          let val s = TextIO.openIn file          let val s = TextIO.openIn file
29          in          in case TextIO.inputLine s of
             case TextIO.inputLine s of  
30                  SOME l => (TextIO.closeIn s; Int.fromString l)                  SOME l => (TextIO.closeIn s; Int.fromString l)
31                | NONE => (TextIO.closeIn s; NONE)                | NONE => (TextIO.closeIn s; NONE)
32          end handle _ => NONE          end handle _ => NONE
33    
34      fun putRelease (file, r) =      fun putRelease (file, r) =
35          let val s = TextIO.openOut file          let val s = TextIO.openOut file
36          in          in TextIO.output (s, Int.toString r ^ "\n");
             TextIO.output (s, Int.toString r ^ "\n");  
37              TextIO.closeOut s              TextIO.closeOut s
38          end          end
39    
40      fun bumpRelease (file, r) =      fun bumpRelease (file, r) =
41          if !bump_release then putRelease (file, r + 1) else ()          if !bump_release then putRelease (file, r + 1) else ()
42    
     fun mkDate () =  
         let val d = Date.fromTimeLocal (Time.now ())  
             fun month Date.Jan = "January"  
               | month Date.Feb = "February"  
               | month Date.Mar = "March"  
               | month Date.Apr = "April"  
               | month Date.May = "May"  
               | month Date.Jun = "June"  
               | month Date.Jul = "July"  
               | month Date.Aug = "August"  
               | month Date.Sep = "September"  
               | month Date.Oct = "October"  
               | month Date.Nov = "November"  
               | month Date.Dec = "December"  
             val i = Int.toString  
             fun si x = if x >= 0 then "+" ^ i x else "-" ^ i (~x)  
             fun dd x =  
                 if x < 10 then "0" ^ i x else i x  
         in  
             concat [month (Date.month d), " ",  
                     i (Date.day d), ", ",  
                     i (Date.year d), " ",  
                     dd (Date.hour d), ":",  
                     dd (Date.minute d), ":",  
                     dd (Date.second d), " (",  
                     si (LargeInt.toInt (Time.toSeconds (Date.localOffset ()))  
                         div 3600), ")"]  
         end  
   
43      fun gen { template, target, vfile, rfile } =      fun gen { template, target, vfile, rfile } =
44          let val version = getVersion vfile          let val version = getVersion vfile
45              val release = getRelease rfile              val release = getRelease rfile
46              val version' =              val version' = case release of
                 case release of  
47                      NONE => version                      NONE => version
48                    | SOME r => version @ [r]                    | SOME r => version @ [r]
49              val vstring = String.concatWith ", " (map Int.toString version')              val vstring = String.concatWith ", " (map Int.toString version')
             val date = mkDate ()  
50              val ss = TextIO.openIn template              val ss = TextIO.openIn template
51              val ts = TextIO.openOut target              val ts = TextIO.openOut target
52              fun loop () =              fun loop () =
# Line 93  Line 55 
55                    | SOME #"%" =>                    | SOME #"%" =>
56                        (case TextIO.input1 ss of                        (case TextIO.input1 ss of
57                             SOME #"V" => (TextIO.output (ts, vstring); loop ())                             SOME #"V" => (TextIO.output (ts, vstring); loop ())
                          | SOME #"D" => (TextIO.output (ts, date); loop ())  
58                           | SOME #"F" => (TextIO.output (ts, OS.Path.file target);                           | SOME #"F" => (TextIO.output (ts, OS.Path.file target);
59                                           TextIO.output (ts, " generated from");                                           TextIO.output (ts, " generated from");
60                                           loop ())                                           loop ())
61                           | SOME c => (TextIO.output1 (ts, c); loop ())                           | SOME c => (TextIO.output1 (ts, c); loop ())
62                           | NONE => TextIO.output1 (ts, #"%"))                           | NONE => TextIO.output1 (ts, #"%"))
63                    | SOME c => (TextIO.output1 (ts, c); loop ())                    | SOME c => (TextIO.output1 (ts, c); loop ())
64          in          in bumpRelease (rfile, getOpt (release, ~1));
             bumpRelease (rfile, getOpt (release, ~1));  
65              loop ();              loop ();
66              TextIO.closeIn ss;              TextIO.closeIn ss;
67              TextIO.closeOut ts              TextIO.closeOut ts
# Line 123  Line 83 
83          let fun dogen (targetpp, versionfilepp, releasefilepp) () =          let fun dogen (targetpp, versionfilepp, releasefilepp) () =
84                  let val templatep = Tools.srcpath (#mkpath spec ())                  let val templatep = Tools.srcpath (#mkpath spec ())
85                      val targetp = Tools.srcpath targetpp                      val targetp = Tools.srcpath targetpp
86                  in                      val target = Tools.nativeSpec targetp
87                      gen { template = Tools.nativeSpec templatep,                      val template = Tools.nativeSpec templatep
88                            target = Tools.nativeSpec targetp,                      val vfile = Tools.nativePreSpec versionfilepp
89                            vfile = Tools.nativePreSpec versionfilepp,                      val rfile = Tools.nativePreSpec releasefilepp
90                            rfile = Tools.nativePreSpec releasefilepp };                      fun newerThanTarget f = Tools.outdated tool ([target], f)
91                    in if List.exists newerThanTarget [template, vfile, rfile] then
92                           gen { template = template, target = target,
93                                 vfile = vfile, rfile = rfile }
94                       else ();
95                      ({ smlfiles = [(targetp, { share = Sharing.DONTCARE,                      ({ smlfiles = [(targetp, { share = Sharing.DONTCARE,
96                                                 setup = (NONE, NONE),                                                 setup = (NONE, NONE),
97                                                 split = NONE,                                                 split = NONE,
# Line 141  Line 105 
105                  end                  end
106              fun complain l =              fun complain l =
107                  raise Tools.ToolError { tool = tool, msg = concat l }                  raise Tools.ToolError { tool = tool, msg = concat l }
108          in          in case #opts spec of
             case #opts spec of  
109                  NONE => complain ["missing parameters"]                  NONE => complain ["missing parameters"]
110                | SOME to =>                | SOME to =>
111                    let val { matches, restoptions } =                    let val { matches, restoptions } =
# Line 151  Line 114 
114                                                 options = to }                                                 options = to }
115                        fun match kw =                        fun match kw =
116                            case matches kw of                            case matches kw of
117                                NONE => complain ["missing parameter \"",                             NONE => complain ["missing parameter \"", kw, "\""]
118                                                  kw, "\""]                           | SOME [Tools.STRING { mkpath, ... }] => mkpath ()
119                              | SOME [Tools.STRING { mkpath, ... }] =>                           | _ => complain ["invalid parameter \"", kw, "\""]
120                                  mkpath ()                 in context (dogen (match kw_target,
                             | _ => complain ["invalid parameter \"",  
                                              kw, "\""]  
                   in  
                       context (dogen (match kw_target,  
121                                        match kw_versionfile,                                        match kw_versionfile,
122                                        match kw_releasefile))                                        match kw_releasefile))
123                    end                    end
124          end          end
   
125    in    in
   
126      val bump_release = bump_release      val bump_release = bump_release
127      val _ = Tools.registerClass (class, versiontoolrule)      val _ = Tools.registerClass (class, versiontoolrule)
   
128    end    end
129  end  end

Legend:
Removed from v.1639  
changed lines
  Added in v.1689

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0