diff --git a/Iceberg-Libgit/IceGitCommit.class.st b/Iceberg-Libgit/IceGitCommit.class.st index 6526a8ef3c..a305221edf 100644 --- a/Iceberg-Libgit/IceGitCommit.class.st +++ b/Iceberg-Libgit/IceGitCommit.class.st @@ -7,7 +7,8 @@ Class { 'datetime', 'ancestorIds', 'comment', - 'packageNamesCache' + 'packageNamesCache', + 'projectCache' ], #category : 'Iceberg-Libgit-Core', #package : 'Iceberg-Libgit', @@ -181,7 +182,8 @@ IceGitCommit >> project [ This is a quick fix of the issue for Pharo 7 release." - ^ [ IceProjectReader readProjectFrom: self ] + projectCache ifNotNil: [ ^ projectCache ]. + ^ [ projectCache := IceProjectReader readProjectFrom: self ] on: NotFound do: [ self repository fetch. IceProjectReader readProjectFrom: self ] ] diff --git a/Iceberg-Libgit/IceLibgitRepository.class.st b/Iceberg-Libgit/IceLibgitRepository.class.st index 2f77b9105a..cc3abdd291 100644 --- a/Iceberg-Libgit/IceLibgitRepository.class.st +++ b/Iceberg-Libgit/IceLibgitRepository.class.st @@ -707,10 +707,11 @@ IceLibgitRepository >> packageLocationFor: anIceSavedPackage [ ] { #category : 'private - tags' } -IceLibgitRepository >> peelTag: anIceTag [ - self handleLibgitError: [ | lgitRef | - lgitRef := (self repositoryHandle lookup: 'refs/tags/', anIceTag name). - ^ self lookupCommit: lgitRef targetId hexString ] +IceLibgitRepository >> peelTag: anIceTag [ + + | id | + id := self tagTargetCommitId: anIceTag. + self handleLibgitError: [ ^ self lookupCommit: id ] ] { #category : 'API - project' } @@ -866,6 +867,16 @@ IceLibgitRepository >> subdirectoryReference [ ^ self location resolve: self subdirectoryPath ] +{ #category : 'private - tags' } +IceLibgitRepository >> tagTargetCommitId: anIceTag [ + + self handleLibgitError: [ + | lgitRef | + lgitRef := self repositoryHandle lookup: + 'refs/tags/' , anIceTag name. + ^ lgitRef targetId hexString ] +] + { #category : 'API - tags' } IceLibgitRepository >> tags [ self handleLibgitError: [ diff --git a/Iceberg-TipUI/IceTipRepositoryGroupPanel.class.st b/Iceberg-TipUI/IceTipRepositoryGroupPanel.class.st index 9a4af4a31c..955f58afbe 100644 --- a/Iceberg-TipUI/IceTipRepositoryGroupPanel.class.st +++ b/Iceberg-TipUI/IceTipRepositoryGroupPanel.class.st @@ -98,7 +98,8 @@ IceTipRepositoryGroupPanel >> initializeRepositoryList [ beResizable; addColumn: (SpStringTableColumn new title: 'Repositories'; - evaluated: #description; + evaluated: [ :x | x description ]; + formatted: [ :each | each descriptionString ]; displayColor: [ :each | each descriptionDecorator color ]; displayBold: [ :each | each descriptionDecorator isBold ]; displayItalic: [ :each | each descriptionDecorator isItalic ]; @@ -107,7 +108,8 @@ IceTipRepositoryGroupPanel >> initializeRepositoryList [ yourself); addColumn: (SpStringTableColumn new title: 'Status'; - evaluated: #status; + evaluated: [ :x | x status ]; + formatted: [ :each | each statusString ]; displayColor: [ :each | each statusDecorator color ]; displayBold: [ :each | each statusDecorator isBold ]; displayItalic: [ :each | each statusDecorator isItalic ]; @@ -116,7 +118,8 @@ IceTipRepositoryGroupPanel >> initializeRepositoryList [ yourself); addColumn: (SpStringTableColumn new title: 'Branch'; - evaluated: #branchName; + evaluated: [ :x | x status ]; + formatted: [ :each | each branchName ]; yourself); actions: self selectionCommandsGroup; activateOnDoubleClick; diff --git a/Iceberg-TipUI/IceTipRepositoryModel.class.st b/Iceberg-TipUI/IceTipRepositoryModel.class.st index 8bae26ba57..67c9a5bcbd 100644 --- a/Iceberg-TipUI/IceTipRepositoryModel.class.st +++ b/Iceberg-TipUI/IceTipRepositoryModel.class.st @@ -100,20 +100,8 @@ IceTipRepositoryModel >> createSourceDirectory [ { #category : 'accessing' } IceTipRepositoryModel >> description [ - | text | - - text := self displayString. - (self isLibGitAvailable and: [ self entity isModified ]) - ifTrue: [ text := '*', text ]. - ^ text -] - -{ #category : 'accessing' } -IceTipRepositoryModel >> descriptionDecorator [ - (self isLibGitAvailable and: [ self entity isModified ]) - ifTrue: [ ^ IceTipDescriptionDecorator modified ]. - ^ super descriptionDecorator + ^ IceTipRepositoryStatusModel on: self ] { #category : 'testing' } @@ -431,100 +419,8 @@ IceTipRepositoryModel >> shortCommitId [ { #category : 'accessing' } IceTipRepositoryModel >> status [ - [ - | status incoming outgoing | - - self verifyDirectoryStructureIfMissing: [ :message | ^ message asString ]. - self isLibGitAvailable ifFalse: [ ^ 'Unknown (No libgit2)' ]. - - entity workingCopy workingCopyState isUnknownCommitState - ifTrue: [ ^ entity workingCopy workingCopyState description ]. - entity workingCopy isDetached - ifTrue: [ ^ 'Detached Working Copy' ]. - (entity head isDetached and: [ entity head tags isNotEmpty ]) - ifTrue: [ ^ 'Detached HEAD' ]. - entity head isDetached - ifTrue: [ ^ 'Detached HEAD' ]. - - entity workingCopy project isUnborn - ifTrue: [ ^ 'No Project Found' ]. - - self isLoaded ifFalse: [ ^ 'Not loaded' ]. - - status := OrderedCollection new. - entity isModified ifTrue: [ status add: 'Uncommitted changes' ]. - - incoming := self incomingCommits size. - incoming > 0 ifTrue: [ status add: ('{1} incoming' format: { incoming })]. - - outgoing := self outgoingCommits size. - outgoing > 0 ifTrue: [ status add: ('{1} not published' format: { outgoing })]. - - status ifEmpty: [ status add: 'Up to date' ]. - - ^ ', ' join: status ] - on: Error - do: [ :e | ^ e description ] -] - -{ #category : 'accessing' } -IceTipRepositoryModel >> statusDecorator [ - - [ - self entity isMissing - ifTrue: [ ^ IceTipStatusDecorator error ]. - entity workingCopy workingCopyState isUnknownCommitState - ifTrue: [ ^ IceTipStatusDecorator error ]. - entity workingCopy isDetached - ifTrue: [ ^ IceTipStatusDecorator error ]. - (entity head isDetached and: [ entity head tags isNotEmpty ]) - ifTrue: [ ^ IceTipStatusDecorator warning ]. - entity head isDetached - ifTrue: [ ^ IceTipStatusDecorator error ]. - entity workingCopy project isUnborn - ifTrue: [ ^ IceTipStatusDecorator error ] - ] - on: Error - do: [ :e | ^ IceTipStatusDecorator error ]. - ^ IceTipStatusDecorator none -] - -{ #category : 'accessing' } -IceTipRepositoryModel >> statusString [ - [ - | status incoming outgoing | - - self verifyDirectoryStructureIfMissing: [ :message | ^ message asString ]. - - entity workingCopy workingCopyState isUnknownCommitState - ifTrue: [ ^ entity workingCopy workingCopyState description ]. - entity workingCopy isDetached - ifTrue: [ ^ 'Detached Working Copy' ]. - (entity head isDetached and: [ entity head tags isNotEmpty ]) - ifTrue: [ ^ 'Detached HEAD' ]. - entity head isDetached - ifTrue: [ ^ 'Detached HEAD' ]. - - entity workingCopy project isUnborn - ifTrue: [ ^ 'No Project Found' ]. - - self isLoaded ifFalse: [ ^ 'Not loaded' ]. - - status := OrderedCollection new. - entity isModified ifTrue: [ status add: 'Uncommitted changes' ]. - - incoming := self incomingCommits size. - incoming > 0 ifTrue: [ status add: ('{1} incoming' format: { incoming })]. - - outgoing := self outgoingCommits size. - outgoing > 0 ifTrue: [ status add: ('{1} not published' format: { outgoing })]. - - status ifEmpty: [ status add: 'Up to date' ]. - - ^ ', ' join: status ] - on: Error - do: [ :e | ^ e description ] + ^ IceTipRepositoryStatusModel on: self ] { #category : 'accessing' } diff --git a/Iceberg-TipUI/IceTipRepositoryStatusModel.class.st b/Iceberg-TipUI/IceTipRepositoryStatusModel.class.st new file mode 100644 index 0000000000..f4de767226 --- /dev/null +++ b/Iceberg-TipUI/IceTipRepositoryStatusModel.class.st @@ -0,0 +1,171 @@ +" +I represent the status of a repository at a given time to be shown. I cache all results to avoid multiple lookups. +" +Class { + #name : 'IceTipRepositoryStatusModel', + #superclass : 'IceTipModel', + #instVars : [ + 'repositoryModel', + 'head', + 'isMissing', + 'workingCopy', + 'isDetached', + 'isModified', + 'project', + 'workingCopyState' + ], + #category : 'Iceberg-TipUI-Model', + #package : 'Iceberg-TipUI', + #tag : 'Model' +} + +{ #category : 'instance creation' } +IceTipRepositoryStatusModel class >> on: aRepositoryModel [ + + ^ self new + repositoryModel: aRepositoryModel; + yourself +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> branchName [ + + (repositoryModel isLibGitAvailable not or: [ self isMissing ]) + ifTrue: [ ^ repositoryModel class unknownBranchLabel ]. + + ^ self head description +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> descriptionDecorator [ + + (repositoryModel isLibGitAvailable and: [ self isRepositoryModified ]) + ifTrue: [ ^ IceTipDescriptionDecorator modified ]. + ^ IceTipTextDecorator none +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> descriptionString [ + | text | + + text := repositoryModel displayString. + (repositoryModel isLibGitAvailable and: [ self isRepositoryModified ]) + ifTrue: [ text := '*', text ]. + ^ text +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> entity [ + + ^ repositoryModel entity +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> head [ + + ^ head ifNil: [ head := self entity head ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> isDetached [ + + ^ isDetached ifNil: [ isDetached := self workingCopy isDetached ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> isMissing [ + + ^ isMissing ifNil: [ isMissing := self entity isMissing ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> isModified [ + + ^ isModified ifNil: [ isModified := self workingCopy isModified ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> isRepositoryModified [ + + ^ isModified ifNil: [ isModified := self entity isModified ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> project [ + + ^ project ifNil: [ project := self workingCopy project ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> repositoryModel: anIceTipRepositoryModel [ + repositoryModel := anIceTipRepositoryModel +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> statusDecorator [ + + [ + self isMissing ifTrue: [ ^ IceTipStatusDecorator error ]. + self workingCopyState isUnknownCommitState ifTrue: [ + ^ IceTipStatusDecorator error ]. + self isDetached ifTrue: [ + ^ IceTipStatusDecorator error ]. + self head isDetached ifTrue: [ ^ IceTipStatusDecorator warning ]. + self project isUnborn ifTrue: [ + ^ IceTipStatusDecorator error ] ] + on: Error + do: [ :e | ^ IceTipStatusDecorator error ]. + + ^ IceTipStatusDecorator none +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> statusString [ + + | state | + [ + | status incoming outgoing | + repositoryModel verifyDirectoryStructureIfMissing: [ :message | + ^ message asString ]. + repositoryModel isLibGitAvailable ifFalse: [ ^ 'Unknown (No libgit2)' ]. + + state := self workingCopy workingCopyState. + state isUnknownCommitState ifTrue: [ + ^ state description ]. + self isDetached ifTrue: [ ^ 'Detached Working Copy' ]. + + self head isDetached ifTrue: [ ^ 'Detached HEAD' ]. + + self project isUnborn ifTrue: [ ^ 'No Project Found' ]. + + repositoryModel isLoaded ifFalse: [ ^ 'Not loaded' ]. + + status := OrderedCollection new. + self entity isModified ifTrue: [ status add: 'Uncommitted changes' ]. + + incoming := repositoryModel incomingCommits size. + incoming > 0 ifTrue: [ + status add: ('{1} incoming' format: { incoming }) ]. + + outgoing := repositoryModel outgoingCommits size. + outgoing > 0 ifTrue: [ + status add: ('{1} not published' format: { outgoing }) ]. + + status ifEmpty: [ status add: 'Up to date' ]. + + ^ ', ' join: status ] + on: Error + do: [ :e | ^ e description ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> workingCopy [ + + ^ workingCopy ifNil: [ workingCopy := self entity workingCopy ] +] + +{ #category : 'accessing' } +IceTipRepositoryStatusModel >> workingCopyState [ + + ^ workingCopyState ifNil: [ workingCopyState := self workingCopy workingCopyState ] +] diff --git a/Iceberg-TipUI/IceTipWorkingCopyBrowser.class.st b/Iceberg-TipUI/IceTipWorkingCopyBrowser.class.st index 19588b4e96..6880acfaae 100644 --- a/Iceberg-TipUI/IceTipWorkingCopyBrowser.class.st +++ b/Iceberg-TipUI/IceTipWorkingCopyBrowser.class.st @@ -126,20 +126,20 @@ IceTipWorkingCopyBrowser >> initializePackagesTable [ packagesTable beResizable; - addColumn: (SpImageTableColumn new + addColumn: (SpImageTableColumn new beNotExpandable; evaluated: [ :aPackage | self iconFor: aPackage ]; yourself); addColumn: (SpStringTableColumn new title: 'Name'; - evaluated: #description; + formatted: #description; displayColor: [ :each | each descriptionDecorator color ]; displayBold: [ :each | each descriptionDecorator isBold ]; displayItalic: [ :each | each descriptionDecorator isItalic ]; yourself); addColumn: (SpStringTableColumn new title: 'Status'; - evaluated: #status; + formatted: #status; displayColor: [ :each | each descriptionDecorator color ]; displayBold: [ :each | each descriptionDecorator isBold ]; displayItalic: [ :each | each descriptionDecorator isItalic ]; diff --git a/Iceberg-TipUI/IceTipWorkingCopyStatusBarPresenter.class.st b/Iceberg-TipUI/IceTipWorkingCopyStatusBarPresenter.class.st index 8cbcf3dfce..768f42be0f 100644 --- a/Iceberg-TipUI/IceTipWorkingCopyStatusBarPresenter.class.st +++ b/Iceberg-TipUI/IceTipWorkingCopyStatusBarPresenter.class.st @@ -44,14 +44,16 @@ IceTipWorkingCopyStatusBarPresenter >> initializePresenters [ IceTipWorkingCopyStatusBarPresenter >> model: aModel [ "Fill labels from a IceTipWorkingCopyModel." + | status | aModel shortCommitId ifNil: [ self refreshWithoutCommitId: aModel ] ifNotNil: [ self refreshWithCommitId: aModel ]. - statusLabel - label: aModel status; - displayColor: [ :aString | aModel statusDecorator color ]; - displayBold: [ :aString | aModel statusDecorator isBold ]. + status := aModel status. + statusLabel + label: status statusString; + displayColor: [ :aString | status statusDecorator color ]; + displayBold: [ :aString | status statusDecorator isBold ] ] { #category : 'accessing' } diff --git a/Iceberg/IceCommit.class.st b/Iceberg/IceCommit.class.st index de4f23d66c..577d3938df 100644 --- a/Iceberg/IceCommit.class.st +++ b/Iceberg/IceCommit.class.st @@ -307,7 +307,7 @@ IceCommit >> status [ { #category : 'API - tags' } IceCommit >> tags [ - ^ self repository tags select: [ :each | each commit = self ] + ^ self repository tags select: [ :each | each commitId = self id ] ] { #category : 'accessing' } diff --git a/Iceberg/IceTag.class.st b/Iceberg/IceTag.class.st index e6562549ec..f982413771 100644 --- a/Iceberg/IceTag.class.st +++ b/Iceberg/IceTag.class.st @@ -23,6 +23,12 @@ IceTag >> commit [ ^ commit ifNil: [ commit := self repository peelTag: self ] ] +{ #category : 'querying' } +IceTag >> commitId [ + + ^ self repository tagTargetCommitId: self +] + { #category : 'API - tags' } IceTag >> delete [