26
Pharo Sources in Git: a Strawman Dale Henrichs Dr. Metacello Nov. 2, 2016

Pharo sources in git

Embed Size (px)

Citation preview

Page 1: Pharo sources in git

Pharo Sources in Git: a Strawman

Dale Henrichs Dr. Metacello Nov. 2, 2016

Page 2: Pharo sources in git

Pharo Kernel Image• 1 git repo for all kernel packages

• all packages same version

• tags for releases

• BaselineOfPharoKernel

• developers use it to update to latest kernel version

• and manage their own PharoKernel clone

• bugfixes and private extensions

Page 3: Pharo sources in git

Pharo Dev Image• Assume that pharo dev image is built upon the minimal core

• Multiple git repos: 1 per independent functional unit

• one BaselineOfPharoDev that collects together the component projects used to construct the Pharo Dev Image

• PharoKernel project referenced by tag pattern: `v7.?` which matches all tags in PharoKernel repository starting with `7.`

• Similar tag name schemes used for other component projects

• maintain Pharo fork of projects that are not owned by Pharo team:

• Metacello, FileTree, etc.

Page 4: Pharo sources in git

Pharo kernel [60d52c5]

Git repository structure at image build time

[SHA]

ImageGitHub

Pharo kernel

Pharo dev

Metacello

git-cache

Pharo dev [f5e8170]

Metacello [48f1da1]

W E B

Page 5: Pharo sources in git

Freshly downloaded image needs to be properly connected to project

repos for development

ImageGitHub

Pharo kernel

Pharo dev

Metacello

git-cache

W E B

?• similar problem exists today — Monticello packages

reference the Pharo repo (where package loaded from) not the original development repo

Page 6: Pharo sources in git

ImagePharo kernel [60d52c5]

Pharo dev [f5e8170]

Metacello [48f1da1]

Metacello records SHA of commit at load time and current repo, but not original

download repo

GitHub

Pharo kernel

Pharo dev

Metacello

W E B

Pharo kernel [60d52c5]

git-cache

Pharo dev [f5e8170]

Metacello [48f1da1]

Page 7: Pharo sources in git

Connecting to proper repo involves executing the following chunks of code

clone/lock/rehome (roughly based on tODE implementation)

Page 8: Pharo sources in git

local image connection complete

ImagePharo kernel [60d52c5]

GitHub

Pharo kernel

Pharo dev

Metacello

…/shared

Pharo kernel [1f3f58a]

W E B

Page 9: Pharo sources in git

NOTE: image SHA doesn’t match cloned SHA

ImagePharo kernel [60d52c5]

GitHub

Pharo kernel

Pharo dev

Metacello

…/shared

Pharo kernel [1f3f58a]

W E B

Page 10: Pharo sources in git

• ‘version skew’ is not in and of itself a problem … but tools are needed to inform user of the issue

• image state is preserved correctly — visual reminder that image SHA does not match clone SHA

• once the repo is connected

• the developer can checkout the SHA that matches image

• or, load the latest version …

Common Occurrence

Page 11: Pharo sources in git

tODE Project List, showing version skew

• tool makes it obvious that there is a potential problem

Page 12: Pharo sources in git

tODE Project List menu

• `skew diff` and `skew save` menu items support for handling version skew

Page 13: Pharo sources in git

How does the clone tool know what to clone?

(Metacello only records SHA)

• in tODE I use a project entry to specify what to clone and well-known repository locations: `shared` and `image` to specify where to clone

Page 14: Pharo sources in git

In tODE, project enries served up by GsDevKit_home `gh-pages`

Page 15: Pharo sources in git

For Pharo: MetacelloProjectLoadSpec

• combo of tODE project entry, SmalltalkCI SCIMetacelloLoadSpec and CatalogProject

• MetacelloProjectLoadSpec served up by catalog.pharo.org or a Pharo/Squeak/GemStone oriented server or ???

Page 16: Pharo sources in git

MetacelloProjectLoadSpec instance shipped in Pharo image

ImagePharo kernel [60d52c5]

…/shared

