comparison mercurial/commit.py @ 45239:13814622b3b1

commitctx: extract all the file preparation logic in a new function Before we actually start to create a new commit we have a large block of logic that do the necessary file and manifest commit and that determine which files are been affected by the commit (and how). This is a complex process on its own. It return a "simple" output that can be fed to the next step. The output itself is not that simple as we return a lot of individual items (files, added, removed, ...). My next step (and actual goal for this cleanup) will be to simplify the return by returning a richer object that will be more suited for the variation of data we want to store. After this changeset the `commitctx` is a collection of smaller function with limited scope. The largest one is still `_filecommit` without about 100 lines of code.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 23 Jul 2020 23:52:31 +0200
parents bd7515273fd6
children e15416c95b25
comparison
equal deleted inserted replaced
45238:bd7515273fd6 45239:13814622b3b1
62 62
63 p1, p2 = ctx.p1(), ctx.p2() 63 p1, p2 = ctx.p1(), ctx.p2()
64 user = ctx.user() 64 user = ctx.user()
65 65
66 with repo.lock(), repo.transaction(b"commit") as tr: 66 with repo.lock(), repo.transaction(b"commit") as tr:
67 writechangesetcopy, writefilecopymeta = _write_copy_meta(repo) 67 r = _prepare_files(tr, ctx, error=error, origctx=origctx)
68 68 mn, files, p1copies, p2copies, filesadded, filesremoved = r
69 p1copies, p2copies = None, None
70 if writechangesetcopy:
71 p1copies = ctx.p1copies()
72 p2copies = ctx.p2copies()
73 filesadded, filesremoved = None, None
74 if ctx.manifestnode():
75 # reuse an existing manifest revision
76 repo.ui.debug(b'reusing known manifest\n')
77 mn = ctx.manifestnode()
78 files = ctx.files()
79 if writechangesetcopy:
80 filesadded = ctx.filesadded()
81 filesremoved = ctx.filesremoved()
82 elif not ctx.files():
83 repo.ui.debug(b'reusing manifest from p1 (no file change)\n')
84 mn = p1.manifestnode()
85 files = []
86 else:
87 mn, files, added, removed = _process_files(tr, ctx, error=error)
88 if writechangesetcopy:
89 filesremoved = removed
90 filesadded = added
91
92 if origctx and origctx.manifestnode() == mn:
93 files = origctx.files()
94
95 if not writefilecopymeta:
96 # If writing only to changeset extras, use None to indicate that
97 # no entry should be written. If writing to both, write an empty
98 # entry to prevent the reader from falling back to reading
99 # filelogs.
100 p1copies = p1copies or None
101 p2copies = p2copies or None
102 filesadded = filesadded or None
103 filesremoved = filesremoved or None
104 69
105 # update changelog 70 # update changelog
106 repo.ui.note(_(b"committing changelog\n")) 71 repo.ui.note(_(b"committing changelog\n"))
107 repo.changelog.delayupdate(tr) 72 repo.changelog.delayupdate(tr)
108 n = repo.changelog.add( 73 n = repo.changelog.add(
132 # be compliant anyway 97 # be compliant anyway
133 # 98 #
134 # if minimal phase was 0 we don't need to retract anything 99 # if minimal phase was 0 we don't need to retract anything
135 phases.registernew(repo, tr, targetphase, [n]) 100 phases.registernew(repo, tr, targetphase, [n])
136 return n 101 return n
102
103
104 def _prepare_files(tr, ctx, error=False, origctx=None):
105 repo = ctx.repo()
106 p1 = ctx.p1()
107
108 writechangesetcopy, writefilecopymeta = _write_copy_meta(repo)
109
110 p1copies, p2copies = None, None
111 if writechangesetcopy:
112 p1copies = ctx.p1copies()
113 p2copies = ctx.p2copies()
114 filesadded, filesremoved = None, None
115 if ctx.manifestnode():
116 # reuse an existing manifest revision
117 repo.ui.debug(b'reusing known manifest\n')
118 mn = ctx.manifestnode()
119 files = ctx.files()
120 if writechangesetcopy:
121 filesadded = ctx.filesadded()
122 filesremoved = ctx.filesremoved()
123 elif not ctx.files():
124 repo.ui.debug(b'reusing manifest from p1 (no file change)\n')
125 mn = p1.manifestnode()
126 files = []
127 else:
128 mn, files, added, removed = _process_files(tr, ctx, error=error)
129 if writechangesetcopy:
130 filesremoved = removed
131 filesadded = added
132
133 if origctx and origctx.manifestnode() == mn:
134 files = origctx.files()
135
136 if not writefilecopymeta:
137 # If writing only to changeset extras, use None to indicate that
138 # no entry should be written. If writing to both, write an empty
139 # entry to prevent the reader from falling back to reading
140 # filelogs.
141 p1copies = p1copies or None
142 p2copies = p2copies or None
143 filesadded = filesadded or None
144 filesremoved = filesremoved or None
145
146 return mn, files, p1copies, p2copies, filesadded, filesremoved
137 147
138 148
139 def _process_files(tr, ctx, error=False): 149 def _process_files(tr, ctx, error=False):
140 repo = ctx.repo() 150 repo = ctx.repo()
141 p1 = ctx.p1() 151 p1 = ctx.p1()