initial checkin
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 13 Jan 2012 11:05:58 +0100
changeset 65 d22c05bd4302
parent 64 088f5d0099e4
child 66 7d2a9fc67612
initial checkin
reports/Builder__ChangeReport.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reports/Builder__ChangeReport.st	Fri Jan 13 11:05:58 2012 +0100
@@ -0,0 +1,105 @@
+"{ Package: 'stx:goodies/builder/reports' }"
+
+"{ NameSpace: Builder }"
+
+Report subclass:#ChangeReport
+	instanceVariableNames:'gofer'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Builder-Reports-Unfinished'
+!
+
+
+!ChangeReport methodsFor:'accessing'!
+
+changesFor: aResolvedVersion
+	| references patch |
+	references := gofer allResolved
+		select: [ :each | each packageName = aResolvedVersion packageName ].
+	patch := MCPatch 
+		fromBase: (references size > 1 
+			ifTrue: [ (references at: references size - 1) version snapshot ]
+			ifFalse: [ MCSnapshot empty ])
+		target: aResolvedVersion version snapshot.
+	^ patch operations asSortedCollection
+!
+
+resolved
+	^ gofer resolved
+! !
+
+!ChangeReport methodsFor:'generating'!
+
+generateChange: aPatch on: aStream
+	aPatch isAddition
+		ifTrue: [ ^ self generateChangeAddition: aPatch on: aStream ].
+	aPatch isModification
+		ifTrue: [ ^ self generateChangeModification: aPatch on: aStream ].
+	aPatch isRemoval
+		ifTrue: [ ^ self generateChangeRemoval: aPatch on: aStream ]
+!
+
+generateChangeAddition: aPatch on: aStream
+	aStream tab; tab; tab; nextPutAll: '<item action="add">'; nextPutAll: (self encode: (self convert: aPatch summary)); nextPutAll: '</item>'; nextPut: Character lf
+!
+
+generateChangeModification: aPatch on: aStream
+	aStream tab; tab; tab; nextPutAll: '<item action="change">'; nextPutAll: (self encode: (self convert: aPatch summary)); nextPutAll: '</item>'; nextPut: Character lf
+!
+
+generateChangeRemoval: aPatch on: aStream
+	aStream tab; tab; tab; nextPutAll: '<item action="remove">'; nextPutAll: (self encode: (self convert: aPatch summary)); nextPutAll: '</item>'; nextPut: Character lf
+!
+
+generateChangeSet: aResolvedVersion on: aStream
+	| info |
+	info := aResolvedVersion version info.
+	aStream tab; nextPutAll: '<logentry version="'; nextPutAll: (self encode: info name); nextPutAll: '">'; nextPut: Character lf.
+	aStream tab; tab; nextPutAll: '<date>'; nextPutAll: (self encode: info date yyyymmdd); space; nextPutAll: (self encode: info time print24); nextPutAll: '</date>'; nextPut: Character lf.
+	aStream tab; tab; nextPutAll: '<author>'; nextPutAll: (self encode: info author); nextPutAll: '</author>'; nextPut: Character lf.
+	aStream tab; tab; nextPutAll: '<msg>'; nextPutAll: (self encode: (self convert: info message)); nextPutAll: '</msg>'; nextPut: Character lf.
+	"aStream tab; tab; nextPutAll: '<items>'; nextPut: Character lf.
+	(self changesFor: aResolvedVersion)
+		do: [ :each | self generateChange: each on: aStream ].
+	aStream tab; tab; nextPutAll: '</items>'; nextPut: Character lf."
+	aStream tab; nextPutAll: '</logentry>'; nextPut: Character lf
+!
+
+generateOn: aStream
+	aStream nextPutAll: '<?xml version="1.0" encoding="UTF-8"?>'; nextPut: Character lf.
+	aStream nextPutAll: '<changelog>'; nextPut: Character lf.
+	self resolved
+		do: [ :each | self generateChangeSet: each on: aStream ].
+	aStream nextPutAll: '<changelog>'
+! !
+
+!ChangeReport methodsFor:'initialization'!
+
+initializeOn: aCollection
+	gofer := Gofer new.
+	aCollection do: [ :each | gofer package: each ]
+! !
+
+!ChangeReport methodsFor:'running'!
+
+run
+	| stream |
+	stream := FileDirectory default containingDirectory
+		forceNewFileNamed: 'changelog.xml'.
+	[ self generateOn: stream ]
+		ensure: [ stream close ]
+! !
+
+!ChangeReport class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+!
+
+version_CVS
+    ^ '$Header$'
+!
+
+version_SVN
+    ^ '§Id: Builder__ChangeReport.st 191 2011-08-06 20:59:23Z vranyj1 §'
+! !