Squot Versions Save

Squeak Object Tracker - Version control for arbitrary objects, currently with Git storage

v0.10.1

1 year ago
  • Fix incremental saving of Cypress ClassTraits
  • Regression: commit list scrolled up every few seconds again.
  • Branch list selection was not updated when changing to a different project.
  • Errors when inspecting and browsing merges from the merge dialog
  • Fixed browsing of not loaded packages from comparison or loading dialogs
  • Added help texts because of errors appearing in Squeak Trunk when the help text was nil.
  • Fix some references to undeclared names (thank you Eliot for reporting!)

v0.10.0

1 year ago

New features:

  • To save new commits in Cypress/FileTree projects is much faster now because not all files are deleted and rewritten. Only changes are written out.
  • In Tonel projects, Squeak change stamps (e. g. timestamps on methods) can be optionally stored in the method properties #300
  • Tonel package properties are now preserved in the image
  • "Revert this commit" action (like git revert) #320
  • "Tag commit" action finally implemented and added a "Browse tags" action on projects to manage tags. #375
  • Annotation pane in the save, load, merge dialogs, to see method timestamps and categories. Thank you @LinqLover! #336
  • Co-Authors button in the Save (Commit) dialog. It facilitates adding pair-programming co-workers to the commit message for attribution. Thank you @ShirleyNekoDev and @LeonBein for contributing this extension! #334
  • Automatically exclude method changes where only the timestamp of the method is different #368 #315
  • Branch and tag names are shown as [decorations] in the commit list (similar to git log --decorate=short)
  • Warn when the chosen directory for a cloning operation is not empty (possibly the wrong directory was chosen, or users were not aware that they have to create a new subdirectory by themselves). #326
  • After changing the self-update branch, users are now asked whether they want to update immediately. Thank you @LinqLover! #358
  • Support for UI scaling introduced in Squeak 6.0 #361

Changes:

  • When adding a project or cloning, ask for the directory or URL before asking for the project name. The directory name can be recommended as the project name, and when cloning fails for some reason, there is no point in choosing a name first. #307
  • Commits that were not created in the current year will show the year number instead of the time of day in the commit list. #84
  • Remote-tracking branches are visually distinguished from normal local branches in the branch list. #250
  • If a merge is ongoing, this is displayed in the title bar of the Git Browser as long as the project is selected.
  • When committing while a merge is ongoing, users are informed about this.
  • Improved help text on the Branch button
  • After cloning a new project, it is selected immediately.
  • Artifacts (e. g. packages) get UUIDs assigned now. For now you can ignore this, but in the future it may help to detect package renames, or when the directory of a package changes due to switching from FileTree to Tonel or the other way around.

Fixes:

  • New Tonel packages did not get added with the correct directory names
  • Differences in package metadata are now accounted for during saves, loads, merges #302
  • Issues when adding new packages that have similar names to already tracked packages (e. g. Collections and CollectionsTests) #295
  • If a cloned repository does not use "master" as the main branch name, do not create a non-existent "master" branch, but start from the actual main branch of the remote repository. #293
  • Cloning of empty repositories (freshly initialized) did not work.
  • Restore behavior of pushing a branch immediately after choosing an upstream branch, when none had been set previously and a push was attempted. #321
  • An error appeared when cancelling the dialog that appears when authentication at the remote repository has failed. #333
  • Issues when displaying merges where there are conflicts in class definitions.
  • BoxedFloat64 objects were not treated as value objects in 32 bits images.
  • Errors during committing were not shown in a debugger. #341
  • Catch error when users try to create a branch with a name that is already a directory for other branches (e. g. "feature" when there are already branches like "feature/xyz"). #354
  • Missing "added" or "removed" decorations on metaclasses when browsing through changes. #322
  • When resetting a branch, the additional parent commits introduced by a previous yet-uncommitted merge were not discarded. #207
  • Branch name encoding issues in the packed-refs file and in communication with remotes #319
  • When switching between branches with different packages, unsaved changes to such packages could be silently overwritten. #364
  • When browsing through the commit list, the view jumped back to the selected commit every few seconds #369
  • Commit list was incomplete if the commits shown had at least four commits that were rebased. This was because such commits all have the same committer timestamps (unless git rebase takes long).
  • When excluding a whole package during a merge, plain additions and removals without conflicts were not excluded.
  • Various menus showed errors when the Git Browser was freshly installed and did not have any projects yet, which puts it in the rare situation that no project is selected.
  • PackageInfos for mere class categories were silently registered when using the "Add or remove packages" dialog, without actually adding these categories to the project. #314
  • The "Repository disappeared" indicator in the branch list was selectable and selecting it caused errors. Now it is not selectable anymore, just like the "Branches" label at the top of the list. #359
  • Performance improvements in the Git operations (e. g. avoid reading the size of a tree entry when it is not required, avoid rehashing of objects that were just retrieved by their hash from the repository)
  • Other performance improvements (e. g. avoid to search for packages after a new commit has just been saved)

