- Feature:
mdm status
learned a--name
option, which allows checking status of just one specific dependency. - Feature:
mdm status
learned a--format
option, which may be used to generate more machine-readable output.- Current values include 'default' (the existing verbose form), 'versionCheckedOut', and 'versionSpecified'.
- Internal: new test coverage for all parts of the
mdm status
command.
- Feature:
mdm release
learned a--skip-accumulation
flag, which disables the accumulation of release folders and copies of the content in the master branch. This is now an option for keeping less on disk if the master branch is checked out, but still keeps an audit log moving forward over time which maintains explicit references to the release data. Note that it's expected that future mdm releases will move further in this direction and eventually make it the default behavior.
- bugfix: using
mdm update
during a merge conflict, while mdm needed to fetch a dependency, and that dependency was not present on one of the branches under merge... will no longer crash.- workaround note: if you experienced this and are stuck with an older version of mdm, you can commit the merge, and continue to patch the merge with
git commit --amend
. Or, just do yourmdm update
before starting the merge.
- workaround note: if you experienced this and are stuck with an older version of mdm, you can commit the merge, and continue to patch the merge with
- usability: output of commands is now sorted (by the path in your repository).
mdm update
learned a--strict
option, which causes it to exit with a non-zero status code in the event that fetching a library version my name resulted in a hash not matching the one committed in the project. (As before, this scenario will always generate warnings, but without the--strict
option it will exit with 0/success.)mdm update
will now remove dangling dependencies from your working tree, such as after switching to a branch that does not link a dependency. (Git will not remove such dangling repos because git is -- quite reasonably -- paranoid about deleting other git repos. Previously, mdm agreed with this stance; as of this update, mdm has enough situational awareness to "do what I mean" while remaining quite safe.)- This will refrain from removing an unlinked dependency directory from your working tree if it has uncommitted changes, and issue a notice instead.
- Only submodules managed by mdm are subject to this policy. Any other submodules or plain git repos sitting in your working tree will be untouched.
- Upgrade note: new project clones will recieve this benefit automatically; existing workspaces may be updated by using
mdm update --reclaim
.
- Fix incorrect warning about hash-mismatches issued when using
mdm update
during an ongoing merge conflict resolution. mdm will now consider a hash from any of the merging branches to be valid. Previously, mdm would check against the dependency hash tracked on the incoming branch, which would give false warnings when intentionally choosing the dependency version from the current branch. - Asking
mdm add
to place a dependency in a gitignore'd directory now works. (Though I don't particularly know why you'd do that.) - Improve rejection of invalid version names in the
mdm release
command. (Previously, a ref could have been created, but release would still fail when assertions were made later in the process, which would leave behind a ref which native git would never have admitted; this no longer occurs.) - Improve messaging from the
mdm release
command when an invalid destination repo is specified. A distinction is now correctly made between a lack of a repo root at the specified path versus finding a repo that isn't a release repo. mdm --help
(or equivalently,mdm -h
) now provides a larger description of the overall tool, where to go for source and additional documentation, and explicitly denotes that-h
may be used for extended help on any subcommand.mdm
with no subcommands now also invokes the help routine (git
with no subcommands has very similar behavior).
- Add support for ssh transport to use interactive prompts for passwords.
- Add support for ssh transport to use encrypted private keys, using interactive prompts for the encryption passphrase. (See the jsch readme for a full list of supported ciphers.)
- Add support for ssh transport to contact unknown hosts if confirmed at interactive prompt.
- The exception will not be permanently added to a system known_hosts file by mdm. But you will see the key fingerprint, so you can validate the system yourself and take appropriate steps.
- In previous releases, mdm would simply fail to establish ssh transport if the hostkey was unrecognized.
- All of the above prompts will be skipped if there is not attached interactive terminal; the (unanswered) prompt will still now be logged however (so you can easily see if your jenkins job is failing because of an unrecognized host key, for example).
- Windows support!
- Consider this preliminary, but all basic issues with path uniformity are now addressed, enough to enable successfully using
mdm update
,mdm alter
, etc, in a Windows environment. So if additional issues are found, you should have all the tools necessary to make contributions from Windows ;) - Use of absolute local filesystem paths in any git configuration is not recommended; significantly remapped filesystems may also pose challenges (namely, cygwin's translation layer between '/cygdrive/c/' and 'C:/' is likely to create amusing issues when programs from a cygwin context versus the native windows context look at config files they share).
- Consider this preliminary, but all basic issues with path uniformity are now addressed, enough to enable successfully using
- Fix regression in v2.17.1 where asking mdm for '--help' or '--version' outside of a git repo would result in a demand for a git repo.
- Detect the presense of a terminal and format output accordingly:
mdm update
will use the fancy terse progress output in the presense of a terminal, and fall back to plain line-after-line printing if a terminal is not detected.
- Exit with success code when requesting alteration of a depedency version to what you already have.
- Calmly report and exit when altering a version encounters dirty files in a dependency's working tree.
- Bugfix for crash when removing a dependency's checked out files and then running
mdm update
again (mdm would try to 'create' the submodule repo, even though it would still exist in the parent repo's .git/ data dir) introduced by v2.17.0.- If you need to work around this in v2.17.0, you can simply remove the files under the parent repo's
.git/modules/{the-dep-path}
directory -- or, as with most things, just reclone for an aggressively clean slate.
- If you need to work around this in v2.17.0, you can simply remove the files under the parent repo's
- Fix for handling operation inside a repository that is itself a submodule (or otherwise has an unusually advanced configuration with a relocated git data dir) (also a new concern from v2.17.0's separation of git dir from working tree).
- If you need to work around this in v2.17.0, you can do so by taking the n-1'th layer of submodule (what mdm would normally consider "the project dir"), and making sure its
.git
path is a real directory (one way to do this is by doing a git-init/git-clone into place directly instead of using the git-submodule-update mechanics, which as of git>=1.7.8 generate relocated git dirs the same way mdm does).
- If you need to work around this in v2.17.0, you can do so by taking the n-1'th layer of submodule (what mdm would normally consider "the project dir"), and making sure its
- The
mdm update
command now reports each of the dependencies as it proceeds. When doing an update on a project with a lot of dependencies, there's now a pulse visible during the work. - Git data directories are now stored in the parent project's git data directory!
- This is a significant improvement in that your entire lib/* directory can be blown away, and yet the cache of locally available repositories and their commits remains available.
- In particular, this means after switching to a branch without a dependency, you can
git clean -xdff
, yet when switching back and "fetching" the dependency again, no fetch is necessary; all the data is still locally available.
- Added enhanced support around use of URL "insteadof" git config:
url.[...].insteadof
andurl.[...].pushinsteadof
git config chunks in the parent repo's config will now be copied into a dependency module's config.- This means it's easy to configure url replacements on a project and have
mdm update
pick up the replacement on the very first use. - Additionally, git config parameters under "
url.[...]
" from the system and user gitconfigs are now accepted by mdm. - If you're not familiar with this feature of git: play around with
git config url."file:///my/local/cache/".insteadof "http://mdm-releases.com/"
. - Note that "insteadof" config per repository was already supported by mdm previously; the change here is merely the convenience of injecting config from the parent into submodules to smooth initialization.
- This means it's easy to configure url replacements on a project and have
- Improved deployment: binaries from v2.15.0 and later were sometimes not considered as valid executables in some contexts on POSIX (i.e. linux, mac) systems; this is now fixed.
- Specifically, if executing mdm via the execlp, execvp, or execvpe syscalls, everything would be fine; when using the execl, execle, or execv syscalls an error would be encountered. Practically speaking, exec'ing in java doesn't encounter problems, nor of course does the shell; I did however find that exec'ing in golang would hit the stricter behavior. See
man exec
for additional entertainment.
- Specifically, if executing mdm via the execlp, execvp, or execvpe syscalls, everything would be fine; when using the execl, execle, or execv syscalls an error would be encountered. Practically speaking, exec'ing in java doesn't encounter problems, nor of course does the shell; I did however find that exec'ing in golang would hit the stricter behavior. See
- Upgrade jsch dependency to to version '0.1.51' (from '0.1.49').
- Fix exceptions when attempting to use ssh transports.
- Configure proguard's minimization of release builds to explicitly retain jsch (the ssh client library) classes (this library is referred to by reflection, and so is needed in more situations than proguard can statically detect).
- Give a meaningful error messages in case of parse error in a .gitmodules file.
- Emit a warning if running
mdm update
leaves a submodule checked out on a different hash than the parent repo expects.mdm status
would already report the mismatch after the fact, but if it occurs during an update, it most likely indicates either a misconfiguration, or shenanigans upstream. - When a dependency already has a version name locally, do not engage transport at all. (Previously the remote origin would still be contacted; near zero work would be performed, but it was still Some Network where it should be None Network.)
- Show messages from problems encountered by
mdm update
while manipulating dependency repos instead of just a nondescript count of problems.
- Improve detection of mdm release repositories (accept an mdm/init branch from the origin remote as valid; this removes an extra setup step between cloning a release repo and being able to perform new releases).
- Update to release process: we now ship a single executable. Linux/mac environments should be able to execute this file directly. (A
java
command on the system path is still required.)- This removes the shell script previously included for use on linux/mac environments.
- Upgrade jgit dependency to version '3.3.0.201403021825-r'.
- Fix issue where fetching from packfiles containing unrequested objects could create unnecessary refs in the local repo.
- This issue could previously appear when using a 'dumb' git transport on an aggressively packed remote repo (it was otherwise unlikely to cause problems since smart transports repack during transport), and could cause use of unnecessary repository space on disk.
- Upgrade jgit dependency to version '3.3.0.201403021825-r'.
- Additional testing; see git log for details.
(Side note on git transports: using mdm with an aggressively packed remote repo over a 'dumb' git transport is inadvisable, as it is likely to use unnecessary amounts of bandwidth; this is the nature of git dumb transports, not of an issue of mdm. Use of smart transports is recommended for most cases; fortunately this is what almost all currently popular git hosting services provide. Use of dumb transports is ironically recommended for advanced users only, and interested parties should read the man pages for git repack and git fetch carefully.)
- Perceive the version of a dependency module from branch name. Previously this was parsed from tags on release commits; these tags are now ignored (though they are still created).
- Fix problems operating on repositories with a releases repo link but missing a fully constructed releases repo.
- Various bugfixes; additional testing; see git log for details.
- Executable permission bits are now preserved and committed during
mdm release
. - Empty directories are no longer carried along when copying files into a releases repo during
mdm release
. This leaves the release repo in a state more consistent with fresh clones. - Hidden files and directories are now carried along when
mdm release
is used on a directory. - Releases of mdm are now packed with ProGuard, resulting in smaller binaries.
mdm release
command can now be used without being located in a repository root.mdm release
command now rejects repositories with any uncommitted changes.- Fix username not being picked up from the system for use in commit messages.
- Various bugfixes; additional testing; see git log for details.
- Releases of mdm now include two files: 'mdm.jar', and a shell script called 'mdm'. (Previously, only the jar file was included in the release, and it was named 'mdm'. This worked well on systems where the default binfmt recognized jars, but was irritating on other systems, and thus we now include a wrapper shell script in the release.)
- Fix bug in handling submodules that aren't managed by mdm.
- Upgrade jgit dependency from an unofficial build to version '3.0.0.201306101825-r'.
mdm release-init
now accepts existing empty directories as clean target locations for creating a releases repo.- Fix bug when updating project repo's link to release repo if the path is non-default.
- Unexpected errors are now logged to a file instead of vomiting stack traces at the end user.
- Various bugfixes; significant refactoring to module handling; additional testing; see git log for details.
- Complete rewrite of mdm.
- mdm is now implemented in java, and internally uses jgit.
- mdm no longer performs any exec'ing of a system install of git, which dramatically increases its reliability, and also means it can be distributed statically without any further dependencies aside from a jvm (version 1.6 is sufficient).
- mdm is now cross platform.
Note that despite being a complete rewrite of mdm, the major version number is not incremented. The mdm release repository layout is completely unchanged. The python implementation of mdm may continue to be used; in fact the java and python implementations may be used interchangeably, side by side.
- Final released version of the python implementation of mdm.
- The fog of history grows thick here: consult the git log for detailed information about this and earlier versions.