Mercurial > hg
view tests/test-journal-share.t @ 37210:2a2ce93e12f4
templatefuncs: add mailmap template function
This commit adds a template function to support the .mailmap file
in Mercurial repositories. The .mailmap file comes from git, and
can be used to map new emails and names for old commits. The general
use case is that someone may change their name or author commits
under different emails and aliases, which would make these
commits appear as though they came from different persons. The
file allows you to specify the correct name that should be used
in place of the author field specified in the commit.
The mailmap file has 4 possible formats used to map old "commit"
names to new "proper" names:
1. <proper@email.com> <commit@email.com>
2. Proper Name <commit@email.com>
3. Proper Name <proper@email.com> <commit@email.com>
4. Proper Name <proper@email.com> Commit Name <commit@email.com>
Essentially there is a commit email present in each mailmap entry,
that maps to either an updated name, email, or both. The final
possible format allows commits authored by a person who used
both an old name and an old email to map to a new name and email.
To parse the file, we split by spaces and build a name out
of every element that does not start with "<". Once we find an element
that does start with "<" we concatenate all the name elements that preceded
and add that as a parsed name. We then add the email as the first
parsed email. We repeat the process until the end of the line, or
a comment is found. We will be left with all parsed names in a list,
and all parsed emails in a list, with the 0 index being the proper
values and the 1 index being the commit values (if they were specified
in the entry).
The commit values are added as the keys to a dict, and with the proper
fields as the values. The mapname function takes the mapping object and
the commit author field and attempts to look for a corresponding entry.
To do so we try (commit name, commit email) first, and if no results are
returned then (None, commit email) is also looked up. This is due to
format 4 from above, where someone may have a mailmap entry with both
name and email, and if they don't it is possible they have an entry that
uses only the commit email.
Differential Revision: https://phab.mercurial-scm.org/D2904
author | Connor Sheehan <sheehan@mozilla.com> |
---|---|
date | Mon, 19 Mar 2018 11:16:21 -0400 |
parents | a8a902d7176e |
children | cb70be32f5f7 |
line wrap: on
line source
Journal extension test: tests the share extension support $ cat >> testmocks.py << EOF > # mock out procutil.getuser() and util.makedate() to supply testable values > import os > from mercurial import util > from mercurial.utils import procutil > def mockgetuser(): > return 'foobar' > > def mockmakedate(): > filename = os.path.join(os.environ['TESTTMP'], 'testtime') > try: > with open(filename, 'rb') as timef: > time = float(timef.read()) + 1 > except IOError: > time = 0.0 > with open(filename, 'wb') as timef: > timef.write(str(time)) > return (time, 0) > > procutil.getuser = mockgetuser > util.makedate = mockmakedate > EOF $ cat >> $HGRCPATH << EOF > [extensions] > journal= > share= > testmocks=`pwd`/testmocks.py > [remotenames] > rename.default=remote > EOF $ hg init repo $ cd repo $ hg bookmark bm $ touch file0 $ hg commit -Am file0-added adding file0 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . commit -Am file0-added 0fd3805711f9 bm commit -Am file0-added A shared working copy initially receives the same bookmarks and working copy $ cd .. $ hg share repo shared1 updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd shared1 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share repo shared1 unless you explicitly share bookmarks $ cd .. $ hg share --bookmarks repo shared2 updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd shared2 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added Moving the bookmark in the original repository is only shown in the repository that shares bookmarks $ cd ../repo $ touch file1 $ hg commit -Am file1-added adding file1 $ cd ../shared1 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share repo shared1 $ cd ../shared2 $ hg journal --all previous locations of the working copy and bookmarks: 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added But working copy changes are always 'local' $ cd ../repo $ hg up 0 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (leaving bookmark bm) $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . up 0 4f354088b094 . commit -Am file1-added 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . commit -Am file0-added 0fd3805711f9 bm commit -Am file0-added $ cd ../shared2 $ hg journal --all previous locations of the working copy and bookmarks: 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added $ hg up tip 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg up 0 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg journal previous locations of '.': 0fd3805711f9 up 0 4f354088b094 up tip 0fd3805711f9 share --bookmarks repo shared2 Unsharing works as expected; the journal remains consistent $ cd ../shared1 $ hg unshare $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share repo shared1 $ cd ../shared2 $ hg unshare $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . up 0 4f354088b094 . up tip 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added New journal entries in the source repo no longer show up in the other working copies $ cd ../repo $ hg bookmark newbm -r tip $ hg journal newbm previous locations of 'newbm': 4f354088b094 bookmark newbm -r tip $ cd ../shared2 $ hg journal newbm previous locations of 'newbm': no recorded locations This applies for both directions $ hg bookmark shared2bm -r tip $ hg journal shared2bm previous locations of 'shared2bm': 4f354088b094 bookmark shared2bm -r tip $ cd ../repo $ hg journal shared2bm previous locations of 'shared2bm': no recorded locations