Refactorings:

  • Mirrors and references used for reflecting on objects when they are captured, materialized or compared. See SquotMirror and SquotReference subclasses.
  • Custom inspector for object diffs
  • Ongoing compatibility with deprecations in Squeak 6.0 and previously Squeak Trunk

v0.9.0

3 years ago

Notable:

  • Packages and other objects can now be tracked without loading them into Squeak. This is particularly useful if a project has packages for different Smalltalk dialects, which cannot all be loaded at the same time. #130
    • To not load a package, toggle it off in the dialog during a checkout or merge that would introduce the package.
    • Unloaded packages can later be loaded during checkouts or merges by toggling them on in the same way.
    • The dummy object that represents other non-Squeak files in the working copy is automatically added as unloaded now.
  • When merging, the current branch is now fast-forwarded if possible. #287
  • Changes to the load order of the packages in the project can now be seen in diffs and can be excluded like other changes.

Fixes:

  • Fixed error when opening the Git Browser right after installing it in Squeak. #288
  • Tonel repositories are now recognized as such by Metacello. #277
  • Added packages are now in the same package format (FileTree or Tonel) as other packages already in the repository. #278
  • When a subtree of diff nodes are deactivated, and a child node is activated again, the parent nodes will be reactivated as well. #89
  • Classes and methods are now sorted in the merge window, like in the checkout/load and save windows.
  • Class trait changes are now grouped next to the changes to the base trait. #280
  • The splitter between the diff tree and the diff text can now be moved in the checkout/load window, like in the save and merge windows.
  • When there is an error while pushing, the displayed error message contains more information now. #264
  • Proposing a remote name when adding a new remote #205
  • Commit timestamp is now when the commit is actually created, not when the save window was opened. #281
  • Preserve author timestamp when cherry picking #281
  • Remotes can no longer get invalid names. #248
  • Progress is displayed when comparing Git commits. #220
  • No erroneous reflog entries when switching the branch while the repository is still empty.
  • .squot file is no longer broken when it didn't exist yet and must be created, but at the same time packages were added or removed.
  • List of commits was not cleared when selecting a project with an empty repository.
  • Packages can now be added via the objects list when no commit is selected (empty repository).
  • Squeak's new directory chooser dialog is now used when adding packages, and its text tells the purpose of choosing a directory. #185
  • Fixed error that appeared when fetching from an empty repository. #204
  • Changes to class traits can be properly ignored (excluded from commits by default).
  • Hide diff tree node for internal change of a property called "objectsReplacedByNames" #259

Minor changes:

  • Renamed "Change tracked packages" to "Add or remove packages" in the projects menu of the Git Browser. #246
  • Instance methods are separated from class methods in the load/merge/save dialogs. #227
  • The commit message pane will show some advice when an empty project is selected. #247 #271
  • Packages can be added via the objects list in the Git Browser. #245
  • Reordered menu items in the object list: split into operations on the historic object, on the working copy object, and general operations on all objects, such as adding or removing packages.
  • Newly created branch will be selected in the Git Browser.
  • Added remote will be selected in the Remotes Browser.

