Mercurial > hg
comparison mercurial/localrepo.py @ 45192:509f5b6c0b7e
commitctx: return "touched" status from _filecommit
Instead of mutating a list passed in argument, we simply return the information
from the `_filecommit` function. This make for a cleaner API and allow for
richer information to be returned. That richer information will be used in the
next commit to avoid duplicated computation.
This is part of a larger refactoring/cleanup of the commitctx code to clarify
and augment the logic gathering metadata useful for copy tracing. The current
code is a tad too long and entangled to make such update easy. We start with
easy and small cleanup.
Differential Revision: https://phab.mercurial-scm.org/D8702
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 06 Jul 2020 19:35:53 +0200 |
parents | c93dd9d9f1e6 |
children | e64c35dfc6cb |
comparison
equal
deleted
inserted
replaced
45180:a6fde9d789d9 | 45192:509f5b6c0b7e |
---|---|
2770 def currentwlock(self): | 2770 def currentwlock(self): |
2771 """Returns the wlock if it's held, or None if it's not.""" | 2771 """Returns the wlock if it's held, or None if it's not.""" |
2772 return self._currentlock(self._wlockref) | 2772 return self._currentlock(self._wlockref) |
2773 | 2773 |
2774 def _filecommit( | 2774 def _filecommit( |
2775 self, | 2775 self, fctx, manifest1, manifest2, linkrev, tr, includecopymeta, |
2776 fctx, | |
2777 manifest1, | |
2778 manifest2, | |
2779 linkrev, | |
2780 tr, | |
2781 changelist, | |
2782 includecopymeta, | |
2783 ): | 2776 ): |
2784 """ | 2777 """ |
2785 commit an individual file as part of a larger transaction | 2778 commit an individual file as part of a larger transaction |
2786 | 2779 |
2787 input: | 2780 input: |
2789 fctx: a file context with the content we are trying to commit | 2782 fctx: a file context with the content we are trying to commit |
2790 manifest1: manifest of changeset first parent | 2783 manifest1: manifest of changeset first parent |
2791 manifest2: manifest of changeset second parent | 2784 manifest2: manifest of changeset second parent |
2792 linkrev: revision number of the changeset being created | 2785 linkrev: revision number of the changeset being created |
2793 tr: current transation | 2786 tr: current transation |
2794 changelist: list of file being changed (modified inplace) | |
2795 individual: boolean, set to False to skip storing the copy data | 2787 individual: boolean, set to False to skip storing the copy data |
2796 (only used by the Google specific feature of using | 2788 (only used by the Google specific feature of using |
2797 changeset extra as copy source of truth). | 2789 changeset extra as copy source of truth). |
2798 | 2790 |
2799 output: | 2791 output: (filenode, touched) |
2800 | 2792 |
2801 The resulting filenode | 2793 filenode: the filenode that should be used by this changeset |
2794 touched: one of: None, 'added' or 'modified' | |
2802 """ | 2795 """ |
2803 | 2796 |
2804 fname = fctx.path() | 2797 fname = fctx.path() |
2805 fparent1 = manifest1.get(fname, nullid) | 2798 fparent1 = manifest1.get(fname, nullid) |
2806 fparent2 = manifest2.get(fname, nullid) | 2799 fparent2 = manifest2.get(fname, nullid) |
2800 touched = None | |
2801 if fparent1 == fparent2 == nullid: | |
2802 touched = 'added' | |
2803 | |
2807 if isinstance(fctx, context.filectx): | 2804 if isinstance(fctx, context.filectx): |
2808 node = fctx.filenode() | 2805 node = fctx.filenode() |
2809 if node in [fparent1, fparent2]: | 2806 if node in [fparent1, fparent2]: |
2810 self.ui.debug(b'reusing %s filelog entry\n' % fname) | 2807 self.ui.debug(b'reusing %s filelog entry\n' % fname) |
2811 if ( | 2808 if ( |
2813 and manifest1.flags(fname) != fctx.flags() | 2810 and manifest1.flags(fname) != fctx.flags() |
2814 ) or ( | 2811 ) or ( |
2815 fparent2 != nullid | 2812 fparent2 != nullid |
2816 and manifest2.flags(fname) != fctx.flags() | 2813 and manifest2.flags(fname) != fctx.flags() |
2817 ): | 2814 ): |
2818 changelist.append(fname) | 2815 touched = 'modified' |
2819 return node | 2816 return node, touched |
2820 | 2817 |
2821 flog = self.file(fname) | 2818 flog = self.file(fname) |
2822 meta = {} | 2819 meta = {} |
2823 cfname = fctx.copysource() | 2820 cfname = fctx.copysource() |
2821 fnode = None | |
2822 | |
2824 if cfname and cfname != fname: | 2823 if cfname and cfname != fname: |
2825 # Mark the new revision of this file as a copy of another | 2824 # Mark the new revision of this file as a copy of another |
2826 # file. This copy data will effectively act as a parent | 2825 # file. This copy data will effectively act as a parent |
2827 # of this new revision. If this is a merge, the first | 2826 # of this new revision. If this is a merge, the first |
2828 # parent will be the nullid (meaning "look up the copy data") | 2827 # parent will be the nullid (meaning "look up the copy data") |
2895 fparent1, fparent2 = fparent2, nullid | 2894 fparent1, fparent2 = fparent2, nullid |
2896 | 2895 |
2897 # is the file changed? | 2896 # is the file changed? |
2898 text = fctx.data() | 2897 text = fctx.data() |
2899 if fparent2 != nullid or meta or flog.cmp(fparent1, text): | 2898 if fparent2 != nullid or meta or flog.cmp(fparent1, text): |
2900 changelist.append(fname) | 2899 if touched is None: # do not overwrite added |
2901 return flog.add(text, meta, tr, linkrev, fparent1, fparent2) | 2900 touched = 'modified' |
2901 fnode = flog.add(text, meta, tr, linkrev, fparent1, fparent2) | |
2902 # are just the flags changed during merge? | 2902 # are just the flags changed during merge? |
2903 elif fname in manifest1 and manifest1.flags(fname) != fctx.flags(): | 2903 elif fname in manifest1 and manifest1.flags(fname) != fctx.flags(): |
2904 changelist.append(fname) | 2904 touched = 'modified' |
2905 | 2905 fnode = fparent1 |
2906 return fparent1 | 2906 else: |
2907 fnode = fparent1 | |
2908 return fnode, touched | |
2907 | 2909 |
2908 def checkcommitpatterns(self, wctx, match, status, fail): | 2910 def checkcommitpatterns(self, wctx, match, status, fail): |
2909 """check for commit arguments that aren't committable""" | 2911 """check for commit arguments that aren't committable""" |
2910 if match.isexact() or match.prefix(): | 2912 if match.isexact() or match.prefix(): |
2911 matched = set(status.modified + status.added + status.removed) | 2913 matched = set(status.modified + status.added + status.removed) |
3129 fctx = ctx[f] | 3131 fctx = ctx[f] |
3130 if fctx is None: | 3132 if fctx is None: |
3131 removed.append(f) | 3133 removed.append(f) |
3132 else: | 3134 else: |
3133 added.append(f) | 3135 added.append(f) |
3134 m[f] = self._filecommit( | 3136 m[f], is_touched = self._filecommit( |
3135 fctx, | 3137 fctx, m1, m2, linkrev, trp, writefilecopymeta, |
3136 m1, | |
3137 m2, | |
3138 linkrev, | |
3139 trp, | |
3140 changed, | |
3141 writefilecopymeta, | |
3142 ) | 3138 ) |
3139 if is_touched: | |
3140 changed.append(f) | |
3143 m.setflag(f, fctx.flags()) | 3141 m.setflag(f, fctx.flags()) |
3144 except OSError: | 3142 except OSError: |
3145 self.ui.warn( | 3143 self.ui.warn( |
3146 _(b"trouble committing %s!\n") % uipathfn(f) | 3144 _(b"trouble committing %s!\n") % uipathfn(f) |
3147 ) | 3145 ) |