annotate mercurial/metadata.py @ 51521:0d4a6ab3c8da

branchcache-v3: use more explicit header line The key-value approach is clearer and gives more rooms to have the format evolve in a clear way. It also provides extension (like topic) simpler way to extend the validation scheme. This is just a small evolution, the V3 format is still a work in progress.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 26 Feb 2024 15:44:44 +0100
parents 642e31cb55f0
children 493034cc3265 7d9bd50afe3d
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
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
10 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
11 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
12
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46815
diff changeset
13 from .node import nullrev
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
14 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
15 error,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
16 util,
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
17 )
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
18
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
19 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
20 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
21 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
22 )
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
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
25 class ChangingFiles:
45621
646a676f5365 changing-files: fix docstring
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45613
diff changeset
26 """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
27
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
28 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
29
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
30 - 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
31 - 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
32 - 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
33 - 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
34 - 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
35
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
36 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
37
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
38 - 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
39 - 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
40
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
41 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
42 """
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
43
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
44 def __init__(
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
45 self,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
46 touched=None,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
47 added=None,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
48 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
49 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
50 salvaged=None,
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
51 p1_copies=None,
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
52 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
53 ):
45589
3d5b2b8e93fd changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45571
diff changeset
54 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
55 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
56 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
57 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
58 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
59 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
60 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
61 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
62 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
63 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
64
45507
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
65 def __eq__(self, other):
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
66 return (
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
67 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
68 and self.merged == other.merged
45507
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
69 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
70 and self.salvaged == other.salvaged
45507
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
71 and self.touched == other.touched
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
72 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
73 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
74 )
df87821081ee changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45506
diff changeset
75
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
76 @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
77 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
78 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
79 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
80 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
81 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
82 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
83 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
84 )
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
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
86 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
87 def added(self):
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
88 """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
89
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
90 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
91 parents.
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
92
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
93 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
94 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
95 added by an ancestor)
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
96 """
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
97 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
98
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
99 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
100 if 'added' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
101 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
102 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
103 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
104
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
105 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
106 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
107 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
108
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
109 @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
110 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
111 """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
112
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
113 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
114
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
115 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
116 """
e5578dbe36cb changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45589
diff changeset
117 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
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 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
120 if 'merged' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
121 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
122 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
123 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
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 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
126 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
127 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
128
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
129 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
130 def removed(self):
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
131 """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
132
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
133 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
134 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
135
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
136 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
137 by this 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 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
140 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
141 and then got "actively" removed.
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
142
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
143 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
144 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
145 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
146 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
147 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
148
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
149 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
150 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
151 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
152 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
153 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
154
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
155 Summary table for merge:
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
156
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
157 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
158 (a) | both | * || yes
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
159 (b) | one | none || yes
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
160 (c) | one | same filenode || no
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
161 (d) | one | new filenode || yes
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
162 """
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
163 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
164
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
165 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
166 if 'removed' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
167 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
168 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
169 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
170
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
171 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
172 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
173 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
174
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
175 @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
176 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
177 """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
178
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
179 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
180 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
181 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
182 """
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 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
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 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
186 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
187 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
188 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
189 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
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 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
192 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
193 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
194
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 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
196 def touched(self):
45506
1f50bcc96595 changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45325
diff changeset
197 """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
198 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
199
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
200 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
201 if 'touched' in vars(self):
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
202 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
203 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
204
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
205 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
206 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
207 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
208
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
209 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
210 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
211 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
212
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
213 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
214 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
215 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
216 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
217
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
218 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
219 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
220 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
221
45623
d31483377673 changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45622
diff changeset
222 @util.propertycache
45323
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
223 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
224 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
225
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
226 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
227 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
228 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
229 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
230
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
231 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
232 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
233 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
234
aea6a812f7cb commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44942
diff changeset
235
45663
cf474af69766 changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45660
diff changeset
236 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
237 """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
238 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
239 p2 = ctx.p2()
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
240 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
241 return _process_root(ctx)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
242 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
243 return _process_linear(p1, ctx)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
244 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
245 # 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
246 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
247 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
248 # 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
249 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
250 else:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
251 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
252
cf474af69766 changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45660
diff changeset
253
45666
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
254 def _process_root(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
255 """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
256 # 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
257 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
258 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
259 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
260 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
261 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
262
f6811e5bd994 changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45663
diff changeset
263
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
264 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
265 """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
266 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
267 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
268 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
269
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 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
271
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 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
273 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
274 # 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
275 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
276 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
277 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
278 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
279 # 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
280 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
281 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
282 # 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
283 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
284
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 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
286 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
287 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
288 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
289 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
290 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
291
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 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
293 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
294 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
295 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
296 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
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 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
299
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
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
301 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
302 """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
303
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
304 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
305 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
306
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
307 ┌──────────────┬──────────────┬──────────────┬──────────────┬──────────────┐
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
308 │ 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
309 │ 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
310 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
311 │ │ │🄱 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
312 │ ø │🄰 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
313 │ │ │🄲 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
314 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
315 │ │🄶 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
316 │ (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
317 │ │🄷 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
318 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
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
319 │ │🄸 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
320 │ (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
321 │ │🄹 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
322 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
46815
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
323 │ │ │ │ 🄾 Touched │ 🄿 Merged │
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
324 │ (Some, Some) │🄺 No Changes │ ø │OR 🅁 Salvaged │OR 🅂 Touched │
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
325 │ │ [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
326 └──────────────┴──────────────┴──────────────┴──────────────┴──────────────┘
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
327
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
328 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
329
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
330 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
331 - 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
332 - 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
333 - 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
334
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
335 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
336 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
337
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
338 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
339 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
340 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
341 "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
342 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
343 - 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
344
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
345 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
346 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
347 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
348 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
349 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
350 - 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
351
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
352
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
353 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
354
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 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
356 - 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
357 - 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
358 - 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
359
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
360 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
361
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
362 - 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
363 - 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
364 - 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
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 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
367 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
368
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
369 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
370 - 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
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 (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
373 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
374 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
375 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
376
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
377 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
378 - 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
379
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
380 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
381 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
382 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
383 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
384 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
385 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
386 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
387 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
388 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
389
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
390 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
391
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
392 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
393 - 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
394 - 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
395 - 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
396
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
397 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
398 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
399 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
400 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
401
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
402 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
403 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
404 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
405 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
406 (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
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 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
409 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
410 """
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
411
46815
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
412 repo = ctx.repo()
45668
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
413 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
414
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
415 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
416 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
417 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
418 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
419 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
420
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
421 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
422 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
423 )
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
424 if not cahs:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
425 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
426 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
427
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
428 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
429
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
430 # 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
431 # 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
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 # 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
434 # 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
435 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
436
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
437 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
438
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
439 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
440 # 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
441 _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
442 else:
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 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
445 # 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
446 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
447 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
448 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
449 # 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
450 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
451 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
452 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
453 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
454 # 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
455 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
456 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
457 # 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
458 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
459 else:
46815
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
460 fctx = repo.filectx(filename, fileid=d1[1][0])
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
461 if fctx.p2().rev() == nullrev:
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
462 # case 🅂
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
463 # lets assume we can trust the file history. If the
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
464 # filenode is not a merge, the file was not merged.
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
465 md.mark_touched(filename)
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
466 else:
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
467 # case 🄿
433cef8f3104 copies: distinguish between merged and touched files during upgrade
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46814
diff changeset
468 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
469 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
470 else:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
471 # 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
472 # 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
473 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
474
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
475 # 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
476 # table.
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
477 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
478 _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
479
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
480 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
481 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
482 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
483 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
484 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
485 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
486 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
487 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
488 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
489
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
490
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
491 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
492 """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
493 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
494 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
495 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
496
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
497
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
498 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
499 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
500 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
501
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
502 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
503 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
504 # 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
505 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
506 # 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
507 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
508 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
509 # 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
510 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
511 # 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
512 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
513 # 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
514 #
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
515 # 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
516 # 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
517 # "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
518 pass
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
519 else:
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
520 # 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
521 # 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
522 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
523
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
524
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
525 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
526 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
527
47ad23549b81 changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45667
diff changeset
528
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 def computechangesetfilesadded(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
530 """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
531 added = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
532 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
533 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
534 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
535 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
536
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
537
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
538 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
539 """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
540
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 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
542 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
543 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
544 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
545 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
546 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
547 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
548 - 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
549 - 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
550 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
551 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
552 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
553 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
554 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
555 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
556 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
557 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
558 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
559 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
560 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
561 """
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
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 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
564 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
565 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
566 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
567 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
568 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
569 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
570
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 @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
572 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
573 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
574 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
575 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
576 if not cahs:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
577 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
578 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
579
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 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
581 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
582 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
583 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
584 )
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 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
586 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
587 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
588 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
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 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
591
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
592
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 def computechangesetfilesremoved(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
594 """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
595 removed = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
596 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
597 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
598 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
599 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
600 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
601 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
602 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
603
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
604
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 def computechangesetfilesmerged(ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45764
diff changeset
606 """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
607 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 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
609 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
610 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
611 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
612 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
613 parents = fctx._filelog.parents(fctx._filenode)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46815
diff changeset
614 if parents[1] != ctx.repo().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
615 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
616 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
617
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
618
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
619 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
620 """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
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 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
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 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
625 """
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
626 p1copies = {}
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
627 p2copies = {}
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
628 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
629 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
630 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
631 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
632 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
633 continue
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
634 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
635 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
636 continue
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
637 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
638 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
639 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
640 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
641 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
642 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
643
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
644
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
645 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
646 items = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
647 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
648 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
649 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
650 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
651 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
652 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
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 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
655
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
656
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
657 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
658 try:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
659 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 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
661 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
662 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
663 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
664 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
665 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
666 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
667 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
668 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
669 # 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
670 # 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
671 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
672
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
673
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
674 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
675 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
676 indices = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
677 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
678 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
679 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
680 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
681
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
682
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
683 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
684 try:
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
685 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 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
687 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
688 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
689 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
690 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
691 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
692 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
693 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
694 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
695 # 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
696 # 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
697 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
698
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
699
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
700 # 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
701
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 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
703 # 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
704 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
705 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
706 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
707 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
708 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
709
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_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
711 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
712 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
713
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 # 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
715 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
716 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
717
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
718
45569
64d18e9e8508 sidedata: rename `encode_copies_sidedata` to `encode_files_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45507
diff changeset
719 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
720 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
721 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
722 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
723 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
724 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
725 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
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 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
728
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_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
730 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
731 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
732 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
733 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
734 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
735 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
736 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
737 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
738 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
739 flag |= REMOVED_FLAG
45669
e53778ad64bf salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45668
diff changeset
740 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
741 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
742 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
743 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
744
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 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
746 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
747 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
748 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
749 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
750 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
751 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
752 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
753 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
754 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
755 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
756
c6eea5804551 commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45323
diff changeset
757
45635
9003e6524f78 changing-files: drop the now useless changelogrevision argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45634
diff changeset
758 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
759 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
760 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
761
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 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
763 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
764
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
765 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
766 all_files = []
45571
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
767
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
768 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
769 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
770
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
771 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
772 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
773 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
774
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 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
776
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
777 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
778 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
779 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
780 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
781 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
782 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
783 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
784 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
785 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
786 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
787 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
788 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
789 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
790 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
791 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
792 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
793 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
794 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
795 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
796
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
797 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
798 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
799 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
800 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
801 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
802
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 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
804 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
805
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 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
807 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
808
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
809 return md
45571
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
810
7543b5072e84 sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45569
diff changeset
811
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
812 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
813 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
814 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
815 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
816
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
817
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46618
diff changeset
818 def copies_sidedata_computer(repo, revlog, rev, existing_sidedata):
47078
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents: 47074
diff changeset
819 sidedata, has_copies_info = _getsidedata(repo, rev)
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents: 47074
diff changeset
820 flags_to_add = sidedataflag.REVIDX_HASCOPIESINFO if has_copies_info else 0
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents: 47074
diff changeset
821 return sidedata, (flags_to_add, 0)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46618
diff changeset
822
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46618
diff changeset
823
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
824 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
825 """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
826
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
827 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
828 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
829
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
830 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
831
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
832 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
833 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
834 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
835 """
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
836 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
837 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
838 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
839 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
840 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
841 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
842 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
843 # 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
844 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
845
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 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
848
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
849
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
850 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
851 """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
852
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
853 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
854 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
855 # 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
856 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
857
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
858 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
859
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
860 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
861 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
862 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
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 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
865 # 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
866 # 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
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 # 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
869 # 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
870 # 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
871 # cost.
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
872 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
873 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
874 # 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
875 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
876 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
877
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
878 allworkers = []
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
879 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
880 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
881 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
882 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
883 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
884
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
885 # 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
886 # 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
887 # 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
888 staging = {}
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
889
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
890 def sidedata_companion(repo, revlog, rev, old_sidedata):
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
891 # Is the data previously shelved ?
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
892 data = staging.pop(rev, None)
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
893 if data is None:
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
894 # look at the queued result until we find the one we are lookig
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
895 # for (shelve the other ones)
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
896 r, data = sidedataq.get()
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
897 while r != rev:
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
898 staging[r] = data
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
899 r, data = sidedataq.get()
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
900 tokens.release()
45735
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
901 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
902 new_flag = 0
edf4fa06df94 upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45734
diff changeset
903 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
904 new_flag = sidedataflag.REVIDX_HASCOPIESINFO
47084
27f1191b1305 sidedata: replace sidedata upgrade mechanism with the new one
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
905 return 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
906
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
907 return sidedata_companion