annotate mercurial/metadata.py @ 46814:c52c3c4cbd3f

copies: detect files as `touched/salvaged` if they only existed on one side The file cannot be merged if there was content to merge on the other side. So the previous record was wrong. In the general case, the file existed only on one side and got touched during the merge. So it should detected as touched. They are a special case where the merge manually prevent the file to be deleted. In this case the file is marked as `salvaged`. The result of this `salvaged` recording, copy-tracing-wise, is the same as recording it as `merged`. This is probably why they were recorded as `merged` in the first place. Differential Revision: https://phab.mercurial-scm.org/D10219
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 15 Mar 2021 13:37:45 +0100
parents bc2519513ae0
children 433cef8f3104
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45764
18c17d63fdab i18n: fix coding tag unsupported by xgettext
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 45735
diff changeset
1 # coding: utf-8
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
2 # metadata.py -- code related to various metadata computation and access.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
3 #
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
4 # Copyright 2019 Google, Inc <martinvonz@google.com>
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
5 # Copyright 2020 Pierre-Yves David <pierre-yves.david@octobus.net>
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
6 #
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
7 # This software may be used and distributed according to the terms of the
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
8 # GNU General Public License version 2 or any later version.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
9 from __future__ import absolute_import, print_function
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
10
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
11 import multiprocessing
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
12 import struct
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
13
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
14 from .node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
15 nullid,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
16 nullrev,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
17 )
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
18 from . import (
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
19 error,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
20 pycompat,
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
21 requirements as requirementsmod,
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
22 util,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
23 )
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
24
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
25 from .revlogutils import (
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
26 flagutil as sidedataflag,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
27 sidedata as sidedatamod,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
28 )
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
29
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
30
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
31 class ChangingFiles(object):
45621
646a676f5365 changing-files: fix docstring
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45613
diff changeset
32 """A class recording the changes made to files by a changeset
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
33
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
34 Actions performed on files are gathered into 3 sets:
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
35
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
36 - added: files actively added in the changeset.
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
37 - merged: files whose history got merged
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
38 - removed: files removed in the revision
45659
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
39 - salvaged: files that might have been deleted by a merge but were not
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
40 - touched: files affected by the merge
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
41
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
42 and copies information is held by 2 mappings
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
43
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
44 - copied_from_p1: {"<new-name>": "<source-name-in-p1>"} mapping for copies
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
45 - copied_from_p2: {"<new-name>": "<source-name-in-p2>"} mapping for copies
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
46
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
47 See their inline help for details.
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
48 """
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
49
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
50 def __init__(
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
51 self,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
52 touched=None,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
53 added=None,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
54 removed=None,
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
55 merged=None,
45659
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
56 salvaged=None,
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
57 p1_copies=None,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
58 p2_copies=None,
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
59 ):
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
60 self._added = set(() if added is None else added)
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
61 self._merged = set(() if merged is None else merged)
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
62 self._removed = set(() if removed is None else removed)
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
63 self._touched = set(() if touched is None else touched)
45659
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
64 self._salvaged = set(() if salvaged is None else salvaged)
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
65 self._touched.update(self._added)
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
66 self._touched.update(self._merged)
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
67 self._touched.update(self._removed)
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
68 self._p1_copies = dict(() if p1_copies is None else p1_copies)
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
69 self._p2_copies = dict(() if p2_copies is None else p2_copies)
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
70
45507
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
71 def __eq__(self, other):
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
72 return (
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
73 self.added == other.added
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
74 and self.merged == other.merged
45507
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
75 and self.removed == other.removed
45659
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
76 and self.salvaged == other.salvaged
45507
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
77 and self.touched == other.touched
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
78 and self.copied_from_p1 == other.copied_from_p1
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
79 and self.copied_from_p2 == other.copied_from_p2
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
80 )
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
81
45728
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
82 @property
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
83 def has_copies_info(self):
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
84 return bool(
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
85 self.removed
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
86 or self.merged
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
87 or self.salvaged
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
88 or self.copied_from_p1
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
89 or self.copied_from_p2
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
90 )
232c88dd89e3 changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45669
diff changeset
91
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
92 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
93 def added(self):
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
94 """files actively added in the changeset
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
95
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
96 Any file present in that revision that was absent in all the changeset's
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
97 parents.
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
98
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
99 In case of merge, this means a file absent in one of the parents but
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
100 existing in the other will *not* be contained in this set. (They were
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
101 added by an ancestor)
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
102 """
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
103 return frozenset(self._added)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
104
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
105 def mark_added(self, filename):
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
106 if 'added' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
107 del self.added
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
108 self._added.add(filename)
45622
42bb6c4f8106 changing-files: always use `mark_touched` to update the touched set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45621
diff changeset
109 self.mark_touched(filename)
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
110
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
111 def update_added(self, filenames):
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
112 for f in filenames:
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
113 self.mark_added(f)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
114
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
115 @util.propertycache
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
116 def merged(self):
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
117 """files actively merged during a merge
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
118
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
119 Any modified files which had modification on both size that needed merging.
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
120
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
121 In this case a new filenode was created and it has two parents.
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
122 """
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
123 return frozenset(self._merged)
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
124
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
125 def mark_merged(self, filename):
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
126 if 'merged' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
127 del self.merged
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
128 self._merged.add(filename)
45622
42bb6c4f8106 changing-files: always use `mark_touched` to update the touched set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45621
diff changeset
129 self.mark_touched(filename)
45611
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
130
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
131 def update_merged(self, filenames):
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
132 for f in filenames:
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
133 self.mark_merged(f)
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
134
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
135 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
136 def removed(self):
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
137 """files actively removed by the changeset
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
138
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
139 In case of merge this will only contain the set of files removing "new"
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
140 content. For any file absent in the current changeset:
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
141
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
142 a) If the file exists in both parents, it is clearly "actively" removed
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
143 by this changeset.
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
144
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
145 b) If a file exists in only one parent and in none of the common
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
146 ancestors, then the file was newly added in one of the merged branches
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
147 and then got "actively" removed.
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
148
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
149 c) If a file exists in only one parent and at least one of the common
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
150 ancestors using the same filenode, then the file was unchanged on one
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
151 side and deleted on the other side. The merge "passively" propagated
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
152 that deletion, but didn't "actively" remove the file. In this case the
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
153 file is *not* included in the `removed` set.
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
154
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
155 d) If a file exists in only one parent and at least one of the common
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
156 ancestors using a different filenode, then the file was changed on one
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
157 side and removed on the other side. The merge process "actively"
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
158 decided to drop the new change and delete the file. Unlike in the
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
159 previous case, (c), the file included in the `removed` set.
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
160
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
161 Summary table for merge:
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
162
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
163 case | exists in parents | exists in gca || removed
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
164 (a) | both | * || yes
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
165 (b) | one | none || yes
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
166 (c) | one | same filenode || no
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
167 (d) | one | new filenode || yes
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
168 """
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
169 return frozenset(self._removed)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
170
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
171 def mark_removed(self, filename):
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
172 if 'removed' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
173 del self.removed
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
174 self._removed.add(filename)
45622
42bb6c4f8106 changing-files: always use `mark_touched` to update the touched set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45621
diff changeset
175 self.mark_touched(filename)
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
176
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
177 def update_removed(self, filenames):
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
178 for f in filenames:
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
179 self.mark_removed(f)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
180
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
181 @util.propertycache
45659
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
182 def salvaged(self):
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
183 """files that might have been deleted by a merge, but still exists.
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
184
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
185 During a merge, the manifest merging might select some files for
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
186 removal, or for a removed/changed conflict. If at commit time the file
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
187 still exists, its removal was "reverted" and the file is "salvaged"
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
188 """
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
189 return frozenset(self._salvaged)
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
190
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
191 def mark_salvaged(self, filename):
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
192 if "salvaged" in vars(self):
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
193 del self.salvaged
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
194 self._salvaged.add(filename)
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
195 self.mark_touched(filename)
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
196
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
197 def update_salvaged(self, filenames):
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
198 for f in filenames:
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
199 self.mark_salvaged(f)
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
200
a475db79d84d changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45635
diff changeset
201 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
202 def touched(self):
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
203 """files either actively modified, added or removed"""
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
204 return frozenset(self._touched)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
205
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
206 def mark_touched(self, filename):
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
207 if 'touched' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
208 del self.touched
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
209 self._touched.add(filename)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
210
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
211 def update_touched(self, filenames):
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
212 for f in filenames:
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
213 self.mark_touched(f)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
214
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
215 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
216 def copied_from_p1(self):
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
217 return self._p1_copies.copy()
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
218
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
219 def mark_copied_from_p1(self, source, dest):
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
220 if 'copied_from_p1' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
221 del self.copied_from_p1
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
222 self._p1_copies[dest] = source
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
223
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
224 def update_copies_from_p1(self, copies):
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
225 for dest, source in copies.items():
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
226 self.mark_copied_from_p1(source, dest)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
227
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
228 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
229 def copied_from_p2(self):
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
230 return self._p2_copies.copy()
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
231
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
232 def mark_copied_from_p2(self, source, dest):
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
233 if 'copied_from_p2' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
234 del self.copied_from_p2
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
235 self._p2_copies[dest] = source
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
236
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
237 def update_copies_from_p2(self, copies):
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
238 for dest, source in copies.items():
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
239 self.mark_copied_from_p2(source, dest)
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
240
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
241
45663
cf474af69766 changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45660
diff changeset
242 def compute_all_files_changes(ctx):
cf474af69766 changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45660
diff changeset
243 """compute the files changed by a revision"""
45666
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
244 p1 = ctx.p1()
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
245 p2 = ctx.p2()
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
246 if p1.rev() == nullrev and p2.rev() == nullrev:
45666
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
247 return _process_root(ctx)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
248 elif p1.rev() != nullrev and p2.rev() == nullrev:
45667
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
249 return _process_linear(p1, ctx)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
250 elif p1.rev() == nullrev and p2.rev() != nullrev:
45667
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
251 # In the wild, one can encounter changeset where p1 is null but p2 is not
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
252 return _process_linear(p1, ctx, parent=2)
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
253 elif p1.rev() == p2.rev():
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
254 # In the wild, one can encounter such "non-merge"
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
255 return _process_linear(p1, ctx)
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
256 else:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
257 return _process_merge(p1, p2, ctx)
45663
cf474af69766 changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45660
diff changeset
258
cf474af69766 changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45660
diff changeset
259
45666
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
260 def _process_root(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
261 """compute the appropriate changed files for a changeset with no parents"""
45666
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
262 # Simple, there was nothing before it, so everything is added.
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
263 md = ChangingFiles()
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
264 manifest = ctx.manifest()
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
265 for filename in manifest:
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
266 md.mark_added(filename)
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
267 return md
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
268
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
269
45667
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
270 def _process_linear(parent_ctx, children_ctx, parent=1):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
271 """compute the appropriate changed files for a changeset with a single parent"""
45667
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
272 md = ChangingFiles()
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
273 parent_manifest = parent_ctx.manifest()
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
274 children_manifest = children_ctx.manifest()
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
275
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
276 copies_candidate = []
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
277
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
278 for filename, d in parent_manifest.diff(children_manifest).items():
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
279 if d[1][0] is None:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
280 # no filenode for the "new" value, file is absent
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
281 md.mark_removed(filename)
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
282 else:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
283 copies_candidate.append(filename)
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
284 if d[0][0] is None:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
285 # not filenode for the "old" value file was absent
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
286 md.mark_added(filename)
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
287 else:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
288 # filenode for both "old" and "new"
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
289 md.mark_touched(filename)
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
290
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
291 if parent == 1:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
292 copied = md.mark_copied_from_p1
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
293 elif parent == 2:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
294 copied = md.mark_copied_from_p2
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
295 else:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
296 assert False, "bad parent value %d" % parent
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
297
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
298 for filename in copies_candidate:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
299 copy_info = children_ctx[filename].renamed()
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
300 if copy_info:
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
301 source, srcnode = copy_info
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
302 copied(source, filename)
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
303
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
304 return md
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
305
0303fc1f43f8 changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45666
diff changeset
306
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
307 def _process_merge(p1_ctx, p2_ctx, ctx):
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
308 """compute the appropriate changed files for a changeset with two parents
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
309
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
310 This is a more advance case. The information we need to record is summarise
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
311 in the following table:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
312
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
313 ┌──────────────┬──────────────┬──────────────┬──────────────┬──────────────┐
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
314 │ diff ╲ diff │ ø │ (Some, None) │ (None, Some) │ (Some, Some) │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
315 │ p2 ╲ p1 │ │ │ │ │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
316 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
317 │ │ │🄱 No Changes │🄳 No Changes │ │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
318 │ ø │🄰 No Changes │ OR │ OR │🄵 No Changes │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
319 │ │ │🄲 Deleted[1] │🄴 Salvaged[2]│ [3] │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
320 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
321 │ │🄶 No Changes │ │ │ │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
322 │ (Some, None) │ OR │🄻 Deleted │ ø │ ø │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
323 │ │🄷 Deleted[1] │ │ │ │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
324 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
46814
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
325 │ │🄸 No Changes │ │ │ 🄽 Touched │
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
326 │ (None, Some) │ OR │ ø │🄼 Added │OR 🅀 Salvaged │
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
327 │ │🄹 Salvaged[2]│ │ (copied?) │ (copied?) │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
328 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
46814
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
329 │ │ │ │ 🄾 Touched │ │
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
330 │ (Some, Some) │🄺 No Changes │ ø │OR 🅁 Salvaged │🄿 Merged │
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
331 │ │ [3] │ │ (copied?) │ (copied?) │
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
332 └──────────────┴──────────────┴──────────────┴──────────────┴──────────────┘
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
333
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
334 Special case [1]:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
335
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
336 The situation is:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
337 - parent-A: file exists,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
338 - parent-B: no file,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
339 - working-copy: no file.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
340
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
341 Detecting a "deletion" will depend on the presence of actual change on
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
342 the "parent-A" branch:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
343
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
344 Subcase 🄱 or 🄶 : if the state of the file in "parent-A" is unchanged
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
345 compared to the merge ancestors, then parent-A branch left the file
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
346 untouched while parent-B deleted it. We simply apply the change from
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
347 "parent-B" branch the file was automatically dropped.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
348 The result is:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
349 - file is not recorded as touched by the merge.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
350
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
351 Subcase 🄲 or 🄷 : otherwise, the change from parent-A branch were explicitly dropped and
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
352 the file was "deleted again". From a user perspective, the message
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
353 about "locally changed" while "remotely deleted" (or the other way
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
354 around) was issued and the user chose to deleted the file.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
355 The result:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
356 - file is recorded as touched by the merge.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
357
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
358
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
359 Special case [2]:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
360
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
361 The situation is:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
362 - parent-A: no file,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
363 - parent-B: file,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
364 - working-copy: file (same content as parent-B).
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
365
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
366 There are three subcases depending on the ancestors contents:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
367
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
368 - A) the file is missing in all ancestors,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
369 - B) at least one ancestor has the file with filenode ≠ from parent-B,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
370 - C) all ancestors use the same filenode as parent-B,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
371
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
372 Subcase (A) is the simpler, nothing happend on parent-A side while
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
373 parent-B added it.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
374
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
375 The result:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
376 - the file is not marked as touched by the merge.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
377
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
378 Subcase (B) is the counter part of "Special case [1]", the file was
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
379 modified on parent-B side, while parent-A side deleted it. However this
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
380 time, the conflict was solved by keeping the file (and its
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
381 modification). We consider the file as "salvaged".
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
382
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
383 The result:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
384 - the file is marked as "salvaged" by the merge.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
385
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
386 Subcase (C) is subtle variation of the case above. In this case, the
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
387 file in unchanged on the parent-B side and actively removed on the
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
388 parent-A side. So the merge machinery correctly decide it should be
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
389 removed. However, the file was explicitly restored to its parent-B
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
390 content before the merge was commited. The file is be marked
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
391 as salvaged too. From the merge result perspective, this is similar to
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
392 Subcase (B), however from the merge resolution perspective they differ
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
393 since in (C), there was some conflict not obvious solution to the
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
394 merge (That got reversed)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
395
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
396 Special case [3]:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
397
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
398 The situation is:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
399 - parent-A: file,
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
400 - parent-B: file (different filenode as parent-A),
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
401 - working-copy: file (same filenode as parent-B).
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
402
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
403 This case is in theory much simple, for this to happens, this mean the
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
404 filenode in parent-A is purely replacing the one in parent-B (either a
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
405 descendant, or a full new file history, see changeset). So the merge
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
406 introduce no changes, and the file is not affected by the merge...
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
407
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
408 However, in the wild it is possible to find commit with the above is not
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
409 True. For example repository have some commit where the *new* node is an
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
410 ancestor of the node in parent-A, or where parent-A and parent-B are two
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
411 branches of the same file history, yet not merge-filenode were created
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
412 (while the "merge" should have led to a "modification").
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
413
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
414 Detecting such cases (and not recording the file as modified) would be a
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
415 nice bonus. However do not any of this yet.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
416 """
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
417
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
418 md = ChangingFiles()
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
419
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
420 m = ctx.manifest()
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
421 p1m = p1_ctx.manifest()
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
422 p2m = p2_ctx.manifest()
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
423 diff_p1 = p1m.diff(m)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
424 diff_p2 = p2m.diff(m)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
425
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
426 cahs = ctx.repo().changelog.commonancestorsheads(
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
427 p1_ctx.node(), p2_ctx.node()
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
428 )
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
429 if not cahs:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
430 cahs = [nullrev]
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
431 mas = [ctx.repo()[r].manifest() for r in cahs]
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
432
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
433 copy_candidates = []
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
434
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
435 # Dealing with case 🄰 happens automatically. Since there are no entry in
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
436 # d1 nor d2, we won't iterate on it ever.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
437
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
438 # Iteration over d1 content will deal with all cases, but the one in the
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
439 # first column of the table.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
440 for filename, d1 in diff_p1.items():
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
441
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
442 d2 = diff_p2.pop(filename, None)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
443
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
444 if d2 is None:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
445 # this deal with the first line of the table.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
446 _process_other_unchanged(md, mas, filename, d1)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
447 else:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
448
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
449 if d1[0][0] is None and d2[0][0] is None:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
450 # case 🄼 — both deleted the file.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
451 md.mark_added(filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
452 copy_candidates.append(filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
453 elif d1[1][0] is None and d2[1][0] is None:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
454 # case 🄻 — both deleted the file.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
455 md.mark_removed(filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
456 elif d1[1][0] is not None and d2[1][0] is not None:
46814
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
457 if d1[0][0] is None or d2[0][0] is None:
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
458 if any(_find(ma, filename) is not None for ma in mas):
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
459 # case 🅀 or 🅁
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
460 md.mark_salvaged(filename)
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
461 else:
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
462 # case 🄽 🄾 : touched
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
463 md.mark_touched(filename)
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
464 else:
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
465 # case 🄿 : merged
c52c3c4cbd3f copies: detect files as `touched/salvaged` if they only existed on one side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46713
diff changeset
466 md.mark_merged(filename)
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
467 copy_candidates.append(filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
468 else:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
469 # Impossible case, the post-merge file status cannot be None on
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
470 # one side and Something on the other side.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
471 assert False, "unreachable"
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
472
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
473 # Iteration over remaining d2 content deal with the first column of the
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
474 # table.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
475 for filename, d2 in diff_p2.items():
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
476 _process_other_unchanged(md, mas, filename, d2)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
477
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
478 for filename in copy_candidates:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
479 copy_info = ctx[filename].renamed()
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
480 if copy_info:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
481 source, srcnode = copy_info
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
482 if source in p1_ctx and p1_ctx[source].filenode() == srcnode:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
483 md.mark_copied_from_p1(source, filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
484 elif source in p2_ctx and p2_ctx[source].filenode() == srcnode:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
485 md.mark_copied_from_p2(source, filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
486 return md
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
487
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
488
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
489 def _find(manifest, filename):
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
490 """return the associate filenode or None"""
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
491 if filename not in manifest:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
492 return None
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
493 return manifest.find(filename)[0]
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
494
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
495
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
496 def _process_other_unchanged(md, mas, filename, diff):
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
497 source_node = diff[0][0]
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
498 target_node = diff[1][0]
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
499
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
500 if source_node is not None and target_node is None:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
501 if any(not _find(ma, filename) == source_node for ma in mas):
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
502 # case 🄲 of 🄷
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
503 md.mark_removed(filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
504 # else, we have case 🄱 or 🄶 : no change need to be recorded
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
505 elif source_node is None and target_node is not None:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
506 if any(_find(ma, filename) is not None for ma in mas):
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
507 # case 🄴 or 🄹
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
508 md.mark_salvaged(filename)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
509 # else, we have case 🄳 or 🄸 : simple merge without intervention
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
510 elif source_node is not None and target_node is not None:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
511 # case 🄵 or 🄺 : simple merge without intervention
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
512 #
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
513 # In buggy case where source_node is not an ancestors of target_node.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
514 # There should have a been a new filenode created, recording this as
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
515 # "modified". We do not deal with them yet.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
516 pass
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
517 else:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
518 # An impossible case, the diff algorithm should not return entry if the
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
519 # file is missing on both side.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
520 assert False, "unreachable"
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
521
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
522
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
523 def _missing_from_all_ancestors(mas, filename):
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
524 return all(_find(ma, filename) is None for ma in mas)
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
525
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
526
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
527 def computechangesetfilesadded(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
528 """return the list of files added in a changeset"""
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
529 added = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
530 for f in ctx.files():
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
531 if not any(f in p for p in ctx.parents()):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
532 added.append(f)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
533 return added
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
534
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
535
44941
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
536 def get_removal_filter(ctx, x=None):
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
537 """return a function to detect files "wrongly" detected as `removed`
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
538
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
539 When a file is removed relative to p1 in a merge, this
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
540 function determines whether the absence is due to a
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
541 deletion from a parent, or whether the merge commit
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
542 itself deletes the file. We decide this by doing a
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
543 simplified three way merge of the manifest entry for
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
544 the file. There are two ways we decide the merge
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
545 itself didn't delete a file:
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
546 - neither parent (nor the merge) contain the file
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
547 - exactly one parent contains the file, and that
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
548 parent has the same filelog entry as the merge
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
549 ancestor (or all of them if there two). In other
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
550 words, that parent left the file unchanged while the
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
551 other one deleted it.
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
552 One way to think about this is that deleting a file is
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
553 similar to emptying it, so the list of changed files
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
554 should be similar either way. The computation
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
555 described above is not done directly in _filecommit
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
556 when creating the list of changed files, however
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
557 it does something very similar by comparing filelog
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
558 nodes.
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
559 """
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
560
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
561 if x is not None:
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
562 p1, p2, m1, m2 = x
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
563 else:
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
564 p1 = ctx.p1()
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
565 p2 = ctx.p2()
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
566 m1 = p1.manifest()
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
567 m2 = p2.manifest()
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
568
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
569 @util.cachefunc
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
570 def mas():
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
571 p1n = p1.node()
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
572 p2n = p2.node()
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
573 cahs = ctx.repo().changelog.commonancestorsheads(p1n, p2n)
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
574 if not cahs:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
575 cahs = [nullrev]
44941
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
576 return [ctx.repo()[r].manifest() for r in cahs]
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
577
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
578 def deletionfromparent(f):
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
579 if f in m1:
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
580 return f not in m2 and all(
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
581 f in ma and ma.find(f) == m1.find(f) for ma in mas()
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
582 )
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
583 elif f in m2:
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
584 return all(f in ma and ma.find(f) == m2.find(f) for ma in mas())
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
585 else:
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
586 return True
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
587
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
588 return deletionfromparent
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
589
edd08aa193fb files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44940
diff changeset
590
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
591 def computechangesetfilesremoved(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
592 """return the list of files removed in a changeset"""
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
593 removed = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
594 for f in ctx.files():
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
595 if f not in ctx:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
596 removed.append(f)
44942
25512a65cefd metadata: filter the `removed` set to only contains relevant data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44941
diff changeset
597 if removed:
25512a65cefd metadata: filter the `removed` set to only contains relevant data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44941
diff changeset
598 rf = get_removal_filter(ctx)
25512a65cefd metadata: filter the `removed` set to only contains relevant data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44941
diff changeset
599 removed = [r for r in removed if not rf(r)]
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
600 return removed
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
601
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
602
45613
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
603 def computechangesetfilesmerged(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
604 """return the list of files merged in a changeset"""
45613
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
605 merged = []
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
606 if len(ctx.parents()) < 2:
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
607 return merged
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
608 for f in ctx.files():
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
609 if f in ctx:
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
610 fctx = ctx[f]
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
611 parents = fctx._filelog.parents(fctx._filenode)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
612 if parents[1] != nullid:
45613
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
613 merged.append(f)
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
614 return merged
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
615
ddcee0b0fd67 changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45611
diff changeset
616
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
617 def computechangesetcopies(ctx):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
618 """return the copies data for a changeset
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
619
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
620 The copies data are returned as a pair of dictionnary (p1copies, p2copies).
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
621
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
622 Each dictionnary are in the form: `{newname: oldname}`
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
623 """
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
624 p1copies = {}
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
625 p2copies = {}
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
626 p1 = ctx.p1()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
627 p2 = ctx.p2()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
628 narrowmatch = ctx._repo.narrowmatch()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
629 for dst in ctx.files():
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
630 if not narrowmatch(dst) or dst not in ctx:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
631 continue
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
632 copied = ctx[dst].renamed()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
633 if not copied:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
634 continue
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
635 src, srcnode = copied
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
636 if src in p1 and p1[src].filenode() == srcnode:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
637 p1copies[dst] = src
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
638 elif src in p2 and p2[src].filenode() == srcnode:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
639 p2copies[dst] = src
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
640 return p1copies, p2copies
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
641
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
642
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
643 def encodecopies(files, copies):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
644 items = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
645 for i, dst in enumerate(files):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
646 if dst in copies:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
647 items.append(b'%d\0%s' % (i, copies[dst]))
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
648 if len(items) != len(copies):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
649 raise error.ProgrammingError(
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
650 b'some copy targets missing from file list'
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
651 )
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
652 return b"\n".join(items)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
653
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
654
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
655 def decodecopies(files, data):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
656 try:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
657 copies = {}
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
658 if not data:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
659 return copies
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
660 for l in data.split(b'\n'):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
661 strindex, src = l.split(b'\0')
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
662 i = int(strindex)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
663 dst = files[i]
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
664 copies[dst] = src
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
665 return copies
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
666 except (ValueError, IndexError):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
667 # Perhaps someone had chosen the same key name (e.g. "p1copies") and
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
668 # used different syntax for the value.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
669 return None
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
670
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
671
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
672 def encodefileindices(files, subset):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
673 subset = set(subset)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
674 indices = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
675 for i, f in enumerate(files):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
676 if f in subset:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
677 indices.append(b'%d' % i)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
678 return b'\n'.join(indices)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
679
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
680
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
681 def decodefileindices(files, data):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
682 try:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
683 subset = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
684 if not data:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
685 return subset
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
686 for strindex in data.split(b'\n'):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
687 i = int(strindex)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
688 if i < 0 or i >= len(files):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
689 return None
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
690 subset.append(files[i])
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
691 return subset
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
692 except (ValueError, IndexError):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
693 # Perhaps someone had chosen the same key name (e.g. "added") and
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
694 # used different syntax for the value.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
695 return None
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
696
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
697
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
698 # see mercurial/helptext/internals/revlogs.txt for details about the format
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
699
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
700 ACTION_MASK = int("111" "00", 2)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
701 # note: untouched file used as copy source will as `000` for this mask.
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
702 ADDED_FLAG = int("001" "00", 2)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
703 MERGED_FLAG = int("010" "00", 2)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
704 REMOVED_FLAG = int("011" "00", 2)
45669
e53778ad64bf salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45668
diff changeset
705 SALVAGED_FLAG = int("100" "00", 2)
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
706 TOUCHED_FLAG = int("101" "00", 2)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
707
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
708 COPIED_MASK = int("11", 2)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
709 COPIED_FROM_P1_FLAG = int("10", 2)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
710 COPIED_FROM_P2_FLAG = int("11", 2)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
711
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
712 # structure is <flag><filename-end><copy-source>
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
713 INDEX_HEADER = struct.Struct(">L")
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
714 INDEX_ENTRY = struct.Struct(">bLL")
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
715
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
716
45569
64d18e9e8508 sidedata: rename `encode_copies_sidedata` to `encode_files_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45507
diff changeset
717 def encode_files_sidedata(files):
45669
e53778ad64bf salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45668
diff changeset
718 all_files = set(files.touched)
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
719 all_files.update(files.copied_from_p1.values())
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
720 all_files.update(files.copied_from_p2.values())
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
721 all_files = sorted(all_files)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
722 file_idx = {f: i for (i, f) in enumerate(all_files)}
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
723 file_idx[None] = 0
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
724
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
725 chunks = [INDEX_HEADER.pack(len(all_files))]
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
726
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
727 filename_length = 0
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
728 for f in all_files:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
729 filename_size = len(f)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
730 filename_length += filename_size
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
731 flag = 0
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
732 if f in files.added:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
733 flag |= ADDED_FLAG
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
734 elif f in files.merged:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
735 flag |= MERGED_FLAG
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
736 elif f in files.removed:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
737 flag |= REMOVED_FLAG
45669
e53778ad64bf salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45668
diff changeset
738 elif f in files.salvaged:
e53778ad64bf salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45668
diff changeset
739 flag |= SALVAGED_FLAG
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
740 elif f in files.touched:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
741 flag |= TOUCHED_FLAG
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
742
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
743 copy = None
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
744 if f in files.copied_from_p1:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
745 flag |= COPIED_FROM_P1_FLAG
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
746 copy = files.copied_from_p1.get(f)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
747 elif f in files.copied_from_p2:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
748 copy = files.copied_from_p2.get(f)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
749 flag |= COPIED_FROM_P2_FLAG
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
750 copy_idx = file_idx[copy]
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
751 chunks.append(INDEX_ENTRY.pack(flag, filename_length, copy_idx))
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
752 chunks.extend(all_files)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
753 return {sidedatamod.SD_FILES: b''.join(chunks)}
45325
c6eea5804551 commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45323
diff changeset
754
c6eea5804551 commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45323
diff changeset
755
45635
9003e6524f78 changing-files: drop the now useless changelogrevision argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45634
diff changeset
756 def decode_files_sidedata(sidedata):
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
757 md = ChangingFiles()
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
758 raw = sidedata.get(sidedatamod.SD_FILES)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
759
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
760 if raw is None:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
761 return md
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
762
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
763 copies = []
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
764 all_files = []
45571
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
765
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
766 assert len(raw) >= INDEX_HEADER.size
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
767 total_files = INDEX_HEADER.unpack_from(raw, 0)[0]
45571
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
768
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
769 offset = INDEX_HEADER.size
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
770 file_offset_base = offset + (INDEX_ENTRY.size * total_files)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
771 file_offset_last = file_offset_base
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
772
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
773 assert len(raw) >= file_offset_base
45571
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
774
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
775 for idx in range(total_files):
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
776 flag, file_end, copy_idx = INDEX_ENTRY.unpack_from(raw, offset)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
777 file_end += file_offset_base
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
778 filename = raw[file_offset_last:file_end]
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
779 filesize = file_end - file_offset_last
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
780 assert len(filename) == filesize
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
781 offset += INDEX_ENTRY.size
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
782 file_offset_last = file_end
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
783 all_files.append(filename)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
784 if flag & ACTION_MASK == ADDED_FLAG:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
785 md.mark_added(filename)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
786 elif flag & ACTION_MASK == MERGED_FLAG:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
787 md.mark_merged(filename)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
788 elif flag & ACTION_MASK == REMOVED_FLAG:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
789 md.mark_removed(filename)
45669
e53778ad64bf salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45668
diff changeset
790 elif flag & ACTION_MASK == SALVAGED_FLAG:
e53778ad64bf salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45668
diff changeset
791 md.mark_salvaged(filename)
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
792 elif flag & ACTION_MASK == TOUCHED_FLAG:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
793 md.mark_touched(filename)
45571
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
794
45634
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
795 copied = None
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
796 if flag & COPIED_MASK == COPIED_FROM_P1_FLAG:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
797 copied = md.mark_copied_from_p1
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
798 elif flag & COPIED_MASK == COPIED_FROM_P2_FLAG:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
799 copied = md.mark_copied_from_p2
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
800
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
801 if copied is not None:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
802 copies.append((copied, filename, copy_idx))
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
803
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
804 for copied, filename, copy_idx in copies:
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
805 copied(all_files[copy_idx], filename)
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
806
9a6b409b8ebc changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45623
diff changeset
807 return md
45571
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
808
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
809
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
810 def _getsidedata(srcrepo, rev):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
811 ctx = srcrepo[rev]
45663
cf474af69766 changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45660
diff changeset
812 files = compute_all_files_changes(ctx)
45734
53c265a6fc83 sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45728
diff changeset
813 return encode_files_sidedata(files), files.has_copies_info
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
814
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
815
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
816 def copies_sidedata_computer(repo, revlog, rev, existing_sidedata):
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
817 return _getsidedata(repo, rev)[0]
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
818
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
819
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
820 def set_sidedata_spec_for_repo(repo):
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
821 if requirementsmod.COPIESSDC_REQUIREMENT in repo.requirements:
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
822 repo.register_wanted_sidedata(sidedatamod.SD_FILES)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
823 repo.register_sidedata_computer(
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
824 b"changelog",
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
825 sidedatamod.SD_FILES,
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
826 (sidedatamod.SD_FILES,),
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
827 copies_sidedata_computer,
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
828 )
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
829
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46618
diff changeset
830
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
831 def getsidedataadder(srcrepo, destrepo):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
832 use_w = srcrepo.ui.configbool(b'experimental', b'worker.repository-upgrade')
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
833 if pycompat.iswindows or not use_w:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
834 return _get_simple_sidedata_adder(srcrepo, destrepo)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
835 else:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
836 return _get_worker_sidedata_adder(srcrepo, destrepo)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
837
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
838
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
839 def _sidedata_worker(srcrepo, revs_queue, sidedata_queue, tokens):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
840 """The function used by worker precomputing sidedata
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
841
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
842 It read an input queue containing revision numbers
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
843 It write in an output queue containing (rev, <sidedata-map>)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
844
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
845 The `None` input value is used as a stop signal.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
846
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
847 The `tokens` semaphore is user to avoid having too many unprocessed
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
848 entries. The workers needs to acquire one token before fetching a task.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
849 They will be released by the consumer of the produced data.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
850 """
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
851 tokens.acquire()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
852 rev = revs_queue.get()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
853 while rev is not None:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
854 data = _getsidedata(srcrepo, rev)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
855 sidedata_queue.put((rev, data))
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
856 tokens.acquire()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
857 rev = revs_queue.get()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
858 # processing of `None` is completed, release the token.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
859 tokens.release()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
860
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
861
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
862 BUFF_PER_WORKER = 50
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
863
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
864
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
865 def _get_worker_sidedata_adder(srcrepo, destrepo):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
866 """The parallel version of the sidedata computation
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
867
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
868 This code spawn a pool of worker that precompute a buffer of sidedata
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
869 before we actually need them"""
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
870 # avoid circular import copies -> scmutil -> worker -> copies
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
871 from . import worker
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
872
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
873 nbworkers = worker._numworkers(srcrepo.ui)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
874
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
875 tokens = multiprocessing.BoundedSemaphore(nbworkers * BUFF_PER_WORKER)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
876 revsq = multiprocessing.Queue()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
877 sidedataq = multiprocessing.Queue()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
878
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
879 assert srcrepo.filtername is None
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
880 # queue all tasks beforehand, revision numbers are small and it make
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
881 # synchronisation simpler
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
882 #
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
883 # Since the computation for each node can be quite expensive, the overhead
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
884 # of using a single queue is not revelant. In practice, most computation
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
885 # are fast but some are very expensive and dominate all the other smaller
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
886 # cost.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
887 for r in srcrepo.changelog.revs():
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
888 revsq.put(r)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
889 # queue the "no more tasks" markers
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
890 for i in range(nbworkers):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
891 revsq.put(None)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
892
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
893 allworkers = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
894 for i in range(nbworkers):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
895 args = (srcrepo, revsq, sidedataq, tokens)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
896 w = multiprocessing.Process(target=_sidedata_worker, args=args)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
897 allworkers.append(w)
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
898 w.start()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
899
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
900 # dictionnary to store results for revision higher than we one we are
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
901 # looking for. For example, if we need the sidedatamap for 42, and 43 is
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
902 # received, when shelve 43 for later use.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
903 staging = {}
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
904
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
905 def sidedata_companion(revlog, rev):
45734
53c265a6fc83 sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45728
diff changeset
906 data = {}, False
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
907 if util.safehasattr(revlog, b'filteredrevs'): # this is a changelog
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
908 # Is the data previously shelved ?
46618
dde86beca388 copies: tests and fix parallel computation of changed file information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46113
diff changeset
909 data = staging.pop(rev, None)
dde86beca388 copies: tests and fix parallel computation of changed file information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46113
diff changeset
910 if data is None:
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
911 # look at the queued result until we find the one we are lookig
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
912 # for (shelve the other ones)
45734
53c265a6fc83 sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45728
diff changeset
913 r, data = sidedataq.get()
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
914 while r != rev:
45734
53c265a6fc83 sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45728
diff changeset
915 staging[r] = data
46618
dde86beca388 copies: tests and fix parallel computation of changed file information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46113
diff changeset
916 r, data = sidedataq.get()
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
917 tokens.release()
45735
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
918 sidedata, has_copies_info = data
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
919 new_flag = 0
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
920 if has_copies_info:
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
921 new_flag = sidedataflag.REVIDX_HASCOPIESINFO
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
922 return False, (), sidedata, new_flag, 0
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
923
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
924 return sidedata_companion
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
925
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
926
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
927 def _get_simple_sidedata_adder(srcrepo, destrepo):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
928 """The simple version of the sidedata computation
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
929
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
930 It just compute it in the same thread on request"""
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
931
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
932 def sidedatacompanion(revlog, rev):
45735
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
933 sidedata, has_copies_info = {}, False
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
934 if util.safehasattr(revlog, 'filteredrevs'): # this is a changelog
45734
53c265a6fc83 sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45728
diff changeset
935 sidedata, has_copies_info = _getsidedata(srcrepo, rev)
45735
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
936 new_flag = 0
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
937 if has_copies_info:
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
938 new_flag = sidedataflag.REVIDX_HASCOPIESINFO
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
939
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
940 return False, (), sidedata, new_flag, 0
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
941
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
942 return sidedatacompanion
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
943
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
944
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
945 def getsidedataremover(srcrepo, destrepo):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
946 def sidedatacompanion(revlog, rev):
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
947 f = ()
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
948 if util.safehasattr(revlog, 'filteredrevs'): # this is a changelog
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
949 if revlog.flags(rev) & sidedataflag.REVIDX_SIDEDATA:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
950 f = (
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
951 sidedatamod.SD_P1COPIES,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
952 sidedatamod.SD_P2COPIES,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
953 sidedatamod.SD_FILESADDED,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
954 sidedatamod.SD_FILESREMOVED,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
955 )
45735
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
956 return False, f, {}, 0, sidedataflag.REVIDX_HASCOPIESINFO
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
957
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
958 return sidedatacompanion