MCVersion.st
author Jan Vrany <jan.vrany@labware.com>
Tue, 11 Jul 2023 12:13:27 +0100
branchjv
changeset 1173 e3dd2050492e
parent 1167 37c202ea81a8
permissions -rw-r--r--
Update class category to match package name if it does not This is needed because in Squeak / Pharo world package membership is defined by (class) category prefix. This is soo annoying...

"
COPYRIGHT (c) 2021 LabWare
COPYRIGHT (c) 2023 LabWare
"
"{ Package: 'stx:goodies/monticello' }"

"{ NameSpace: Smalltalk }"

Object subclass:#MCVersion
	instanceVariableNames:'package info snapshot dependencies cachable'
	classVariableNames:''
	poolDictionaries:''
	category:'SCM-Monticello-Versioning'
!

!MCVersion class methodsFor:'documentation'!

copyright
"
COPYRIGHT (c) 2021 LabWare
COPYRIGHT (c) 2023 LabWare


"
! !

!MCVersion class methodsFor:'instance creation'!

forPackage: packageId
    "Returns an MCVersion for currently loaded code"

    | pkg wc versionInfo version |

    pkg := MCPackage named: packageId.
    wc := pkg workingCopy.
    versionInfo := MCVersionInfo forPackage: packageId.
    [
        version := wc newVersion.
        version snapshot options includeExtrasForSTX:false.
    ] on:MCVersionNameAndMessageRequest do:[:ex | 
        ex resume:(Array with:versionInfo name with:versionInfo message) 
    ].
    version info:versionInfo.        
    ^ version

    "
    MCVersion forPackage: 'MachineArithmetic'
    "

    "Created: / 03-05-2021 / 16:14:04 / Jan Vrany <jan.vrany@labware.com>"
!

package: aPackageOrPackageID
	aPackageOrPackageID isSymbol ifTrue:[
	    "/ an ST/X package-ID
	    ^ super package: aPackageOrPackageID
	].
	"/ a monticello package-ID
	^ self package: aPackageOrPackageID info: MCVersionInfo new

    "Modified: / 22-11-2006 / 14:16:22 / cg"
!

package: aPackage info: aVersionInfo
	^ self package: aPackage info: aVersionInfo snapshot: aPackage snapshot
!

package: aPackage info: aVersionInfo snapshot: aSnapshot
	^ self package: aPackage info: aVersionInfo snapshot: aSnapshot dependencies: #()
!

package: aPackage info: aVersionInfo snapshot: aSnapshot dependencies: aCollection
	^ self new initializeWithPackage: aPackage info: aVersionInfo snapshot: aSnapshot dependencies: aCollection
! !

!MCVersion methodsFor:'accessing'!

cachable:something
    cachable := something.
!

changes
	^ self snapshot patchRelativeToBase: package snapshot
!

