2 * Copyright 2005-2010, Ecole des Mines de Nantes, University of Copenhagen
3 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
4 * This file is part of Coccinelle.
6 * Coccinelle is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, according to version 2 of the License.
10 * Coccinelle is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
18 * The authors reserve the right to distribute this or future versions of
19 * Coccinelle under other licenses.
24 * Copyright 2005-2010, Ecole des Mines de Nantes, University of Copenhagen
25 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
26 * This file is part of Coccinelle.
28 * Coccinelle is free software: you can redistribute it and/or modify
29 * it under the terms of the GNU General Public License as published by
30 * the Free Software Foundation, according to version 2 of the License.
32 * Coccinelle is distributed in the hope that it will be useful,
33 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35 * GNU General Public License for more details.
37 * You should have received a copy of the GNU General Public License
38 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
40 * The authors reserve the right to distribute this or future versions of
41 * Coccinelle under other licenses.
45 (* sort a list of git codes such that the most recent comes first *)
47 let git_home = ref "/home/julia/linux-2.6"
49 let unwind_protect f cleanup
=
51 with e
-> begin cleanup e
; raise e
end
53 let (with_open_infile
: string -> ((in_channel
) -> 'a
) -> 'a
) = fun file f
->
54 let chan = open_in file
in
55 unwind_protect (fun () ->
59 (fun e
-> close_in
chan)
61 (* ----------------------------------------------------------------------- *)
64 [("Jan",1);("Feb",2);("Mar",3);("Apr",4);("May",5);("Jun",6);("Jul",7);
65 ("Aug",8);("Sep",9);("Oct",10);("Nov",11);("Dec",12)]
68 [(1,31);(2,28);(3,31);(4,30);(5,31); (6,30);(7,31);(8,31);(9,30);(10,31);
69 (11,30);(12,31);(0,31)]
71 let normalize (year
,month
,day
,hour
,minute
,second
) =
74 let (day
,hour
) = (day
- 1,hour
+ 24) in
77 let month = month - 1 in
78 let day = List.assoc
month antimonths in
80 if month = 2 && year
/ 4 * 4 = year
&& not
(year
/ 100 * 100 = year
)
84 then (year
-1,12,day,hour
,minute
,second
)
85 else (year
,month,day,hour
,minute
,second
)
86 else (year
,month,day,hour
,minute
,second
)
87 else (year
,month,day,hour
,minute
,second
)
89 exception Fail
of string
95 "pushd %s >& /dev/null ; git log %s^..%s | grep Date: > /tmp/gitsort_info ; popd >& /dev/null"
96 !git_home code code
) in
97 with_open_infile
"/tmp/gitsort_info" (fun i
->
100 with End_of_file
-> raise
(Fail
"bad git file") in
101 match Str.split
(Str.regexp
" ") l with
102 [date
;_;_;weekday
;month;day;time
;year
;offset
] ->
103 let day = int_of_string
day in
104 let month = List.assoc
month months in
105 let year = int_of_string
year in
106 (match Str.split
(Str.regexp
":") time
with
107 [hour
;minute
;second
] ->
108 let hour = int_of_string
hour in
109 let minute = int_of_string
minute in
110 let second = int_of_string
second in
112 match String.get offset
0 with
115 | _ -> raise
(Fail
"bad offset") in
116 (if not
(String.sub offset
3 2 = "00")
117 then raise
(Fail
"require 0 minutes difference"));
119 hour + (modifier * (int_of_string
(String.sub offset
1 2))) in
120 normalize (year,month,day,hour,minute,second)
121 | _ -> raise
(Fail
"bad date2"))
122 | l -> raise
(Fail
("bad date1: "^
(String.concat
"|" l))))
124 let rec get_dates = function
128 try Some
(read_info code
)
130 Fail s
-> Printf.printf
"problem in %s: %s\n" code s
; None
131 | _ -> Printf.printf
"problem in %s\n" code
; None
in
133 Some
date -> (date,code
)::(get_dates rest
)
134 | None
-> get_dates rest
137 let gits = ref ([] : string list
) in
138 with_open_infile file
(fun i
->
140 let git = try Some
(input_line i
) with End_of_file
-> None
in
142 Some x
-> gits := x
:: !gits; loop()
149 (* all because I don't know how to make a backslash regexp...*)
150 (function x
-> String.length x
> 10)
151 (Str.split
(Str.regexp
"[ \t]+") l))
155 let args = Array.to_list
Sys.argv
in
158 [_;git_home_info
;gits] -> git_home := git_home_info
; gits
160 | _ -> failwith
"args: [git home] git_codes_file" in
161 let codes = get_codes file in
162 let dates = get_dates codes in
163 match List.sort compare
dates with
165 List.iter
(function (_,x
) -> Printf.printf
"%s \\\n" x
) (List.rev prev
);
166 Printf.printf
"%s\n" last