loadSpec[ ‘PharoKernel’, ‘git://github.com/pharo-core/PharoKernel:v7.?/src', … ] GitHub

Pharo kernel

Pharo dev

Metacello

W E B

• reference to primary project repo

Page 17: Pharo sources in git

clone/lock/rehome operation performed using MetacelloProjectLoadSpec

(repo location updated to reflect clone location)

ImagePharo kernel [60d52c5]

GitHub

Pharo kernel

Pharo dev

Metacello

…/shared

loadSpec[ ‘PharoKernel’, ‘filetree://.../shared/PharoKernel/src', … ]

Pharo kernel [1f3f58a]

W E B

Page 18: Pharo sources in git

How do multiple images share repos (load specs)?

ImageGitHub

Pharo kernel

Pharo dev

Metacello

…/shared

Image Image

? ?Pharo kernel

W E B

loadSpec[]

Page 19: Pharo sources in git

How do multiple images share repos (load specs)?

ImageGitHub

Pharo kernel

Pharo dev

Metacello

…/shared

Image Image

Pharo kernel

W E B

Pharo kernel.ston

…/projects

loadSpec[] loadSpec[]loadSpec[]

• load spec STON file written to disk in /…/projects dir

• disk version of load spec object shared by all images

Page 20: Pharo sources in git

How to manage forked projects

ImagePharo kernel [60d52c5]

GitHub

Pharo kernel

Pharo dev

Metacello

Pharo fork

loadSpec[ ‘PharoKernel’, ‘git://github.com/pharo-core/PharoKernel:v7.?/src', … ]

GitHub/YOU

W E B

…/shared…/projects

Page 21: Pharo sources in git

How to manage forked projects —edit load spec to reference fork—

—save to disk—

ImagePharo kernel [60d52c5]

GitHub

Pharo kernel

Pharo dev

Metacello

Pharo fork

loadSpec[ ‘PharoKernel’, ‘git://github.com/YOU/PharoFork:master/src', … ]

GitHub/YOU

W E B

…/shared

Pharo fork.ston

…/projects

Page 22: Pharo sources in git

How to manage forked projects —clone/lock/rehome/share—

ImagePharo kernel [60d52c5]

GitHub

Pharo kernel

Pharo dev

Metacello

Pharo fork

loadSpec[ ‘PharoKernel’, ‘filetree://.../shared/PharoFork/src', … ]

GitHub/YOU

…/shared

Pharo fork [85c552c]

W E B

Pharo fork.ston

…/projects

Page 23: Pharo sources in git

Pharo kernel [1f3f58a]

Private Image Clone —edit image load spec—

—don’t save to disk—

ImagePharo kernel [60d52c5]

GitHub

Pharo kernel

Pharo dev

Metacello

Pharo fork

loadSpec[ ‘PharoKernel’, ‘filetree://.../shared/PharoKernel/src', … ]

GitHub/YOU

…/shared

Pharo fork [85c552c]Pharo fork.ston

…/projects

W E B

Page 24: Pharo sources in git

Full Picture

Image

…/shared

Image Image

Pharo fork

Pharo fork.ston

…/projects

Metacello.ston

Pharo dev.ston

loadSpec[] loadSpec[]loadSpec[]

catalog.pharo.org

GitHub

Pharo kernel

Pharo dev

Metacello

Pharo fork

GitHub/YOUPharo

kernel.stonPharo kernel

W E B

Page 25: Pharo sources in git

General Caveats: Don’ts

• git submodules and git subtrees are not as flexible as Metacello project dependencies, so they are not needed

• Don’t put different platforms/releases on different branches

• FileTree is the anti-pattern and I wouldn’t do that again

• requires ‘cherry-picking’ to share common code between branches

• use platform-specific packages in concert with platform-common packages so that common and platform code can be kept in sync common changes

Page 26: Pharo sources in git

General Caveats: Dos

• Do use continuous release model as much as possible

• as long as there are no API breaking changes latest commit on `master` branch is the RELEASE

• used by Metacello where I have by design avoided API breaking changes for ~7 years

• Use tags based on Semantic Versioning when API breaking changes cannot be avoided

• use the tag pattern matching in Metacello repository URL for referencing range of versions

• could easily introduce new syntax in Metacello `git:` URL that specifies ranges of versions

• clone of git repo using a tag leaves the clone without a branch —commit disallowed until branch assigned