"
COPYRIGHT (c) 2011 by eXept Software AG
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
"{ Package: 'stx:libtool' }"
AbstractSourceCodeManagementSettingsAppl subclass:#StoreSourceCodeManagementSettingsAppl
instanceVariableNames:'sourceCacheDir useManager availableManagers condenseSourceCache
setupSourceCodeManager checkClassesWhenCheckingIn
formattingConfiguration flushSourceCache localSourceFirst
repositoryHolder manager repository listOfModules
cvsRootPrototypeList addPerModuleRoot removeEnabled
perModuleRootModule acceptChannel removePerModuleRoot
perModuleRoot cvsRootHolder selectedPerModuleRoot
cvsBinDirectoryHolder cvsExecutableHolder rootsPerModule
cvsLoginInModuleEnabled cvsLoginEnabled
selectedManagerTypeIndexHolder managerIsCVSSourceCodeManager
managerIsStoreSourceCodeManager storeLoginEnabled
storeHostPrototypeList storeHostnameHolder storeUsernameHolder
storePasswordHolder perStoreModuleHostnameHolder
perStoreModuleUsernameHolder perStoreModulePasswordHolder
perStoreModuleRoot perStoreModuleRootModule
selectedPerStoreModuleRoot storeConnectEnabled
storeConnectInModuleEnabled perModuleFieldsEnableHolder
managerIsSmallTeamSourceCodeManager
selectedPerSmallTeamModuleRoot
perSmallTeamModuleFieldsEnableHolder perSmallTeamModuleRoot
perSmallTeamModuleRootModule perSmallTeamModuleHostnameHolder
smallTeamHostnameHolder verboseSourceCodeAccess keepMethodSource'
classVariableNames:'RecentlyUsedCVSRoots RecentlyUsedStoreHosts
RecentlyUsedSmallTeamHosts LastStoreHost LastStoreUser
LastStorePassword'
poolDictionaries:''
category:'System-SourceCodeManagement'
!
!StoreSourceCodeManagementSettingsAppl class methodsFor:'documentation'!
copyright
"
COPYRIGHT (c) 2011 by eXept Software AG
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
!
documentation
"
Store (visualWorks repository access) source code settings - highly experimental and unsupported.
"
! !
!StoreSourceCodeManagementSettingsAppl class methodsFor:'image specs'!
defaultIcon
"This resource specification was automatically generated
by the ImageEditor of ST/X."
"Do not manually edit this!! If it is corrupted,
the ImageEditor may not be able to read the specification."
"
self defaultIcon inspect
ImageEditor openOnClass:self andSelector:#defaultIcon
Icon flushCachedIcons
"
<resource: #image>
^Icon
constantNamed:#'AbstractSettingsApplication::SourceCodeManagementSettingsAppl class defaultIcon'
ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(8 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
@@@@@@@@@@@A@PHB@0P@@@@@@@@@@@@@@@@@@@HEA \HA $JB0HD@@@@@@@@@@@@@@HLA04NC0HD@@L@@ P@@@@@@@@@@@@ED@ NDP@@@@@@@@@D@@@@@@@@
@@@BA \FAPP@@@@@@@@@@@P@@@@@@@@@AQ@RC0@@@@@@@@@@@@@@@@@@@@@@@@TGA!!DD@@@@@@@@@@@@@@@@@@@D@PDIA08OA@@@@@@@@@@@@@@@@@@@AP S
A0XIBPXGC0P@@@@@@@@@@@@@@@@ECAPLBPXOAP@@@@@@EQX@@@@@@@@@@@TIE@XOAP@@@@@@EQ\XE @@@@@@@@@@AP$OAP@@@@@@FQ\ZE!! V@@@@@@@@@@@E
F0@@@@@@EQ\ZF!!(VFAX@@@@@@@@@@@@@@@@ZEQ\VE!!(ZF!!XWF @@@@@@@@@@@@@@@@@@@A\ZE!!(@@@@@@@@@@@@@@@@@@@@@@@@XE!!XZ@@@@@@@@@@@@@@@@
@@@@@@@@EQ(V@@@@@@@@@@@@@@@@@@@@@@@@EQ\VE @@@@@@@@@@@@@@@@@@@@@@EQ VE @@@@@@@@@@@@@@F @@@@@WEQ VE!!(@@@@@@@@@@@@@@@@@E!!\W
EQXVE @@@@@@@@@@@@@@@@@@@@@@@A(Z@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 32 64 0 0 64 0 32 32 0 0 32 0 32 96 32 96 192 128 192 224 192 160 224 160 32 128 64 64 96 64 64 96 32 32 160 64 160 224 192 64 160 96 32 128 32 224 224 224 64 128 64 160 192 160 224 224 192 32 160 96 160 160 160 64 64 64 96 96 96 128 128 128 192 192 192 32 32 32 32 64 32]; mask:((ImageMask new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@O8@@?>@A??@A?C C<@0C8@PC8@@??@@??F@_>O@O<_ G8?0C1?8A#?<@C?<@@_@H@_@L@?@GC>@C?>@A?<@@_0@') ; yourself); yourself]
! !
!StoreSourceCodeManagementSettingsAppl class methodsFor:'interface specs'!
windowSpec
"This resource specification was automatically generated
by the UIPainter of ST/X."
"Do not manually edit this!! If it is corrupted,
the UIPainter may not be able to read the specification."
"
UIPainter new openOnClass:StoreSourceCodeManagementSettingsAppl andSelector:#windowSpec
StoreSourceCodeManagementSettingsAppl new openInterface:#windowSpec
StoreSourceCodeManagementSettingsAppl open
"
<resource: #canvas>
^
#(FullSpec
name: windowSpec
window:
(WindowSpec
label: 'Source Code Manager Settings'
name: 'Source Code Manager Settings'
min: (Point 10 10)
bounds: (Rectangle 0 0 659 580)
)
component:
(SpecCollection
collection: (
(VerticalPanelViewSpec
name: 'VerticalPanel2'
layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
horizontalLayout: fit
verticalLayout: topSpace
horizontalSpace: 3
verticalSpace: 20
component:
(SpecCollection
collection: (
(VerticalPanelViewSpec
name: 'VerticalPanel3'
horizontalLayout: fit
verticalLayout: top
horizontalSpace: 3
verticalSpace: 4
component:
(SpecCollection
collection: (
(ViewSpec
name: 'ManagerSetupBoxx'
component:
(SpecCollection
collection: (
(FramedBoxSpec
label: 'Store-DB Source Repository Settings'
name: 'StoreSetupBox'
layout: (LayoutFrame 0 0 0 0 0 1 0 1)
labelPosition: topLeft
translateLabel: true
component:
(SpecCollection
collection: (
(ViewSpec
name: 'HostBox'
layout: (LayoutFrame 0 0 0 0 0 1 25 0)
component:
(SpecCollection
collection: (
(LabelSpec
label: 'DB or DB@Host:'
name: 'StoreHostLabel'
layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
level: 0
translateLabel: true
adjust: right
)
(ComboBoxSpec
name: 'StoreHostComboBox'
layout: (LayoutFrame 44 0.25 0 0 0 1 22 0)
tabable: true
model: storeHostnameHolder
immediateAccept: true
acceptOnLeave: true
acceptOnReturn: true
acceptOnTab: true
acceptOnLostFocus: true
acceptChannel: acceptChannel
acceptOnPointerLeave: true
comboList: storeHostPrototypeList
)
)
)
)
(ViewSpec
name: 'UserBox'
layout: (LayoutFrame 0 0.0 27 0 0 1 52 0)
component:
(SpecCollection
collection: (
(LabelSpec
label: 'Username:'
name: 'StoreUserLabel'
layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
level: 0
translateLabel: true
adjust: right
)
(InputFieldSpec
name: 'StoreUserEntryField'
layout: (LayoutFrame 44 0.25 0 0 0 1 22 0)
tabable: true
model: storeUsernameHolder
acceptChannel: acceptChannel
acceptOnPointerLeave: true
)
)
)
)
(ViewSpec
name: 'PasswordBox'
layout: (LayoutFrame 0 0.0 54 0 0 1 79 0)
component:
(SpecCollection
collection: (
(LabelSpec
label: 'Password:'
name: 'Label7'
layout: (LayoutFrame 0 0.0 0 0 40 0.25 22 0)
level: 0
translateLabel: true
adjust: right
)
(InputFieldSpec
name: 'PasswordEntryField'
layout: (LayoutFrame 44 0.25 0 0 -130 1 22 0)
tabable: true
model: storePasswordHolder
type: password
acceptChannel: acceptChannel
acceptOnPointerLeave: true
)
)
)
)
(HorizontalPanelViewSpec
name: 'HorizontalPanel4'
layout: (LayoutFrame -130 1 51 0 0 1 82 0)
horizontalLayout: fitSpace
verticalLayout: center
horizontalSpace: 3
verticalSpace: 3
component:
(SpecCollection
collection: (
(ActionButtonSpec
label: 'Try to Connect'
name: 'TryConnectButton1'
translateLabel: true
tabable: true
model: storeConnect
enableChannel: storeConnectEnabled
extent: (Point 124 22)
)
)
)
)
(LabelSpec
label: 'DB per Module:'
name: 'Label4'
layout: (LayoutFrame 0 0.0 82 0 40 0.25 104 0)
translateLabel: true
adjust: right
)
(SequenceViewSpec
name: 'List2'
layout: (LayoutFrame 44 0.25 82 0 0 1 180 0)
tabable: true
model: selectedPerStoreModuleRoot
hasHorizontalScrollBar: true
hasVerticalScrollBar: true
miniScrollerHorizontal: true
useIndex: false
sequenceList: listOfModules
)
(LabelSpec
label: 'Module:'
name: 'perModuleModuleLabel'
layout: (LayoutFrame 0 0.0 186 0 40 0.25 203 0)
translateLabel: true
adjust: right
)
(InputFieldSpec
name: 'perModuleModuleEntryField'
layout: (LayoutFrame 44 0.25 182 0 0 1 204 0)
tabable: true
model: perStoreModuleRoot
acceptChannel: acceptChannel
acceptOnPointerLeave: true
)
(LabelSpec
label: 'DB:'
name: 'perModuleDBLabel'
layout: (LayoutFrame 0 0.0 211 0 40 0.25 228 0)
translateLabel: true
adjust: right
)
(ComboBoxSpec
name: 'perModuleModuleHostComboBox2'
layout: (LayoutFrame 44 0.25 207 0 0 1 229 0)
tabable: true
model: perStoreModuleHostnameHolder
immediateAccept: true
acceptOnLeave: true
acceptOnReturn: true
acceptOnTab: true
acceptOnLostFocus: true
acceptChannel: acceptChannel
acceptOnPointerLeave: true
comboList: storeHostPrototypeList
)
(LabelSpec
label: 'User / Password:'
name: 'perModuleUserPasswordLabel'
layout: (LayoutFrame 0 0.0 236 0 40 0.25 253 0)
translateLabel: true
adjust: right
)
(InputFieldSpec
name: 'perModuleUserEntryField'
layout: (LayoutFrame 44 0.25 232 0 -2 0.65 254 0)
tabable: true
model: perStoreModuleUsernameHolder
acceptChannel: acceptChannel
acceptOnPointerLeave: true
)
(InputFieldSpec
name: 'perModulePasswordEntryField'
layout: (LayoutFrame 5 0.65 232 0 0 1 254 0)
tabable: true
model: perStoreModulePasswordHolder
type: password
acceptChannel: acceptChannel
acceptOnPointerLeave: true
)
(HorizontalPanelViewSpec
name: 'HorizontalPanel5'
layout: (LayoutFrame 44 0.25 -25 1 -10 0.65 6 1)
horizontalLayout: fit
verticalLayout: center
horizontalSpace: 3
verticalSpace: 3
component:
(SpecCollection
collection: (
(ActionButtonSpec
label: 'Add/Apply'
name: 'AddButton2'
translateLabel: true
tabable: true
model: addPerStoreModuleDB
extent: (Point 96 22)
)
(ActionButtonSpec
label: 'Remove'
name: 'RemoveButton3'
translateLabel: true
tabable: true
model: removePerStoreModuleDB
enableChannel: removeEnabled
extent: (Point 97 22)
)
)
)
)
(HorizontalPanelViewSpec
name: 'HorizontalPanel6'
layout: (LayoutFrame 10 0.65 -25 1 0 1 6 1)
horizontalLayout: fit
verticalLayout: center
horizontalSpace: 3
verticalSpace: 3
component:
(SpecCollection
collection: (
(ActionButtonSpec
label: 'Try to Connect'
name: 'ConnectPerStoreModuleButton'
translateLabel: true
tabable: true
model: connectPerStoreModuleDB
enableChannel: storeConnectInModuleEnabled
extent: (Point 103 22)
)
(ActionButtonSpec
label: 'Browse'
name: 'BrowsePerStoreModuleButton'
translateLabel: true
tabable: true
model: browsePerStoreModuleDB
enableChannel: storeConnectInModuleEnabled
extent: (Point 103 22)
)
)
)
)
)
)
)
)
)
extent: (Point 659 327)
)
(FramedBoxSpec
label: 'Source Cache'
name: 'FramedBox1'
labelPosition: topLeft
translateLabel: true
component:
(SpecCollection
collection: (
(ViewSpec
name: 'SourceCacheDirBox'
layout: (LayoutFrame 0 0 0 0 0 1 30 0)
component:
(SpecCollection
collection: (
(LabelSpec
label: 'Source Cache Dir:'
name: 'SourceCacheDirLabel'
layout: (LayoutFrame 0 0.0 0 0 60 0.25 22 0)
translateLabel: true
adjust: right
)
(InputFieldSpec
name: 'SourceCacheDirEntryField'
layout: (LayoutFrame 64 0.25 0 0 0 1 22 0)
enableChannel: useManager
model: sourceCacheDir
immediateAccept: false
acceptOnReturn: true
acceptOnTab: true
acceptOnLostFocus: true
acceptOnPointerLeave: true
)
)
)
)
(HorizontalPanelViewSpec
name: 'CacheActionsHorizontalPanel'
layout: (LayoutFrame 44 0.25 33 0 0 1 67 0)
horizontalLayout: fitSpace
verticalLayout: center
horizontalSpace: 3
verticalSpace: 3
component:
(SpecCollection
collection: (
(ActionButtonSpec
label: 'Flush Cache now'
name: 'FlushCacheNowButton'
translateLabel: true
tabable: true
model: flushSourceCache
enableChannel: useManager
extent: (Point 208 22)
)
(ActionButtonSpec
label: 'Condense Cache now'
name: 'CondenseCacheNowButton'
translateLabel: true
tabable: true
model: condenseSourceCache
enableChannel: useManager
extent: (Point 208 22)
)
)
)
)
)
)
extent: (Point 659 95)
)
)
)
extent: (Point 659 768)
)
)
)
)
)
)
)
! !
!StoreSourceCodeManagementSettingsAppl class methodsFor:'queries'!
managerClass
"backlink to my manager class (needed by the settings app)"
^ StoreSourceCodeManager
"Created: / 19-04-2011 / 12:48:57 / cg"
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'accessing'!
manager
^ Smalltalk at:#SourceCodeManager
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'actions'!
addModule:module withData:data
(self listOfModules includes:module) ifFalse:[
self listOfModules add:module; sort.
].
rootsPerModule at:module put:data.
self updateModifiedChannel.
"Created: / 08-11-2006 / 19:25:21 / cg"
!
basicReadSettings
self initialize.
self sourceCacheDir value:(StoreSourceCodeManager cacheDirectoryName).
"/ StoreSourceCodeManager forgetDisabledModules.
self storeHostnameHolder value: (StoreSourceCodeManager hostAndDBName).
self storeUsernameHolder value: (StoreSourceCodeManager userName).
self storePasswordHolder value: (StoreSourceCodeManager password).
(Array with:StoreSourceCodeManager) "self availableManagers" do:[:eachManager |
|infoPerModule|
infoPerModule := eachManager repositoryInfoPerModule.
infoPerModule keysAndValuesDo:[:module :info |
rootsPerModule at:module put:(Array with:eachManager with:info).
].
].
"/ self updateSelectedManager.
rootsPerModule notNil ifTrue:[
self listOfModules removeAll.
listOfModules addAll:rootsPerModule keys asList.
].
"/ self selectedPerModuleRootChanged.
"Modified: / 18-04-2011 / 18:40:40 / cg"
!
basicSaveSettings
|modules nm fn|
nm := self sourceCacheDir value.
nm notEmptyOrNil ifTrue:[
(fn := nm asFilename) exists ifFalse:[
(self confirm:('Cache directory ''' , nm , ''' does not exist\create ?' withCRs)) ifTrue:[
fn recursiveMakeDirectory;
makeReadableForAll;
makeWritableForAll;
makeExecutableForAll.
]
].
(fn isDirectory
and:[fn isReadable
and:[fn isWritable]]) ifTrue:[
StoreSourceCodeManager cacheDirectoryName:nm.
] ifFalse:[
self warn:'Invalid sourceCache directory.'
]
].
(Array with:StoreSourceCodeManager) "self availableManagers" do:[:eachManager |
|infoPerModule|
modules := rootsPerModule select:[:entry | entry first == eachManager].
infoPerModule := Dictionary new.
modules keysAndValuesDo:[:module :entry |
entry first == eachManager ifTrue:[
infoPerModule at:module put:(entry second).
].
].
eachManager repositoryInfoPerModule:infoPerModule.
].
self basicSaveStoreSettings.
self sourceCacheDir value:(StoreSourceCodeManager cacheDirectoryName).
DebugView newDebugger. "/ ???
self acceptChannel value.
"Modified: / 18-04-2011 / 18:36:42 / cg"
!
condenseSourceCache
self withWaitCursorDo:[ AbstractSourceCodeManager condenseSourceCache ].
Method flushSourceStreamCache.
"Modified: / 28-11-2006 / 12:21:33 / cg"
!
flushSourceCache
self withWaitCursorDo:[ AbstractSourceCodeManager flushSourceCache ].
"Modified: / 30-09-2011 / 13:33:55 / cg"
!
removePerModuleRoot
|module|
acceptChannel value:true.
module := self perModuleRootModule value.
self listOfModules remove:module ifAbsent:nil.
rootsPerModule removeKey:module ifAbsent:nil.
self perModuleRootModule value:nil.
self perModuleRoot value:nil.
self updateModifiedChannel.
!
setupSourceCodeManager
AbstractLauncherApplication::LauncherDialogs cvsConfigurationDialog.
manager := (Smalltalk at:#SourceCodeManager).
manager notNil ifTrue:[
repositoryHolder value: manager repositoryName.
sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName).
].
"Modified: / 16-08-2006 / 11:07:51 / cg"
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'actions - store'!
addPerStoreModuleDB
|module info|
acceptChannel value:true.
module := self perStoreModuleRoot value.
info := StoreSourceCodeManager newDBInfo.
info hostAndDBName:perStoreModuleHostnameHolder value.
info userName:perStoreModuleUsernameHolder value.
info password:perStoreModulePasswordHolder value.
self addModule:module withData:(Array with:StoreSourceCodeManager with:info).
"Modified: / 08-11-2006 / 19:27:35 / cg"
!
basicSaveStoreSettings
|storeHost|
StoreSourceCodeManager hostAndDBName:(storeHost := self storeHostnameHolder value withoutSeparators).
StoreSourceCodeManager userName:(self storeUsernameHolder value withoutSeparators).
StoreSourceCodeManager password:(self storePasswordHolder value withoutSeparators).
storeHost notEmptyOrNil ifTrue:[
StoreSourceCodeManager connectToDatabase.
].
RecentlyUsedStoreHosts isNil ifTrue:[
RecentlyUsedStoreHosts := OrderedCollection new.
].
(RecentlyUsedStoreHosts includes:storeHost) ifFalse:[
RecentlyUsedStoreHosts addFirst:storeHost.
RecentlyUsedStoreHosts size > 20 ifTrue:[
RecentlyUsedStoreHosts removeLast.
].
].
!
browsePerStoreModuleDB
|testInfo|
testInfo := StoreSourceCodeManager newDBInfo.
testInfo hostAndDBName:(perStoreModuleHostnameHolder value).
testInfo userName:(perStoreModuleUsernameHolder value).
testInfo password:(perStoreModulePasswordHolder value).
self browseStoreDB:testInfo
!
browseStoreDB:dbInfo
Tools::StoreProjectBrowser openOn:dbInfo
!
connectPerStoreModuleDB
|testInfo|
testInfo := StoreSourceCodeManager newDBInfo.
testInfo hostAndDBName:(perStoreModuleHostnameHolder value).
testInfo userName:(perStoreModuleUsernameHolder value).
testInfo password:(perStoreModulePasswordHolder value).
(self tryToConnectTo:testInfo)
!
storeConnect
|testInfo|
testInfo := StoreSourceCodeManager newDBInfo.
testInfo hostAndDBName:(storeHostnameHolder value).
testInfo userName:(storeUsernameHolder value).
testInfo password:(storePasswordHolder value).
(self tryToConnectTo:testInfo) ifTrue:[
LastStoreHost := storeHostnameHolder value.
LastStoreUser := storeUsernameHolder value.
LastStorePassword := storePasswordHolder value.
].
!
tryToConnectTo:dbInfo
|session|
SQL::SQLError handle:[:ex |
self warn:('Failed to connect to Database:\\' withCRs,ex description).
^ false.
] do:[
self withWaitCursorDo:[
session := StoreSourceCodeManager tryToConnectToDatabase:dbInfo.
]
].
session isNil ifTrue:[
self warn:'OOPS - Failed to connect'.
^ false.
].
self information:('Successfully connected to ',dbInfo dbName,'.').
session disconnect.
^ true
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'aspects'!
acceptChannel
acceptChannel isNil ifTrue:[
acceptChannel := TriggerValue new.
].
^ acceptChannel.
!
checkClassesWhenCheckingIn
checkClassesWhenCheckingIn isNil ifTrue:[
checkClassesWhenCheckingIn := (currentUserPrefs at:#checkClassesWhenCheckingIn ifAbsent:true) asValue.
checkClassesWhenCheckingIn onChangeSend:#updateModifiedChannel to:self
].
^ checkClassesWhenCheckingIn.
!
keepMethodSource
keepMethodSource isNil ifTrue:[
keepMethodSource := ValueHolder new.
keepMethodSource onChangeSend:#updateModifiedChannel to:self
].
^ keepMethodSource.
!
listOfModules
listOfModules isNil ifTrue:[
rootsPerModule notNil ifTrue:[
listOfModules := rootsPerModule keys asList.
].
listOfModules sort.
listOfModules onChangeSend:#updateModifiedChannel to:self
].
^ listOfModules.
!
localSourceFirst
localSourceFirst isNil ifTrue:[
localSourceFirst := ValueHolder new.
localSourceFirst onChangeSend:#updateModifiedChannel to:self
].
^ localSourceFirst.
!
managerIsCVSSourceCodeManager
managerIsCVSSourceCodeManager isNil ifTrue:[
managerIsCVSSourceCodeManager := (SourceCodeManager notNil and:
[SourceCodeManager isCVS]) asValue.
].
^ managerIsCVSSourceCodeManager.
"Created: / 16-08-2006 / 10:56:38 / cg"
!
managerIsSmallTeamSourceCodeManager
managerIsSmallTeamSourceCodeManager isNil ifTrue:[
managerIsSmallTeamSourceCodeManager := (SourceCodeManager notNil and:
[SourceCodeManager isSmallTeam]) asValue.
].
^ managerIsSmallTeamSourceCodeManager.
"Created: / 09-11-2006 / 14:33:53 / cg"
!
managerIsStoreSourceCodeManager
managerIsStoreSourceCodeManager isNil ifTrue:[
managerIsStoreSourceCodeManager := (SourceCodeManager notNil and:
[SourceCodeManager isStore]) asValue.
].
^ managerIsStoreSourceCodeManager.
"Created: / 16-08-2006 / 10:57:13 / cg"
!
perModuleFieldsEnableHolder
perModuleFieldsEnableHolder isNil ifTrue:[
perModuleFieldsEnableHolder := true asValue.
perModuleFieldsEnableHolder addDependent:self.
].
^ perModuleFieldsEnableHolder.
!
perModuleRoot
perModuleRoot isNil ifTrue:[
perModuleRoot := ValueHolder new.
perModuleRoot addDependent:self.
].
^ perModuleRoot.
!
perModuleRootModule
perModuleRootModule isNil ifTrue:[
perModuleRootModule := ValueHolder new.
].
^ perModuleRootModule.
!
perStoreModuleFieldsEnableHolder
perSmallTeamModuleFieldsEnableHolder isNil ifTrue:[
perSmallTeamModuleFieldsEnableHolder := true asValue.
perSmallTeamModuleFieldsEnableHolder addDependent:self.
].
^ perSmallTeamModuleFieldsEnableHolder.
!
perStoreModuleHostnameHolder
perStoreModuleHostnameHolder isNil ifTrue:[
perStoreModuleHostnameHolder := '' asValue.
perStoreModuleHostnameHolder addDependent:self.
].
^ perStoreModuleHostnameHolder.
!
perStoreModulePasswordHolder
perStoreModulePasswordHolder isNil ifTrue:[
perStoreModulePasswordHolder := '' asValue.
perStoreModulePasswordHolder addDependent:self.
].
^ perStoreModulePasswordHolder.
!
perStoreModuleRoot
perStoreModuleRoot isNil ifTrue:[
perStoreModuleRoot := ValueHolder new.
perStoreModuleRoot addDependent:self.
].
^ perStoreModuleRoot.
!
perStoreModuleRootModule
perStoreModuleRootModule isNil ifTrue:[
perStoreModuleRootModule := ValueHolder new.
].
^ perStoreModuleRootModule.
!
perStoreModuleUsernameHolder
perStoreModuleUsernameHolder isNil ifTrue:[
perStoreModuleUsernameHolder := '' asValue.
perStoreModuleUsernameHolder addDependent:self.
].
^ perStoreModuleUsernameHolder.
!
removeEnabled
removeEnabled isNil ifTrue:[
removeEnabled := false asValue.
].
^ removeEnabled.
!
selectedPerModuleRoot
selectedPerModuleRoot isNil ifTrue:[
selectedPerModuleRoot := ValueHolder new.
selectedPerModuleRoot addDependent:self.
].
^ selectedPerModuleRoot.
!
selectedPerStoreModuleRoot
selectedPerStoreModuleRoot isNil ifTrue:[
selectedPerStoreModuleRoot := ValueHolder new.
selectedPerStoreModuleRoot addDependent:self.
].
^ selectedPerStoreModuleRoot.
!
sourceCacheDir
sourceCacheDir isNil ifTrue:[
sourceCacheDir := ValueHolder new.
sourceCacheDir onChangeSend:#updateModifiedChannel to:self
].
^ sourceCacheDir.
!
storeConnectEnabled
storeConnectEnabled isNil ifTrue:[
storeConnectEnabled := false asValue.
].
^ storeConnectEnabled.
!
storeConnectInModuleEnabled
storeConnectInModuleEnabled isNil ifTrue:[
storeConnectInModuleEnabled := false asValue.
].
^ storeConnectInModuleEnabled.
!
storeHostPrototypeList
|prototypeList|
storeHostPrototypeList isNil ifTrue:[
prototypeList := OrderedSet new.
prototypeList add:('public@store.smalltalk-x.de:5432').
prototypeList add:('public').
prototypeList add:('stx').
OperatingSystem getLoginName = 'cg' ifTrue:[
prototypeList add:('oyster@store.smalltalk-x.de:5432').
prototypeList add:('oyster').
].
OperatingSystem getDomainName = 'exept.de' ifTrue:[
prototypeList add:('stx@exept.exept.de:5432').
] ifFalse:[
prototypeList add:('db@host').
prototypeList add:('db@host:port').
].
storeHostPrototypeList := prototypeList asOrderedCollection.
].
^ storeHostPrototypeList.
!
storeHostnameHolder
storeHostnameHolder isNil ifTrue:[
storeHostnameHolder := ("LastStoreHost ?" '') asValue.
storeHostnameHolder addDependent:self.
].
^ storeHostnameHolder.
!
storeLoginEnabled
storeLoginEnabled isNil ifTrue:[
storeLoginEnabled := false asValue.
].
^ storeLoginEnabled.
"Created: / 16-08-2006 / 11:11:15 / cg"
!
storePasswordHolder
storePasswordHolder isNil ifTrue:[
storePasswordHolder := ("LastStorePassword ?" '') asValue.
storePasswordHolder addDependent:self.
].
^ storePasswordHolder.
!
storeUsernameHolder
storeUsernameHolder isNil ifTrue:[
storeUsernameHolder := ("LastStoreUser ?" '') asValue.
storeUsernameHolder addDependent:self.
].
^ storeUsernameHolder.
!
useManager
useManager isNil ifTrue:[
useManager := ValueHolder new.
useManager onChangeSend:#updateModifiedChannel to:self
].
^ useManager.
!
verboseSourceCodeAccess
verboseSourceCodeAccess isNil ifTrue:[
verboseSourceCodeAccess := false asValue.
verboseSourceCodeAccess onChangeSend:#updateModifiedChannel to:self
].
^ verboseSourceCodeAccess.
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'change & update'!
selectedPerModuleRootChanged
|module entry|
self acceptChannel value:true.
module := self selectedPerModuleRoot value.
module isNil ifTrue:[
self removeEnabled value:false.
self perModuleRootModule value:' '.
self perModuleRoot value:''.
^ self
].
entry := rootsPerModule at:module ifAbsent:#().
(entry first = CVSSourceCodeManager) ifTrue:[
self removeEnabled value:true.
self perModuleRootModule value:module.
self perModuleRoot value:(entry at:2).
] ifFalse:[
self removeEnabled value:false.
self perModuleRootModule value:module , ' ',('<<use ',entry first managerTypeName,'>>') allBold.
self perModuleRoot value:''.
].
!
selectedPerStoreModuleRootChanged
|module entry|
self acceptChannel value:true.
module := self selectedPerStoreModuleRoot value.
module isNil ifTrue:[
self removeEnabled value:false.
self perStoreModuleRoot value:''.
self perStoreModuleHostnameHolder value:''.
self perStoreModuleUsernameHolder value:''.
self perStoreModulePasswordHolder value:''.
^ self
].
entry := rootsPerModule at:module ifAbsent:#().
(entry first = StoreSourceCodeManager) ifTrue:[
self removeEnabled value:true.
self perStoreModuleRoot value:module.
self perStoreModuleHostnameHolder value:(entry at:2) hostAndDBName.
self perStoreModuleUsernameHolder value:(entry at:2) userName.
self perStoreModulePasswordHolder value:(entry at:2) password.
] ifFalse:[
self removeEnabled value:false.
self perStoreModuleRoot value:module , ' ',('<<use ',entry first managerTypeName,'>>') allBold.
self perStoreModuleHostnameHolder value:''.
self perStoreModuleUsernameHolder value:''.
self perStoreModulePasswordHolder value:''.
].
!
sourceDirChanged
|nm fn previousDir|
manager isNil ifTrue:[^ self].
previousDir := AbstractSourceCodeManager cacheDirectoryName.
nm := self sourceCacheDir value.
nm isEmptyOrNil ifTrue:[^ self].
(fn := nm asFilename) exists ifFalse:[
(self confirm:(resources
stringWithCRs:'SourceCache directory "%1" does not exist.\Create ?'
with:nm)
) ifFalse:[
self sourceCacheDir value:previousDir.
^ self.
].
fn
recursiveMakeDirectory;
makeReadableForAll;
makeWritableForAll;
makeExecutableForAll.
^ self.
].
(fn isDirectory) ifFalse:[
self warn:(resources
stringWithCRs:'Not a directory: "%1"'
with:nm).
self sourceCacheDir value:previousDir.
^ self.
].
(fn isReadable and:[fn isWritable]) ifFalse:[
(self confirm:(resources
stringWithCRs:'SourceCache directory "%1" is not both readable and writable.\Change ?'
with:nm)
) ifFalse:[
self sourceCacheDir value:previousDir.
^ self.
].
fn
makeReadableForAll;
makeWritableForAll;
makeExecutableForAll.
].
"/ (fn isReadableForAll and:[fn isWritableForAll]) ifFalse:[
"/ (self confirm:(resources
"/ stringWithCRs:'SourceCache directory "%1" is not both readable and writable for other users.\Change ?'
"/ with:nm)
"/ ) ifTrue:[
"/ fn
"/ makeReadableForAll;
"/ makeWritableForAll;
"/ makeExecutableForAll.
"/ ]
"/ ].
!
update:something with:aParameter from:changedObject
"/ common
changedObject == sourceCacheDir ifTrue:[
self sourceDirChanged.
self updateModifiedChannel.
^ self
].
"/ store
changedObject == storeHostnameHolder ifTrue:[
self updateConnectEnableHolders.
^ self
].
changedObject == storeUsernameHolder ifTrue:[
self updateConnectEnableHolders.
^ self
].
changedObject == storePasswordHolder ifTrue:[
self updateConnectEnableHolders.
^ self
].
changedObject == perStoreModuleRoot ifTrue:[
self updateConnectEnableHolders.
^ self
].
changedObject == perStoreModuleHostnameHolder ifTrue:[
self updateConnectEnableHolders.
^ self
].
changedObject == perStoreModuleUsernameHolder ifTrue:[
self updateConnectEnableHolders.
^ self
].
changedObject == perStoreModulePasswordHolder ifTrue:[
self updateConnectEnableHolders.
^ self
].
changedObject == selectedPerStoreModuleRoot ifTrue:[
self selectedPerStoreModuleRootChanged.
^ self
].
super update:something with:aParameter from:changedObject
"Modified: / 18-04-2011 / 18:17:14 / cg"
!
updateConnectEnableHolders
self storeConnectEnabled
value:(storeHostnameHolder value notEmptyOrNil
and:[ storeUsernameHolder value notEmptyOrNil
and:[ storePasswordHolder value notEmptyOrNil ]]).
self storeConnectInModuleEnabled
value:(perStoreModuleHostnameHolder value notEmptyOrNil
and:[ perStoreModuleUsernameHolder value notEmptyOrNil
and:[ perStoreModulePasswordHolder value notEmptyOrNil ]]).
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'help'!
helpFilename
^ 'Launcher/storeDBSetup.html'
"Modified: / 05-08-2011 / 09:20:28 / cg"
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'initialization & release'!
initialize
(AbstractSourceCodeManager notNil) ifTrue:[ AbstractSourceCodeManager autoload ].
useManager := false asValue.
useManager onChangeSend:#updateModifiedChannel to:self.
sourceCacheDir := nil asValue.
sourceCacheDir addDependent:self.
repositoryHolder := '' asValue.
rootsPerModule := Dictionary new.
(Array with:StoreSourceCodeManager) "self availableManagers" do:[:eachManager |
eachManager repositoryInfoPerModule
keysAndValuesDo:[:module :info |
module withoutSeparators ~= module ifTrue:[
self halt:'should not happen any longer'
].
rootsPerModule at:module put:(Array with:eachManager with:info)
].
].
super initialize.
"Modified: / 18-04-2011 / 18:38:02 / cg"
! !
!StoreSourceCodeManagementSettingsAppl methodsFor:'queries'!
cvsRootFromCVSRootFileOrNil
|cvsDir cvsRootFile cvsRoot|
cvsDir := 'CVS' asFilename.
cvsDir isDirectory ifTrue:[
cvsRootFile := cvsDir construct:'Root'.
cvsRootFile isReadable ifTrue:[
cvsRoot := cvsRootFile contents firstIfEmpty:nil.
].
].
^ cvsRoot
!
hasManager
"true if ANY source code management class is available"
^ AbstractSourceCodeManager notNil and:[AbstractSourceCodeManager isLoaded]
!
hasUnsavedChanges
((StoreSourceCodeManager cacheDirectoryName ? '') ~= (self sourceCacheDir value ? '')) ifTrue:[^ true].
(Array with:StoreSourceCodeManager) "self availableManagers" do:[:mgr |
|modules|
modules := rootsPerModule select:[:entry | entry first == mgr].
mgr repositoryInfoPerModule keysAndValuesDo:[:module :info |
((modules includesKey:module) and:[info = (modules at:module) second])
ifFalse:[^ true].
].
modules keysAndValuesDo:[:module :info|
((mgr repositoryInfoPerModule includesKey:module) and:[(mgr repositoryInfoPerModule at:module) = info second])
ifFalse:[^ true].
].
].
((StoreSourceCodeManager hostAndDBName ? '') ~= (self storeHostnameHolder value ? '') withoutSeparators)
ifTrue:[^ true].
((StoreSourceCodeManager userName ? '') ~= (self storeUsernameHolder value ? '') withoutSeparators)
ifTrue:[^ true].
((StoreSourceCodeManager password ? '') ~= (self storePasswordHolder value ? '') withoutSeparators)
ifTrue:[^ true].
^ false
"Modified: / 18-04-2011 / 18:32:21 / cg"
! !
!StoreSourceCodeManagementSettingsAppl class methodsFor:'documentation'!
version_CVS
^ '$Header: /cvs/stx/stx/libtool/StoreSourceCodeManagementSettingsAppl.st,v 1.6 2011-09-30 11:34:21 cg Exp $'
!
version_SVN
^ '§Id§'
! !