source: subversion/applications/utils/gary68/changelog.pl @ 34714

Last change on this file since 34714 was 24458, checked in by gary68, 9 years ago

new changelog version

  • Property svn:executable set to *
File size: 11.1 KB
Line 
1
2
3
4# changelog.pl
5
6
7use strict ;
8use warnings ;
9
10use OSM::osm ;
11
12my $version = 2.0 ;
13
14my %users  ;
15$users{"Oberförster"} = 1 ;
16$users{"Michael Wittmann"} = 1 ;
17$users{"Forstwald"} = 1 ;
18$users{"forstwald"} = 1 ;
19$users{"pfoten-weg"} = 1 ;
20$users{"pfoten_weg_!_"} = 1 ;
21$users{"greatmaster"} = 1 ;
22$users{"BugBuster"} = 1 ;
23$users{"leck_mich_alle_am_arsch"} = 1 ;
24$users{"hasse_osm_korinthenkacker"} = 1 ;
25$users{"Ich_hasse_doitsche_OSM-Korinthenkacker"} = 1 ;
26$users{"Kraftfahrstraßen"} = 1 ;
27$users{"lmaa-du-osm-korinthenkacker"} = 1 ;
28$users{"gerd95"} = 1 ;
29$users{"keinname"} = 1 ;
30$users{"asmtb"} = 1 ;
31#$users{""} = 1 ;
32
33my %lastNodeUser = () ;
34my %lastWayUser = () ;
35my %lastRelationUser = () ;
36
37my $fileName1 ;
38my $fileName2 ;
39my $txtFileName ;
40
41
42# read data from file
43my $wayId ;
44my $wayUser ;
45my @wayNodes ;
46my @wayTags ;
47my $nodeId ;
48my $nodeUser ;
49my $nodeLat ;
50my $nodeLon ;
51my @nodeTags ;
52my $aRef1 ;
53my $aRef2 ;
54my $relationId ;
55my $relationUser ;
56my @relationTags ;
57my @relationMembers ;
58
59my %lon ; my %lat ;
60
61my $txtFile ;
62my $htmlFile ;
63
64my %memNodeTags2 = () ;
65my %memWayTags2 = () ;
66my %memRelationTags2 = () ;
67my %memRelationMembers2Count = () ;
68
69my $editedNodes = 0 ;
70my $editedWays = 0 ;
71my $editedRelations = 0 ;
72my $changedNodes = 0 ;
73my $changedWays = 0 ;
74my $changedRelations = 0 ;
75
76my %changedNodesUser = () ;
77my %changedWaysUser = () ;
78my %changedRelationsUser = () ;
79
80my @ways = () ;
81my @relations = () ;
82my %neededNodes = () ;
83my $line = 0 ;
84
85$fileName1 = shift ;
86$fileName2 = shift ;
87$txtFileName = shift ;
88
89
90print "$fileName1\n" ;
91print "$fileName2\n" ;
92print "$txtFileName\n" ;
93
94open ($txtFile, ">", $txtFileName) ;
95
96my $htmlFileName = $txtFileName ;
97$htmlFileName =~ s/.txt/.htm/ ;
98open ($htmlFile, ">", $htmlFileName) ;
99printHTMLiFrameHeader ($htmlFile, "changelog") ;
100print $htmlFile "<H1>Changelog</H1>\n" ;
101print $htmlFile "<table border=\"1\">\n";
102print $htmlFile "<tr>\n" ;
103print $htmlFile "<th>Line</th>\n" ;
104print $htmlFile "<th>Object</th>\n" ;
105print $htmlFile "<th>Id</th>\n" ;
106print $htmlFile "<th>User</th>\n" ;
107print $htmlFile "<th>JOSM</th>\n" ;
108print $htmlFile "<th>Changes</th>\n" ;
109print $htmlFile "</tr>\n" ;
110
111
112
113
114print "reading osm file 2...\n" ;
115print "  - nodes\n" ;
116
117openOsmFile ($fileName2) ;
118($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
119if ($nodeId != -1) {
120        @nodeTags = @$aRef1 ;
121}
122while ($nodeId != -1) {
123
124        if (! defined $nodeUser) {
125                print "user undefined\n" ;
126                $nodeUser = "unknown" ;
127        }
128
129        if ($nodeUser eq "") {
130                print "user empty\n" ;
131                $nodeUser = "unknown" ;
132        }
133
134        if (defined $users{$nodeUser}) {
135                $lon{$nodeId} = $nodeLon ; $lat{$nodeId} = $nodeLat ;   
136                @{$memNodeTags2{$nodeId}} = @nodeTags ;
137                $lastNodeUser{$nodeId} = $nodeUser ;
138                $editedNodes++ ;
139        }
140
141        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
142        if ($nodeId != -1) {
143                @nodeTags = @$aRef1 ;
144        }
145}
146
147print "nodes last edited by users: $editedNodes\n" ;
148
149print "  - ways\n" ;
150
151($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
152if ($wayId != -1) {
153        @wayNodes = @$aRef1 ;
154        @wayTags = @$aRef2 ;
155}
156while ($wayId != -1) {
157
158        if (! defined $wayUser) {
159                print "user undefined\n" ;
160                $wayUser = "unknown" ;
161        }
162
163        if ($wayUser eq "") {
164                print "user empty\n" ;
165                $wayUser = "unknown" ;
166        }
167
168        if (defined $users{$wayUser}) {
169                @{$memWayTags2{$wayId}} = @wayTags ;
170                $lastWayUser{$wayId} = $wayUser ;
171                $editedWays++
172        }
173       
174        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
175        if ($wayId != -1) {
176                @wayNodes = @$aRef1 ;
177                @wayTags = @$aRef2 ;
178        }
179}
180
181print "ways last edited by defined users: $editedWays\n" ;
182
183
184print "  - relations\n" ;
185
186($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
187if ($relationId != -1) {
188        @relationMembers = @$aRef1 ;
189        @relationTags = @$aRef2 ;
190}
191while ($relationId != -1) {
192
193        if (! defined $relationUser) {
194                print "user undefined\n" ;
195                $relationUser = "unknown" ;
196        }
197
198        if ($relationUser eq "") {
199                print "user empty\n" ;
200                $relationUser = "unknown" ;
201        }
202
203        if (defined $users{$relationUser}) {
204                @{$memRelationTags2{$relationId}} = @relationTags ;
205                $memRelationMembers2Count{$relationId} = scalar @relationMembers ;
206                $lastRelationUser{$relationId} = $relationUser ;
207                $editedRelations++
208        }
209       
210        ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
211        if ($relationId != -1) {
212                @relationMembers = @$aRef1 ;
213                @relationTags = @$aRef2 ;
214        }
215}
216
217print "relations last edited by defined users: $editedRelations\n" ;
218
219closeOsmFile () ;
220
221
222print "reading osm file 1...\n" ;
223print "  - nodes\n" ;
224
225openOsmFile ($fileName1) ;
226($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
227if ($nodeId != -1) {
228        @nodeTags = @$aRef1 ;
229}
230while ($nodeId != -1) {
231
232        if (! defined $nodeUser) {
233                print "user undefined\n" ;
234                $nodeUser = "unknown" ;
235        }
236
237        if ($nodeUser eq "") {
238                print "user empty\n" ;
239                $nodeUser = "unknown" ;
240        }
241
242        if (defined $lon{$nodeId}) {
243                if ($nodeUser ne $lastNodeUser{$nodeId}) {
244                        my ($result, $changes) = compareTags (\@nodeTags, $memNodeTags2{$nodeId}) ;
245                        if ($result) {
246                                $line++ ;
247                                writeFile ("node", $nodeId, $lastNodeUser{$nodeId}, $changes, $line) ;
248                                printHTMLLine ("node", $nodeId, $lastNodeUser{$nodeId}, $changes, $nodeLon, $nodeLat, $line) ;
249                                $changedNodes++ ;
250                                $changedNodesUser{$lastNodeUser{$nodeId}}++ ;
251                        }
252                }
253        }
254
255        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
256        if ($nodeId != -1) {
257                @nodeTags = @$aRef1 ;
258        }
259}
260
261print "nodes CHANGED by users: $changedNodes\n" ;
262
263print "  - ways\n" ;
264($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
265if ($wayId != -1) {
266        @wayNodes = @$aRef1 ;
267        @wayTags = @$aRef2 ;
268}
269while ($wayId != -1) {
270
271        if (! defined $wayUser) {
272                print "user undefined\n" ;
273                $wayUser = "unknown" ;
274        }
275
276        if ($wayUser eq "") {
277                print "user empty\n" ;
278                $wayUser = "unknown" ;
279        }
280
281        if (defined $memWayTags2{$wayId}) {
282                if ($wayUser ne $lastWayUser{$wayId}) {
283                        my ($result, $changes) = compareTags (\@wayTags, $memWayTags2{$wayId}) ;
284                        if ($result) {
285                                $line++ ;
286                                writeFile ("way", $wayId, $lastWayUser{$wayId}, $changes, $line) ;
287                                push @ways, [$wayId, $lastWayUser{$wayId}, $changes, $wayNodes[0], $line] ;
288                                $neededNodes{$wayNodes[0]} = 1 ;
289                                $changedWays++ ;
290                                $changedWaysUser{$lastWayUser{$wayId}}++ ;
291                        }
292                }
293        }
294       
295        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
296        if ($wayId != -1) {
297                @wayNodes = @$aRef1 ;
298                @wayTags = @$aRef2 ;
299        }
300}
301
302print "ways CHANGED by users: $changedWays\n" ;
303
304print "  - relations\n" ;
305($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
306if ($relationId != -1) {
307        @relationMembers = @$aRef1 ;
308        @relationTags = @$aRef2 ;
309}
310while ($relationId != -1) {
311
312        if (! defined $relationUser) {
313                print "user undefined\n" ;
314                $relationUser = "unknown" ;
315        }
316
317        if ($relationUser eq "") {
318                print "user empty\n" ;
319                $relationUser = "unknown" ;
320        }
321
322        if (defined $memRelationTags2{$relationId}) {
323                if ($relationUser ne $lastRelationUser{$relationId}) {
324
325                        my $memberChange = 0 ; my $memberChanges = "" ;
326                        my $numMembers = scalar @relationMembers ;
327                        if ($memRelationMembers2Count{$relationId} != $numMembers) {
328                                $memberChange = 1 ;
329                                $memberChanges = " MEMBERS: $numMembers -> $memRelationMembers2Count{$relationId}" ;
330                        }
331
332
333                        my ($result, $changes) = compareTags (\@relationTags, $memRelationTags2{$relationId}) ;
334                        if ($result or $memberChange) {
335                                $line++ ;
336
337                                writeFile ("relation", $relationId, $lastRelationUser{$relationId}, $changes . $memberChanges, $line) ;
338                                push @relations, [$relationId, $lastRelationUser{$relationId}, $changes . $memberChanges, $line] ;
339
340                                $changedRelations++ ;
341                                $changedRelationsUser{$lastRelationUser{$relationId}}++ ;
342                        }
343                }
344        }
345       
346        ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
347        if ($relationId != -1) {
348                @relationMembers = @$aRef1 ;
349                @relationTags = @$aRef2 ;
350        }
351}
352
353print "relations CHANGED by users: $changedRelations\n" ;
354
355closeOsmFile () ;
356
357print "get needed nodes from file 2...\n" ;
358
359openOsmFile ($fileName2) ;
360($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
361if ($nodeId != -1) {
362        @nodeTags = @$aRef1 ;
363}
364while ($nodeId != -1) {
365
366        if (defined $neededNodes{$nodeId}) {
367                $lon{$nodeId} = $nodeLon ; $lat{$nodeId} = $nodeLat ;   
368        }
369
370        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
371        if ($nodeId != -1) {
372                @nodeTags = @$aRef1 ;
373        }
374}
375
376closeOsmFile () ;
377
378foreach my $way (@ways) {
379        my $wayId = $way->[0] ; 
380        my $wayUser = $way->[1] ;       
381        my $changes = $way->[2] ;       
382        my $node = $way->[3] ; 
383        my $line = $way->[4] ; 
384        printHTMLLine ("way", $wayId, $wayUser, $changes, $lon{$node}, $lat{$node}, $line) ;
385}
386
387foreach my $relation (@relations) {
388        my $relationId = $relation->[0] ;       
389        my $relationUser = $relation->[1] ;     
390        my $changes = $relation->[2] ; 
391        my $line = $relation->[3] ;     
392        printHTMLLine ("relation", $relationId, $relationUser, $changes, 0, 0, $line) ;
393}
394
395
396
397print $htmlFile "</table>\n" ;
398
399printHTMLFoot ($htmlFile) ;
400close ($htmlFile) ;
401
402close ($txtFile) ;
403
404print "\nChanged nodes per User:\n" ;
405foreach my $u (sort keys %changedNodesUser) {
406        printf "%-25s %6d\n", $u, $changedNodesUser{$u} ;
407}
408
409print "\nChanged ways per User:\n" ;
410foreach my $u (sort keys %changedWaysUser) {
411        printf "%-25s %6d\n", $u, $changedWaysUser{$u} ;
412}
413
414print "\nChanged relations per User:\n" ;
415foreach my $u (sort keys %changedRelationsUser) {
416        printf "%-25s %6d\n", $u, $changedRelationsUser{$u} ;
417}
418
419
420print "\ndone.\n" ;
421
422
423# -----------------------------------------------------
424
425sub writeFile {
426        my ($object, $id, $user, $comment) = @_ ;
427        print $txtFile "$object,$id,$user,$comment,$line\n" ;
428}
429
430sub compareTags {
431        my ($ref1, $ref2) = @_ ;
432        my @tags1 = @$ref1 ;
433        my @tags2 = @$ref2 ;
434        my %t1 = () ; my %t2 = () ;
435
436        my $changed = 0 ;
437        my $changes = "" ;
438
439        foreach my $tag (@tags1) { $t1{$tag->[0]} = $tag->[1] ; }
440        foreach my $tag (@tags2) { $t2{$tag->[0]} = $tag->[1] ; }
441
442        foreach my $t (keys %t1) {
443                if (!defined $t2{$t}) {
444                        # deleted tag
445                        $changes .= "DELETED TAG $t:$t1{$t} " ;
446                        $changed = 1 ;
447                }
448                else {
449                        if ($t1{$t} ne $t2{$t}) {
450                                # changed
451                                $changes .= "CHANGED TAG $t: $t1{$t} -> $t2{$t} " ;
452                                $changed = 1 ;
453                        }
454                }
455        }
456       
457        foreach my $t (keys %t2) {
458                if (!defined $t1{$t}) {
459                        # new tag
460                        $changes .= "NEW TAG $t:$t2{$t} " ;
461                        $changed = 1 ;
462                }
463        }
464
465        return ($changed, $changes) ;
466}
467
468
469sub printHTMLLine {
470        my ($object, $id, $user, $changes, $lon, $lat, $line) = @_ ;
471        print $htmlFile "<tr>\n" ;
472        print $htmlFile "<td>$line</th>\n" ;
473        print $htmlFile "<td>$object</th>\n" ;
474        print $htmlFile "<td>", historyLink ($object, $id) , "</td>\n" ;
475        print $htmlFile "<td>$user</th>\n" ;
476        if ($object eq "way") {
477                print $htmlFile "<td>", josmLink ($lon, $lat, 0.001, $id), "</td>\n" ;
478        }
479        if ($object eq "node") {
480                print $htmlFile "<td>", josmLinkSelectNode ($lon, $lat, 0.001, $id), "</td>\n" ;
481        }
482        if ($object eq "relation") {
483                print $htmlFile "<td>n/a</td>\n" ;
484        }
485        print $htmlFile "<td>$changes</th>\n" ;
486        print $htmlFile "</tr>\n" ;
487}
Note: See TracBrowser for help on using the repository browser.