Mercurial > hg
annotate mercurial/metadata.py @ 46371:0903d6b9b1df
repository: introduce register_changeset callback
The new callback is called whenever a changeset is added to the repository
(commit, unbundle or exchange). Since the bulk operations already parse
the changeset (readfiles or full changesetrevision), always use the
latter to avoid redundant lookups. The first consumer of the new
interface needs to look at extra.
Differential Revision: https://phab.mercurial-scm.org/D9780
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Tue, 19 Jan 2021 00:20:53 +0100 |
parents | 59fa3890d40a |
children | dde86beca388 |
rev | line source |
---|---|
45764
18c17d63fdab
i18n: fix coding tag unsupported by xgettext
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
45735
diff
changeset
|
1 # coding: utf-8 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 # metadata.py -- code related to various metadata computation and access. |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
3 # |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
4 # Copyright 2019 Google, Inc <martinvonz@google.com> |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 # Copyright 2020 Pierre-Yves David <pierre-yves.david@octobus.net> |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 # |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
8 # GNU General Public License version 2 or any later version. |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
9 from __future__ import absolute_import, print_function |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 import multiprocessing |
45634
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
12 import struct |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
13 |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
14 from .node import ( |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
15 nullid, |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
16 nullrev, |
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
17 ) |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 from . import ( |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 error, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 pycompat, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 util, |
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 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
|
25 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
|
26 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
|
27 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
28 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
30 class ChangingFiles(object): |
45621
646a676f5365
changing-files: fix docstring
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45613
diff
changeset
|
31 """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
|
32 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
33 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
|
34 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
35 - 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
|
36 - 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
|
37 - 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
|
38 - 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
|
39 - 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
|
40 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
41 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
|
42 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
43 - 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
|
44 - 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
|
45 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
46 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
|
47 """ |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
48 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
49 def __init__( |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
50 self, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
51 touched=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
52 added=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
53 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
|
54 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
|
55 salvaged=None, |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
56 p1_copies=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
57 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
|
58 ): |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 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
|
65 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
|
66 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
|
67 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
|
68 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
|
69 |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
70 def __eq__(self, other): |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
71 return ( |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
72 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
|
73 and self.merged == other.merged |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
74 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
|
75 and self.salvaged == other.salvaged |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
76 and self.touched == other.touched |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
77 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
|
78 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
|
79 ) |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
80 |
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
|
81 @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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 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
|
88 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
|
89 ) |
232c88dd89e3
changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45669
diff
changeset
|
90 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
91 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
92 def added(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
93 """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
|
94 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
95 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
|
96 parents. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
97 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
98 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
|
99 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
|
100 added by an ancestor) |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
101 """ |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
102 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
|
103 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
104 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
|
105 if 'added' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
106 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
|
107 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
|
108 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
|
109 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
110 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
|
111 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
|
112 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
|
113 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
114 @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
|
115 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
|
116 """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
|
117 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
118 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
|
119 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
120 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
|
121 """ |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
122 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
|
123 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
124 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
|
125 if 'merged' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
126 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
|
127 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
|
128 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
|
129 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
130 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
|
131 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
|
132 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
|
133 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
134 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
135 def removed(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
136 """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
|
137 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
138 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
|
139 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
|
140 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
141 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
|
142 by this changeset. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
143 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
144 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
|
145 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
|
146 and then got "actively" removed. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
147 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
148 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
|
149 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
|
150 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
|
151 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
|
152 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
|
153 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
154 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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
160 Summary table for merge: |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
161 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
162 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
|
163 (a) | both | * || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
164 (b) | one | none || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
165 (c) | one | same filenode || no |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
166 (d) | one | new filenode || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
167 """ |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
168 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
|
169 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
170 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
|
171 if 'removed' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
172 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
|
173 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
|
174 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
|
175 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
180 @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
|
181 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
|
182 """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
|
183 |
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 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
|
185 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
|
186 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
|
187 """ |
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 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
|
189 |
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 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
|
191 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
|
192 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
|
193 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
|
194 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
|
195 |
a475db79d84d
changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45635
diff
changeset
|
196 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
|
197 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
|
198 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
|
199 |
a475db79d84d
changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45635
diff
changeset
|
200 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
201 def touched(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
202 """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
|
203 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
|
204 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
205 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
|
206 if 'touched' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
207 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
|
208 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
|
209 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
210 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
|
211 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
|
212 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
|
213 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
214 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
215 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
|
216 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
|
217 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
218 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
|
219 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
|
220 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
|
221 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
|
222 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
223 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
|
224 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
|
225 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
|
226 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
227 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
228 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
|
229 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
|
230 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
231 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
|
232 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
|
233 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
|
234 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
|
235 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
236 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
|
237 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
|
238 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
|
239 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
240 |
45663
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
241 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
|
242 """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
|
243 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
|
244 p2 = ctx.p2() |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
245 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
|
246 return _process_root(ctx) |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
247 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
|
248 return _process_linear(p1, ctx) |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
249 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
|
250 # 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
|
251 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
|
252 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
|
253 # 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
|
254 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
|
255 else: |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
256 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
|
257 |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
258 |
45666
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
259 def _process_root(ctx): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45764
diff
changeset
|
260 """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
|
261 # 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 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
|
267 |
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
268 |
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
|
269 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
|
270 """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
|
271 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
|
272 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
|
273 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
|
274 |
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 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
|
276 |
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 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
|
278 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
|
279 # 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
|
280 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
|
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 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
|
283 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
|
284 # 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
|
285 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
|
286 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
|
287 # 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
|
288 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
|
289 |
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 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 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
|
296 |
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 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 |
0303fc1f43f8
changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45666
diff
changeset
|
303 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
|
304 |
0303fc1f43f8
changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45666
diff
changeset
|
305 |
45668
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
306 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
|
307 """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
|
308 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
309 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
|
310 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
|
311 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
312 ┌──────────────┬──────────────┬──────────────┬──────────────┬──────────────┐ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
313 │ 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
|
314 │ 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
|
315 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
316 │ │ │🄱 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
|
317 │ ø │🄰 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
|
318 │ │ │🄲 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
|
319 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
320 │ │🄶 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
|
321 │ (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
|
322 │ │🄷 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
|
323 ├──────────────┼──────────────┼──────────────┼──────────────┼──────────────┤ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
324 │ │🄸 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
|
325 │ (None, Some) │ OR │ ø │🄼 Added │🄽 Merged │ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
326 │ │🄹 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
|
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 │ │ │ │ │ │ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
329 │ (Some, Some) │🄺 No Changes │ ø │🄾 Merged │🄿 Merged │ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
330 │ │ [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
|
331 └──────────────┴──────────────┴──────────────┴──────────────┴──────────────┘ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
332 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
333 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
|
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 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
|
336 - 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
|
337 - 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
|
338 - 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
|
339 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
340 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
|
341 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
|
342 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
343 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
|
344 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
|
345 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
|
346 "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
|
347 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
|
348 - 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
|
349 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
350 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
|
351 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
|
352 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
|
353 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
|
354 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
|
355 - 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
|
356 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
357 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
358 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
|
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 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
|
361 - 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
|
362 - 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
|
363 - 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
|
364 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
365 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
|
366 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
367 - 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
|
368 - 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
|
369 - 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
|
370 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
371 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
|
372 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
|
373 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
374 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
|
375 - 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
|
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 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
|
378 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
|
379 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
|
380 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
|
381 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
382 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
|
383 - 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
|
384 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
385 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
|
386 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
|
387 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
|
388 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
|
389 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
|
390 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
|
391 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
|
392 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
|
393 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
|
394 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
395 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
|
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 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
|
398 - 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
|
399 - 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
|
400 - 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
|
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 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
|
403 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
|
404 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
|
405 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
|
406 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
407 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
|
408 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
|
409 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
|
410 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
|
411 (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
|
412 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
413 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
|
414 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
|
415 """ |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
416 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
417 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
|
418 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
419 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
|
420 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
|
421 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
|
422 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
|
423 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
|
424 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
425 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
|
426 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
|
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 if not cahs: |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
429 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
|
430 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
|
431 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
432 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
|
433 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
434 # 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
|
435 # 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
|
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 # 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
|
438 # 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
|
439 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
|
440 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
441 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
|
442 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
443 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
|
444 # 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
|
445 _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
|
446 else: |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
447 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
448 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
|
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_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
|
451 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
|
452 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
|
453 # 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
|
454 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
|
455 elif d1[1][0] is not None and d2[1][0] 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
|
456 # case 🄽 🄾 🄿 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
457 md.mark_merged(filename) |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
458 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
|
459 else: |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
460 # 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
|
461 # 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
|
462 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
|
463 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
464 # 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
|
465 # table. |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
466 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
|
467 _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
|
468 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
469 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
|
470 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
|
471 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
|
472 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
|
473 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
|
474 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
|
475 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
|
476 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
|
477 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
|
478 |
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 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
|
481 """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
|
482 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
|
483 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
|
484 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
|
485 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
486 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
487 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
|
488 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
|
489 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
|
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 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
|
492 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
|
493 # 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
|
494 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
|
495 # 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
|
496 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
|
497 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
|
498 # 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
|
499 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
|
500 # 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
|
501 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
|
502 # 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
|
503 # |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
504 # 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
|
505 # 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
|
506 # "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
|
507 pass |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
508 else: |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
509 # 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
|
510 # 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
|
511 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
|
512 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
513 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
514 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
|
515 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
|
516 |
47ad23549b81
changing-files: add clean computation of changed file for merges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45667
diff
changeset
|
517 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
518 def computechangesetfilesadded(ctx): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45764
diff
changeset
|
519 """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
|
520 added = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
521 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
|
522 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
|
523 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
|
524 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
|
525 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
526 |
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
|
527 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
|
528 """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
|
529 |
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
|
530 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
|
531 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
|
532 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
|
533 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
|
534 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
|
535 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
|
536 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
|
537 - 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
|
538 - 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
|
539 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
|
540 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
|
541 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
|
542 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
|
543 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
|
544 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
|
545 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
|
546 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
|
547 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
|
548 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
|
549 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
|
550 """ |
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 |
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 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
|
553 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
|
554 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
|
555 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
|
556 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
|
557 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
|
558 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
|
559 |
edd08aa193fb
files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44940
diff
changeset
|
560 @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
|
561 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
|
562 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
|
563 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
|
564 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
|
565 if not cahs: |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
566 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
|
567 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
|
568 |
edd08aa193fb
files: extract code for extra filtering of the `removed` entry into copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44940
diff
changeset
|
569 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
|
570 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
|
571 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
|
572 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
|
573 ) |
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 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
|
575 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
|
576 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
|
577 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
|
578 |
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 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
|
580 |
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 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
582 def computechangesetfilesremoved(ctx): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45764
diff
changeset
|
583 """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
|
584 removed = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
585 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
|
586 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
|
587 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
|
588 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
|
589 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
|
590 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
|
591 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
|
592 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
593 |
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
|
594 def computechangesetfilesmerged(ctx): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45764
diff
changeset
|
595 """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
|
596 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
|
597 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
|
598 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
|
599 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
|
600 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
|
601 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
|
602 parents = fctx._filelog.parents(fctx._filenode) |
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
603 if parents[1] != nullid: |
45613
ddcee0b0fd67
changing-files: add a utility to compute the merged files post-commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45611
diff
changeset
|
604 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
|
605 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
|
606 |
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 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
608 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
|
609 """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
|
610 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
611 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
|
612 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
613 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
|
614 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
615 p1copies = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
616 p2copies = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
617 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
|
618 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
|
619 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
|
620 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
|
621 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
|
622 continue |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
623 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
|
624 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
|
625 continue |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
626 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
|
627 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
|
628 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
|
629 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
|
630 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
|
631 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
|
632 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
633 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
634 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
|
635 items = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
636 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
|
637 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
|
638 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
|
639 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
|
640 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
|
641 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
|
642 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
643 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
|
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 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
646 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
|
647 try: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
648 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 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
|
650 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
|
651 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
|
652 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
|
653 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
|
654 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
|
655 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
|
656 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
|
657 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
|
658 # 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
|
659 # 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
|
660 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
|
661 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
662 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
663 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
|
664 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
|
665 indices = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
666 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
|
667 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
|
668 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
|
669 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
|
670 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
671 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
672 def 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
|
673 try: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
674 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 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
|
676 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
|
677 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
|
678 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
|
679 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
|
680 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
|
681 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
|
682 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
|
683 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
|
684 # 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
|
685 # 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
|
686 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
|
687 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
688 |
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
|
689 # 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
|
690 |
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
|
691 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
|
692 # 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
|
693 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
|
694 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
|
695 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
|
696 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
|
697 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
|
698 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
699 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
|
700 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
|
701 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
|
702 |
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 # 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
|
704 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
|
705 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
|
706 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
707 |
45569
64d18e9e8508
sidedata: rename `encode_copies_sidedata` to `encode_files_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45507
diff
changeset
|
708 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
|
709 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
|
710 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
|
711 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
|
712 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
|
713 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
|
714 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
|
715 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
716 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
|
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 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
|
719 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
|
720 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
|
721 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
|
722 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
|
723 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
|
724 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
|
725 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
|
726 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
|
727 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
|
728 flag |= REMOVED_FLAG |
45669
e53778ad64bf
salvaged: persist the salvaged set on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45668
diff
changeset
|
729 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
|
730 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
|
731 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
|
732 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
|
733 |
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 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
|
735 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
|
736 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
|
737 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
|
738 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
|
739 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
|
740 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
|
741 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
|
742 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
|
743 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
|
744 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
|
745 |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
746 |
45635
9003e6524f78
changing-files: drop the now useless changelogrevision argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45634
diff
changeset
|
747 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
|
748 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
|
749 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
|
750 |
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 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
|
752 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
|
753 |
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 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
|
755 all_files = [] |
45571
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
756 |
45634
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
757 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
|
758 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
|
759 |
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
|
760 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
|
761 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
|
762 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
|
763 |
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 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
|
765 |
45634
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
766 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
|
767 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
|
768 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
|
769 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
|
770 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
|
771 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
|
772 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
|
773 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
|
774 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
|
775 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
|
776 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
|
777 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
|
778 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
|
779 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
|
780 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
|
781 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
|
782 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
|
783 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
|
784 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
|
785 |
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
|
786 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
|
787 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
|
788 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
|
789 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
|
790 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
|
791 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
792 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
|
793 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
|
794 |
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 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
|
796 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
|
797 |
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 return md |
45571
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
799 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
800 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
801 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
|
802 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
|
803 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
|
804 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
|
805 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
806 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
807 def getsidedataadder(srcrepo, destrepo): |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
808 use_w = srcrepo.ui.configbool(b'experimental', b'worker.repository-upgrade') |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
809 if pycompat.iswindows or not use_w: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
810 return _get_simple_sidedata_adder(srcrepo, destrepo) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
811 else: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
812 return _get_worker_sidedata_adder(srcrepo, destrepo) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
813 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
814 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
815 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
|
816 """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
|
817 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
818 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
|
819 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
|
820 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
821 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
|
822 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
823 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
|
824 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
|
825 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
|
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 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
|
828 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
|
829 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
|
830 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
|
831 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
|
832 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
|
833 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
|
834 # 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
|
835 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
|
836 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
837 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
838 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
|
839 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
840 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
841 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
|
842 """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
|
843 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
844 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
|
845 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
|
846 # 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
|
847 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
|
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 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
|
850 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
851 tokens = 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
|
852 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
|
853 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
|
854 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
855 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
|
856 # 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
|
857 # 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
|
858 # |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
859 # 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
|
860 # 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
|
861 # 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
|
862 # cost. |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
863 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
|
864 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
|
865 # 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
|
866 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
|
867 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
|
868 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
869 allworkers = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
870 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
|
871 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
|
872 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
|
873 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
|
874 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
|
875 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
876 # 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
|
877 # 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
|
878 # 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
|
879 staging = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
880 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
881 def sidedata_companion(revlog, rev): |
45734
53c265a6fc83
sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45728
diff
changeset
|
882 data = {}, False |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
883 if util.safehasattr(revlog, b'filteredrevs'): # this is a changelog |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
884 # Is the data previously shelved ? |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
885 sidedata = staging.pop(rev, None) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
886 if sidedata 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
|
887 # look at the queued result until we find the one we are lookig |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
888 # for (shelve the other ones) |
45734
53c265a6fc83
sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45728
diff
changeset
|
889 r, data = sidedataq.get() |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
890 while r != rev: |
45734
53c265a6fc83
sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45728
diff
changeset
|
891 staging[r] = data |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
892 r, sidedata = sidedataq.get() |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
893 tokens.release() |
45735
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
894 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
|
895 new_flag = 0 |
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
896 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
|
897 new_flag = sidedataflag.REVIDX_HASCOPIESINFO |
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
898 return False, (), sidedata, new_flag, 0 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
899 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
900 return sidedata_companion |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
901 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
902 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
903 def _get_simple_sidedata_adder(srcrepo, destrepo): |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
904 """The simple version of the sidedata computation |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
905 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
906 It just compute it in the same thread on request""" |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
907 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
908 def sidedatacompanion(revlog, rev): |
45735
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
909 sidedata, has_copies_info = {}, False |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
910 if util.safehasattr(revlog, 'filteredrevs'): # this is a changelog |
45734
53c265a6fc83
sidedata: return enough data to set the proper flag in the future
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45728
diff
changeset
|
911 sidedata, has_copies_info = _getsidedata(srcrepo, rev) |
45735
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
912 new_flag = 0 |
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
913 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
|
914 new_flag = sidedataflag.REVIDX_HASCOPIESINFO |
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
915 |
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
916 return False, (), sidedata, new_flag, 0 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
917 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
918 return sidedatacompanion |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
919 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
920 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
921 def getsidedataremover(srcrepo, destrepo): |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
922 def sidedatacompanion(revlog, rev): |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
923 f = () |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
924 if util.safehasattr(revlog, 'filteredrevs'): # this is a changelog |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
925 if revlog.flags(rev) & sidedataflag.REVIDX_SIDEDATA: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
926 f = ( |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
927 sidedatamod.SD_P1COPIES, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
928 sidedatamod.SD_P2COPIES, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
929 sidedatamod.SD_FILESADDED, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
930 sidedatamod.SD_FILESREMOVED, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
931 ) |
45735
edf4fa06df94
upgrade: allow sidedata upgrade to modify revision flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45734
diff
changeset
|
932 return False, f, {}, 0, sidedataflag.REVIDX_HASCOPIESINFO |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
933 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
934 return sidedatacompanion |