dependencies
	^ dependencies ifNil: [#()]
!

fileName
    |rawName cookedName legalName|

    rawName := info name.
    cookedName := rawName copy replaceAny:'/:' with:$_.
    legalName := cookedName asFilename makeLegalFilename name.
    ^ legalName, '.', self writerClass extension

    "Modified: / 24-07-2012 / 16:30:13 / cg"
!

info
	^ info
!

info: anMCAncestry
    info := anMCAncestry.

    "Modified (format): / 07-06-2013 / 01:01:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

package
	^ package
!

snapshot
	^ snapshot
!

snapshot:anMCSnapshot
   snapshot := anMCSnapshot

    "Created: / 02-12-2011 / 16:10:18 / cg"
!

summary
	^ String streamContents:
		[:s |
		s nextPutAll: info summaryHeader.
		(dependencies isNil or: [dependencies isEmpty]) ifFalse:
			[s cr; nextPutAll: 'Dependencies: '.
			dependencies
				do: [:ea | s nextPutAll: ea versionInfo name]
				separatedBy: [s nextPutAll: ', ']].
		s cr; cr; nextPutAll: info message]
!

workingCopy
	^ package workingCopy
!

writerClass
    Smalltalk isSmalltalkX ifTrue:[
	^ MCStxMczWriter
    ] ifFalse:[
	^ MCMczWriter
    ]
! !

!MCVersion methodsFor:'actions'!

addToCache
        MCCacheRepository default storeVersion: self

    "Modified: / 06-10-2021 / 12:16:44 / Jan Vrany <jan.vrany@labware.com>"
!

adopt
	self workingCopy adopt: self
!

fileOutOn: aStream
	self writerClass fileOut: self on: aStream
!

load
	MCVersionLoader loadVersion: self
!

merge
	MCVersionMerger mergeVersion: self
! !

!MCVersion methodsFor:'converting'!

asDiffAgainst: aVersion
	aVersion info = self info ifTrue: [self error: 'Cannot diff against self!!'].
	^ MCDiffyVersion
		package: self package
		info: self info
		snapshot: self snapshot
		dependencies: self dependencies
		baseVersion: aVersion
! !

!MCVersion methodsFor:'enumerating'!

allAvailableDependenciesDo: aBlock
	| version |
	self dependencies do:
		[:ea |
		[version _ ea resolve.
		version allAvailableDependenciesDo: aBlock.
		aBlock value: version]
			on: Error do: []]
!

allDependenciesDo: aBlock
	self allDependenciesDo: aBlock ifUnresolved: [:ignored | true]
!

allDependenciesDo: aBlock ifUnresolved: failBlock
	| dict |
	dict _ Dictionary new.
	self allDependenciesNotIn: dict do: aBlock ifUnresolved: failBlock
!

allDependenciesNotIn: aDictionary do: aBlock ifUnresolved: failBlock
	| version |
	self dependencies do:
		[:ea |
		version := aDictionary at: ea ifAbsent: [ea resolve].
		version
			ifNil: [failBlock value: ea]
			ifNotNil: [(aDictionary includes: version) ifFalse:
						[aDictionary at: ea put: version.
						version
							allDependenciesNotIn: aDictionary
							do: aBlock
							ifUnresolved: failBlock.
						aBlock value: version]]]
!

withAllDependenciesDo: aBlock
	self allDependenciesDo: aBlock ifUnresolved: [:ignored].
	aBlock value: self
!

withAllDependenciesDo: aBlock ifUnresolved: failBlock
	| dict |
	dict _ Dictionary new.
	self allDependenciesNotIn: dict do: aBlock ifUnresolved: failBlock.
	aBlock value: self
! !

!MCVersion methodsFor:'initialize-release'!

initializeWithPackage: aPackage info: aVersionInfo snapshot: aSnapshot dependencies: aCollection
        package _ aPackage.
        info _ aVersionInfo.
        snapshot _ aSnapshot.
        dependencies _ aCollection.
        "/ self addToCache.

    "Modified: / 06-10-2021 / 12:17:04 / Jan Vrany <jan.vrany@labware.com>"
!

setPackage: aPackage info: aVersionInfo snapshot: aSnapshot dependencies: aCollection
	package _ aPackage.
	info _ aVersionInfo.
	snapshot _ aSnapshot.
	dependencies _ aCollection
! !

!MCVersion methodsFor:'printing'!

printOn: aStream
	super printOn: aStream.
	aStream nextPut: $(.
	aStream nextPutAll: self info name.
	aStream nextPut: $).
! !

!MCVersion methodsFor:'testing'!

canOptimizeLoading
	"Answer whether I can provide a patch for the working copy without the usual diff pass"
	^false
!

isCacheable
	^ cachable ? true
!

isDiffy
	^ false
! !

!MCVersion class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCVersion.st,v 1.10 2013-07-27 13:50:54 cg Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCVersion.st,v 1.10 2013-07-27 13:50:54 cg Exp $'
!

version_HG

    ^ '$Changeset: <not expanded> $'
! !