The hg_timestamp_update is a small Java program intended as an update-hook for the Mercurial (hg) Source Control Management system. Used this way, the program will set the modification-time of each updated file to that of the last revision involving the file. In other words, all the updated files would get a modification date which is no newer than the date of the revision that is updated to.
The hg_timestamp_update will restore the modification-times whenever files in the repository are updated, without making any other changes to the files in the working directory or to the repository. The time-stamps stored in Mercurial's normal revision history are used. Thus, a repository does not need to be "prepared" in any way in order to work with hg_timestamp_update. At any time hg_timestamp_update can be enabled/disabled for a repository, by registering/removing its update-hooks.
It is recommended to install these hooks on a per-repository basis. To get the modification-dates of all files restored when cloning a repository, use the following procedure:
hg clone --noupdate SOURCE [DEST]
- register the update-hooks in the newly cloned repository's hgrc file (see hooks/hgrc)
hg update [[-r] REV]
You may find it useful to have the modification-time show you which files were changed recently in a repository and which have been untouched for years - regardless of when you updated your local working directory. In particular, when keeping documents and other "non-code" files under revision control, the (restored) modification-time could be used for versioning the documents. The hg_timestamp_update was developed for such purposes.
Please note that this feature is undesirable in combination with time-stamp based build tools (e.g. make)! See the Mercurial FAQ.
This program could be considered a work-around for a requested (still missing) feature of core Mercurial: issue326.
An alternative approach has also been developed, the TimestampExtension. The table below outlines the differences between hg_timestamp_update and TimestampExtension:
|uses the commit-time of changesets||stores the timestamps of selected files in a database|
|modification-times of all changed files are adjusted upon update||modification-times of the pre-selected files are adjusted upon update|
|the hook can be enabled/disabled for any repository at any time||the extension must be enabled from the beginning in order to track time-stamps|
|a preupdate- and an update-hook for Mercurial||an extension and an update-hook for Mercurial|
- Clone the project from bitbucket: hg clone http://bitbucket.org/esskov/hg_timestamp_update/
Or just download a copy: http://bitbucket.org/esskov/hg_timestamp_update/downloads/
- Copy the hg_timestamp_update.jar, the hg_timestamp_files.style and the two hook scripts to the appropriate hg directories; InstallIt.bat or InstallIt.sh will normally do this for you.
- Register the update and preupdate hooks in the hgrc file of each repository where you want time-stamp restoring (you can copy from hooks/hgrc).
The hg_timestamp_update package has been tested on both Linux and Windows, with both command-line Mercurial and with TortoiseHg. A Java Runtime package is required (i.e., the “java” command), which you may or may not have already on your system.
Aside from the fact that hg_timestamp_update is not a regular Mercurial extension there are currently no known issues - however, use it at your own risk. Comments and patches are very welcome.
2013-03-17: The new version 0.5 of this extension now handles updates across (and within) branches correctly, using the excellent revset feature of Mercurial.
2011-03-15: Mercurial 1.8 / TortoiseHg 2.0 (Windows) has been reported to break hg_timestamp_update. This issue has now been fixed in Mercurial 1.8.1 / TortoiseHg 2.0.2.
Q: How do I restore the time-stamps of all files in an existing repository? A: hg up -q -r null && hg up -q -r tip Q: How do I check if hg_timestamp_update.jar has been installed correctly (by the install script)? A: java -jar /usr/share/mercurial/hg_timestamp_update.jar 0 tip 2 A: java -jar %HG_ROOT%\hg_timestamp_update.jar 0 tip 2 Q: How do I make hg_timestamp_update work silently, i.e. without printing any [hg_timestamp hook] lines? A: Add 0 after the HG_PARENT1 argument, in the java call in the JavaUpdateHook.sh/.cmd hook.