Refactorings:

  • Extracted progress display into a separate class (to make changes to it in a central place).
  • Renamed SquotChangedArtifactsChooser to SquotChangesChooser. The old class name is retained as an immediate empty class in the hierarchy until the next release.
  • Reorganized categories to better separate tools from the basic non-UI functionality.

Miscellaneous notes:

  • Removed code that was deprecated in v0.8.0
  • The self-update will no longer load from "master", but from "latest-release" now. master will be kept in synch with latest-release for a while longer.

v0.8.2

3 years ago

Fixed an error that could appear when adding a remote.

v0.8.1

3 years ago
  • Debugger appeared right after installing the Git Browser. #288
  • Display server error message when a push failed. #264
  • Various bug fixes when the repository did not contain any commits yet. (Among others, #204)
  • If a new packages was added to a Tonel repository, it was serialized in FileTree format. #278
  • Tonel repositories were not detected as such by Metacello. Write the IceBerg properties file to nudge Metacello. #277
  • Errors when a repository didn't have a table of contents file yet and one was to be created when at the same time packages were added or removed.
  • Class trait changes were grouped wrong in the changes chooser. #280
  • Hide an implementation detail in the changes chooser after having upgraded from older versions of Squot. #259
  • Prevent invalid names of new remotes. #248
  • Select a branch that was just created.

v0.8.0

3 years ago

Notable:

  • Changes to individual classes, methods, scripts or the organization of packages can be put on an ignore list. These changes will be excluded from commits by default. Changes are ignored or un-ignored in the commit/save dialog in the context menu of the diff tree. This works through a special ChangeSet with the hardcoded name AssumeUnchanged.
  • Simple remotes browser that allows to list and edit remotes of Git repositories. In the context menu of a project, select "Manage remotes"...
  • Improved performance due to re-enabled caching of Git objects and keeping pack files open during an operation (see below under Refactorings).
  • During merges, parent nodes in the merge tree are also marked bold if any of their child nodes are unresolved conflicts.
  • Removed the creation of Monticello backup versions in the package-cache with each saved commit. Committing and Git object writing is mature enough after almost four years.

Fixes:

  • Fix various issues with a blank state in the Git Browser. #254
  • Better error handling when the repository URL or credentials are wrong. #181
  • Tonel packages did not appear as tracked in the dialog that allows to add or remove packages.
  • Support tags with / in their names.
  • Cherry picks did not retain the original author. #194
  • Improved speed of the collecting of Git objects for push.
  • Only ask for credentials if the repository does so as well.
  • In the merge tool, when selecting a merge node in the tree, show all the changes below it on the right, like for regular diffs.
  • Some UI updates were triggered by non-UI processes. #238
  • Compatibility fixes with advances in Squeak Trunk. #242 #243 #266
  • Fix some undeclared references in the Tonel code. #276

Minor:

  • Reordered requests during clone, so you don't have to enter a project name even though the clone is bound to fail due to a wrong repository URL. #181
  • Print only the first line of commit messages.
  • Most items in diff trees now have a Browse or Inspect action. #158
  • Remote operations with insufficient configuration (e. g. no remotes configured yet) now only tell you what is wrong and open a tool to fix it for you, but the original operation is not automatically resumed after you supposedly fixed the issue. For example, if there is no remote to push to, you will have to click the Push button again after you have added a remote. These changes were made to simplify the GUI code.
  • Add methods for version ranges (mergeBasesWith:, versionsNotOn:, versionsUniqueTo:, versionsUnsharedWith:), but there are no tools that use them yet.
  • Removed MCGitRepository, which produced neither FileTree nor Tonel output and was a leftover of the original FileSystem-Git in Pharo from 2012.
  • Disconnect dumb Git HTTP repositories for now, to avoid trying that when repository URLs are wrong. (Previously, if you tried to clone a YouTube URL, for example, it ended in a debugger with "shouldBeImplemented" -- which is not the plan.)
  • Remove stored credentials if the image is cleaned up, like for Monticello repositories.

Object tracking:

  • Fix patching of sequenceable collections (which uses the DiffMerge package under the hood).
  • Changes in existing objects referenced only by a new object were not accounted for. #135
  • New objects referenced only from other new objects were not accounted for.
  • Explorer customization for shadow objects. #144
  • Capture Symbols more like SmallIntegers, less like Strings, because of their identity behavior.

Refactorings:

  • Three-way merges and conflicts separated from Two-way-diffs.
  • Like Monticello, follow a stricter classification of changes into modifications, additions, removals.
  • Extracted operations that are composed of multiple steps into separate classes (subclasses of SquotWorkingCopyOperation for general operations and SquitInteractiveOperation for Git-specific operations). Further subclasses make the difference between interactive operations (may request input through dialogs) and non-interactive (scriptable) operations. Some of the user operations are implemented with Promises. The latest ones use a separate process and occasionally wait for UI requests in the UI process.
  • Group Git operations that belong to a single user operation (such as a merge, a cherry pick, or a push) together, to allow optimizations such as not loading configuration, the same snapshots, or opening the same pack file for reading over and over again during the user operation. In the code this is called "unit of work." It is a bit different from the unit of work pattern described in "Patterns of Enterprise Application Architecture" [Fowler, 2003] because it is not really used for transactions. For example, it cannot roll back. But Git objects cannot be rolled back anyway (they are immutable), except for ref updates or configuration changes.
  • Split loose object and packed object and ref access code into GitLooseObjectStore, GitPackedObjectStore, GitLooseRefStore, GitPackedRefStore, more like in libgit2 repository storage backends.
  • Patches and most diffs now have explicit references to the before- and after-snapshots of their respective objects.
  • Path validation (e. g. for the -.package directory name in FileTree) responsibility moved from artifact to store classes.
  • Environment activation for packages moved from image store to classes that are specific to tracking packages.
  • History walks now have a Stream-like interface with nextPut: and next. This makes the code for the continued background loading of the commit list more natural.
  • Try to collect GUI-related code in the category Squot-Tools, so it could one day be split from the core.

Miscellaneous notes:

  • Started to add drag and drop support in the Git Browser. Not finished yet, hence disabled by default. You can enable it in the preferences browser under "Squot expert settings."

v0.7.2

3 years ago

Updated URLs of dependencies in the Metacello baseline.

v0.7.1

3 years ago

This release contains some bug fixes that became necessary because of the progress in Squeak Trunk and OpenSmalltalk VM development (deprecated methods, immutable literals, internal changes to Dictionary implementation).

It also fixes some update problems and issues with merges.

This was pushed prior to the official announcement of Squot and the Git Browser to the squeak-dev mailing list.

v0.7.0

4 years ago

Migration notes

You will notice the addition of an objectsReplacedByNames property when committing changes to packages after updating to this version. The property existed before, but was not persisted. Just accept to commit it.

New features

  • Support for reading and writing Tonel repositories (Tonel is an alternate Smalltalk code serialization format and it is the new default in Pharo projects) #208
    • Repositories can switch between writing Tonel and Cypress/FileTree at will. A setting for the format has been added in the Git Browser. You can set it via the "Settings" button or from the context menu of the project in the Git Browser.
    • Note that Tonel does not store the timestamps of methods or class comments, so these will be lost when writing Tonel and loading that into another image. Timestamps are not artificially created from Git commits as of now.
  • The load order of objects (packages) can be changed in the load window (when checking out a commit) and commit window, so the order can be fixed on-the-fly.
  • Keyboard shortcuts for excluding and including changes in commit and load windows, thanks to @marceltaeumel.
  • "Added" and "removed" indicators for classes in commit and load windows. #157
  • Branches can be pushed to any remote now without changing the upstream branch.
  • The URL for cloning a repository is pre-populated from the clipboard, like in TortoiseSVN and TortoiseGit.
  • Improved support for reading repositories without Squot metadata or only partially existant metadata (e. g., some packages have the .squot-contents file and some do not)
  • The writing of Squot metadata can be disabled for a project via the "Settings" button in the Git Browser. This allows to keep repositories "clean" of any Squot marks, but restricts you to the auto-detection of packages and their formats.

Bug fixes

  • Packages could not easily (or not at all) be untracked via the GUI because they were automatically re-added. #179
  • Unpeeled tags in the packed-refs file were not understood. Repositories with annotated tags can now properly be read and written. #209
  • Temporary commits for "unsaved changes" on top of branches were erroneously merged instead of cherry-picked. #173
  • "Key not found: serializer" error when checking out non-Squot repositories #176
  • Copying of files between different file systems failed if these files contained byte sequences that were not valid according to UTF-8 #212
  • The Monticello converter did not record deletions of classes or methods if an MCVersion was missing in the source MCRepository. #218
  • New orphaned branches (without parent commits) erroneously did not have an empty file tree to start from #217
  • Fixed bugs related to changes to timestamps in Squeak Trunk #213
  • Could not track packages whose name started with the name of another already tracked package (regardless of dashes, i. e. PkgXyz could not be tracked if Pkg was already tracked, even though it was only intended that categories like Pkg-Xyz be filtered out)
  • Debugger appeared when yellow-clicking the commit text pane
  • Changes in artifact metadata were not persisted (but since there are no cases where this metadata is really necessary for packages, this was not a problem so far).

Functional changes

  • The meta Git refs for the loaded version in an image are no longer saved in the Git repository. They did not fulfill their purpose properly if the image had to be abandoned unsaved. The version is now only referenced in memory. #165
  • Simple method recategorizations or timestamp changes are now displayed as such in commit and load windows.
  • When a new branch is checked out from a remote-tracking branch, the suggested default is the same branch name derived from the remote-tracking branch.
  • A little bit more progress reporting during pushes.

API changes

  • The including and excluding of changes from commits or checkouts works differently now. The underlying patch and its diffs are now directly modified via blocks supplied to the diff tree nodes. #215
    • SquotDiffNodes should now be constructed with title: content: children: onInclude: onExclude:. The last two parameters are new and take blocks to modify the patch to be loaded or committed. For SquotMergeDiffNode there is an additional onReset: block if the solution to the conflict shall be discarded.
    • squotAdjustToResemble: was removed and is no longer sent. Its code should go into the new blocks to be supplied to onInclude: and onExclude: (see above)
    • adjustedBy: on artifacts and their diffs was removed and is no longer sent
  • The automatic detection of artifacts is now open to extensions instead of being hard-coded for Cypress/FileTree packages only.
    • The "guessing procedure" now looks for methods with the squotArtifactLocatorFor: priority: pragma in the SquotFileSystemStore. Add extension methods to provide additional ways to auto-detect objects in files.
    • Such methods shall return a SquotArtifactLocator with a detection block that tests whether a given file reference contains an object sought after. The block takes also takes an object that represents the search through the file tree as parameter. The search is progressed by telling this object which directory entries to look at. Found artifacts are also added via the search object.
    • Artifact objects for such discovered files/directories can be created with forgeLazyArtifact: deserializerFactory: serializerFactory: objectClass:, so the serializer and deserializer to be used can be specified here.
  • The SquotPackageShadow sends a different message to the serializer object to serialize its MCSnapshot. The new message also includes the package's name (which is needed by the Tonel serializer). See 4f16d9a.
  • The available serializers for an object can be discovered via squotAllSerializers and squotSpecializedSerializers. To make this work, add extension methods to the trackable classes with the pragma squotSerializer: priority: and return your serializer class from these methods. This mechanism is used to offer the choice between Tonel and FileTree code output.

Changes under the hood

  • The FileSystem packages have been extracted into a separate repository (except for FileSystem-Git which is still here): https://github.com/j4yk/Squeak-FileSystem
  • Improved speed of Monticello converter by remembering the fetched version file names during the conversion and verification
  • Consolidated SquotSaveVersionDialog (a. k. a. commit window) and SquotChangedArtifactsChooser (a. k. a. load window)
  • Patches now remember their base object container and their target object container, to make it possible to edit the load order of objects when checking them out.
  • Two SquotPackageShadows are now equal if their package names and the contained MCSnapshots are equal.
  • The shadows of start objects in an object graph are now consistently decorated with the object's artificial name.
  • Tracked single classes don't get an object name assigned anymore. Classes are identified by their name already.
  • Keep immutable object graphs (or rather, shadow graphs) in regular artifacts instead of mutable ones.
  • addGlobalObjectsToStore: is no longer called in the method to load a patch. It is instead called in the invoking methods that load or merge from a version.
  • Package auto-tracking has been generalized to add Tonel packages with the correct serializer.

v0.6.0

5 years ago

New features

  • The loading order of objects can be changed now. Choose "Browse working copy" on a project in the Git Browser to change the order. Previously, it was necessary to load packages manually in the correct order, and thus, in multiple steps. Or rather it would often fail because of package dependencies when you tried to load all from a repository at once... #129
  • Can untrack objects from the objects list in the lower right of the Git Browser now. #126
  • Reworked the UI to add remotes, so it is less likely to mix up remote name and remote URL. #161
  • When a commit is aborted (by canceling the dialog), the message is remembered for the next attempt.

Functional changes

  • Context menus in the Git Browser have titles now, to better indicate what the offered commands are about #132
  • Remote-tracking branches appear sorted in the branch list (but they all appear below the local branches)
  • Ref names are validated, so when you attempt to create a branch with an invalid name, it will be caught. Thanks to @codeZeilen.
  • More detailed error message when the remote authentication failed. Thanks to @codeZeilen.
  • The ref that marked the commit that was loaded last is now solely kept in the image. #165
  • Slightly improved appearance of added and removed objects in the Commit, Load and Merge dialogs. #163
  • The order of the Accept and Cancel buttons is now the same in all dialogs. The buttons are also colored green and red (in the default Squeak theme) to ease the transition where the buttons have been swapped. #164
  • A warning is displayed before a commit is created with the placeholder message 'Enter a commit log message here'. #159
  • When a local branch is created by checking out a remote-tracking branch, the upstream branch of the new local branch is now automatically set to the remote branch. Like in command line Git. #127
  • Progress messages referring to commits now show "commit message" instead of "SquitVersion", which might have had users unfamiliar with the implementation of Squot and Squit confused. #186
  • Can input newlines in the feedback dialog now. #184
  • When moving over unsaved changes to another branch, the unsaved changes will be stored on top of the previous branch anyway, so you will get them back when switching back, even if the loading of the other branch failed for some reason.

Bug fixes

  • Could not properly resolve all conflicts in Load/Merge dialog
  • When adding a package to track, the wrong package (one next to the selected) would be added instead.
  • When a repository was not found with a HTTP 404 error, the error message in the Git Browser looked like there was an authentication issue. #188
  • Fixed an error in the Monticello converter's verification step, causing a debugger to pop up and halt the conversion. #206
  • The "unsaved" changes temporarily stowed on top of a branch when you switch to another branch are now cherry-picked and not simply loaded. This is necessary for cases when the branch you are switching to was rebased or reset to another commit. #173
  • If there are conflicts when restoring the unsaved changes on top of a branch, the Merge dialog is shown.
  • Rematerializing stored objects could replace objects when they should be modified instead.
  • Missing methods on FSReadStream #177
  • Fixed an error when cherry-picking an orphaned commit (without parents) #171
  • It was possible to add a parent commit multiple times by attempting and aborting multiple merges.

API changes

  • Constructors for object containers (such as SquotSnapshot) and patches that do not consider the load order are deprecated or removed.
  • Removed #add: from SquotPatch. Use the builder instead.
  • Removed obsolete patch editing dialogs (save/load) that were not based on patches
  • Removed SquotModalDialogWidgets
  • Removed code for package autodetection in directories from SquotWorkingCopy (is in the domain of SquotFileSystemStore instead)
  • Renamed SquotMetaobjectDiffNodesBuilder to SquotDiffTreeBuilder
  • Dialogs modifying snapshots or patches no longer duplicate the structure (implementation details) of snapshots or patches, but rely on the appropriate builders instead
  • Added GitRemote, GitRefSpec, and GitFetchSpec for accessing and handling these concepts in a GitRepository
  • previousVersionId and previousSnapshot variables in SquotWorkingCopy are deprecated and will be removed in a future release