v0.8.0 for Squeak 5.3 and Trunk
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."