Search code examples
mercurialtortoisehghgignore

How can i make mercurial to add wildcard for file name


we are working on a project, where the angularjs web project is compiled and binaries are stored in hg repo. The problem is angularjs js files are usually compiled with hashing for all binary files. Ex: binary files are suffixed with unique extensions for each file

main.1cc794c25c00388d81bb.js, 
polyfills.eda7b2736c9951cdce19.js, 
runtime.a2aefc53e5f0bce023ee.js, 
common.7d1522841bf85b01f2e6.js, 
1.620807da7415abaeeb47.js,
2.93e8bd3b179a0199a6a3.....etc.

The problem is every time a new binary in checkin in hg repo, it is being detected as new file and retained along with old file of same name. So, i need a way to fool the hg repo, to retain the file name but still consider them as old file replacing the previous one.

main.1cc794c25c00388d81bb.js  ==> overwrite old main.js 
polyfills.eda7b2736c9951cdce19.js ==> overwrite old polyfill.js 
runtime.a2aefc53e5f0bce023ee.js ==> overwrite old polyfill.js 
common.7d1522841bf85b01f2e6.js ==> overwrite old commom.js
1.620807da7415abaeeb47.js  ==> overwrite old 1.js
2.93e8bd3b179a0199a6a3 ==> overwrite old 2.js

Could any one point out a way, to fool the hg to consider these files are just modification of previous files and not as new files ? Can hgignore or some other extension be used...


Solution

  • A VCS shall track the state of files. And those are indeed new files. One can argue that those are the old files renamed - which can be recorded by the VCS.

    So there are two solutions I see:

    1. Record moving the old filenames to the new filenames. hg addremove --similarity XX might be of big help here. It will result in all the files having the new names each time - but if the similarity is good enough it will work nicely. You might need to adjust the XX to get a similarity measure (0 ... 100) which works for you best. Adding --dry-run for testing purposes might make testing easy. You WILL need to delete the old files before you run hg addremove though.

    2. Have a pre-commit hook which iterates over *.js files and moves via an appropriate regex ..js to *.js omitting the hashing code, effectively overwriting the generic filenames with the newly generated hashed filenames.