Mercurial > hg
annotate mercurial/metadata.py @ 45667:0303fc1f43f8
changing-files: add clean computation of changed files for linear changesets
The `files` field is not reliable, so we need to compute things from scratch. We
deal with the second simplest case, linear changesets. We diff the current
manifest with the parent manifest. This reveal the file added, changed and
removed.
Differential Revision: https://phab.mercurial-scm.org/D9127
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 29 Sep 2020 22:46:29 +0200 |
parents | f6811e5bd994 |
children | 47ad23549b81 |
rev | line source |
---|---|
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 # 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
|
2 # |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
3 # 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
|
4 # 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
|
5 # |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 # 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
|
7 # 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
|
8 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
|
9 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 import multiprocessing |
45634
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
11 import struct |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
13 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
|
14 error, |
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
|
15 node, |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
16 pycompat, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
17 util, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 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
|
21 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
|
22 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
|
23 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
24 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
25 |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
26 class ChangingFiles(object): |
45621
646a676f5365
changing-files: fix docstring
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45613
diff
changeset
|
27 """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
|
28 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
29 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
|
30 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
31 - 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
|
32 - 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
|
33 - 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
|
34 - 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
|
35 - 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
|
36 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
37 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
|
38 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
39 - 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
|
40 - 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
|
41 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
42 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
|
43 """ |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
44 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
45 def __init__( |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
46 self, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
47 touched=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
48 added=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
49 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
|
50 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
|
51 salvaged=None, |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
52 p1_copies=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
53 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
|
54 ): |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
55 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
|
56 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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 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
|
65 |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
66 def __eq__(self, other): |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
67 return ( |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
68 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
|
69 and self.merged == other.merged |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
70 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
|
71 and self.salvaged == other.salvaged |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
72 and self.touched == other.touched |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
73 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
|
74 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
|
75 ) |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
76 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
77 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
78 def added(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
79 """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
|
80 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
81 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
|
82 parents. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
83 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
84 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
|
85 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
|
86 added by an ancestor) |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
87 """ |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
88 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
|
89 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
90 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
|
91 if 'added' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
92 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
|
93 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
|
94 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
|
95 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
96 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
|
97 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
|
98 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
|
99 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
100 @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
|
101 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
|
102 """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
|
103 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
104 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
|
105 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
106 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
|
107 """ |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
108 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
|
109 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
110 def mark_merged(self, filename): |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
111 if 'merged' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
112 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
|
113 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
|
114 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
|
115 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
116 def 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
|
117 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
|
118 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
|
119 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
120 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
121 def removed(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
122 """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
|
123 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
124 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
|
125 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
|
126 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
127 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
|
128 by this changeset. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
129 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
130 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
|
131 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
|
132 and then got "actively" removed. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
133 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
134 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
|
135 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
|
136 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
|
137 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
|
138 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
|
139 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
140 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
|
141 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
|
142 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
|
143 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
|
144 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
|
145 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
146 Summary table for merge: |
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 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
|
149 (a) | both | * || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
150 (b) | one | none || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
151 (c) | one | same filenode || no |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
152 (d) | one | new filenode || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
153 """ |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
154 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
|
155 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
156 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
|
157 if 'removed' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
158 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
|
159 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
|
160 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
|
161 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
162 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
|
163 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
|
164 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
|
165 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
166 @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
|
167 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
|
168 """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
|
169 |
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
|
170 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
|
171 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
|
172 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
|
173 """ |
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
|
174 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
|
175 |
a475db79d84d
changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45635
diff
changeset
|
176 def 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
|
177 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
|
178 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
|
179 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
|
180 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
|
181 |
a475db79d84d
changing-files: add a "salvaged" set to track file that were not removed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45635
diff
changeset
|
182 def 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
|
183 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
|
184 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
|
185 |
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 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
187 def touched(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
188 """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
|
189 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
|
190 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
191 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
|
192 if 'touched' in vars(self): |
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
193 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
|
194 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
|
195 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
196 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
|
197 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
|
198 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
|
199 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
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 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
|
202 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
|
203 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
204 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
|
205 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
|
206 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
|
207 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
|
208 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
209 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
|
210 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
|
211 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
|
212 |
45623
d31483377673
changing-files: cache the various property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45622
diff
changeset
|
213 @util.propertycache |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
214 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
|
215 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
|
216 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
217 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
|
218 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
|
219 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
|
220 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
|
221 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
222 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
|
223 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
|
224 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
|
225 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
226 |
45663
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
227 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
|
228 """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
|
229 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
|
230 p2 = ctx.p2() |
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
231 if p1.rev() == node.nullrev and p2.rev() == node.nullrev: |
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
232 return _process_root(ctx) |
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
|
233 elif p1.rev() != node.nullrev and p2.rev() == node.nullrev: |
0303fc1f43f8
changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45666
diff
changeset
|
234 return _process_linear(p1, ctx) |
0303fc1f43f8
changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45666
diff
changeset
|
235 elif p1.rev() == node.nullrev and p2.rev() != node.nullrev: |
0303fc1f43f8
changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45666
diff
changeset
|
236 # 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
|
237 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
|
238 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
|
239 # 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
|
240 return _process_linear(p1, ctx) |
45663
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
241 filescopies = computechangesetcopies(ctx) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
242 filesadded = computechangesetfilesadded(ctx) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
243 filesremoved = computechangesetfilesremoved(ctx) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
244 filesmerged = computechangesetfilesmerged(ctx) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
245 files = ChangingFiles() |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
246 files.update_touched(ctx.files()) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
247 files.update_added(filesadded) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
248 files.update_removed(filesremoved) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
249 files.update_merged(filesmerged) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
250 files.update_copies_from_p1(filescopies[0]) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
251 files.update_copies_from_p2(filescopies[1]) |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
252 return files |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
253 |
cf474af69766
changing-files: split the changing files computation from encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45660
diff
changeset
|
254 |
45666
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
255 def _process_root(ctx): |
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
256 """compute the appropriate changed files for a changeset with no parents |
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
257 """ |
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
258 # 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 |
f6811e5bd994
changing-files: add clean computation of changed files for roots
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45663
diff
changeset
|
265 |
45667
0303fc1f43f8
changing-files: add clean computation of changed files for linear changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45666
diff
changeset
|
266 def _process_linear(parent_ctx, children_ctx, 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
|
267 """compute the appropriate changed files for a changeset with a single 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
|
268 """ |
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 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
|
270 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
|
271 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
|
272 |
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 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
|
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 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
|
276 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
|
277 # 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
|
278 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
|
279 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
|
280 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
|
281 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
|
282 # 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
|
283 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
|
284 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
|
285 # 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
|
286 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
|
287 |
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 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
|
289 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
|
290 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
|
291 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
|
292 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
|
293 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
|
294 |
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 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
|
296 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
|
297 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
|
298 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
|
299 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
|
300 |
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 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
|
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 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
304 def computechangesetfilesadded(ctx): |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
305 """return the list of files added in 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
|
306 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
307 added = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
308 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
|
309 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
|
310 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
|
311 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
|
312 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
313 |
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
|
314 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
|
315 """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
|
316 |
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
|
317 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
|
318 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
|
319 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
|
320 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
|
321 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
|
322 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
|
323 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
|
324 - 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
|
325 - 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 """ |
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
|
338 |
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
|
339 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
|
340 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
|
341 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
|
342 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
|
343 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
|
344 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
|
345 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
|
346 |
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
|
347 @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
|
348 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
|
349 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
|
350 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
|
351 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
|
352 if not 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
|
353 cahs = [node.nullrev] |
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
|
354 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
|
355 |
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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 ) |
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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 |
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
|
366 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
|
367 |
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
|
368 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
369 def computechangesetfilesremoved(ctx): |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
370 """return the list of files removed in 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
|
371 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
372 removed = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
373 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
|
374 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
|
375 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
|
376 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
|
377 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
|
378 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
|
379 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
|
380 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
381 |
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
|
382 def computechangesetfilesmerged(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
|
383 """return the list of files merged in a changeset |
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
|
384 """ |
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
|
385 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
|
386 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
|
387 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
|
388 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
|
389 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
|
390 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
|
391 parents = fctx._filelog.parents(fctx._filenode) |
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
|
392 if parents[1] != node.nullid: |
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
|
393 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
|
394 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
|
395 |
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
|
396 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
397 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
|
398 """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
|
399 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
400 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
|
401 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
402 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
|
403 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
404 p1copies = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
405 p2copies = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
406 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
|
407 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
|
408 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
|
409 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
|
410 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
|
411 continue |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
412 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
|
413 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
|
414 continue |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 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
|
419 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
|
420 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
|
421 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
422 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
423 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
|
424 items = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
425 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
|
426 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
|
427 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
|
428 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
|
429 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
|
430 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
|
431 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
432 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
|
433 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
434 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
435 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
|
436 try: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
437 copies = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
438 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
|
439 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
|
440 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
|
441 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
|
442 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
|
443 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
|
444 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
|
445 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
|
446 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
|
447 # 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
|
448 # 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
|
449 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
|
450 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
451 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
452 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
|
453 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
|
454 indices = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
455 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
|
456 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
|
457 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
|
458 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
|
459 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
460 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
461 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
|
462 try: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
463 subset = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
464 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
|
465 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
|
466 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
|
467 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
|
468 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
|
469 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
|
470 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
|
471 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
|
472 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
|
473 # 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
|
474 # 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
|
475 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
|
476 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
477 |
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
|
478 # 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
|
479 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
480 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
|
481 # 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
|
482 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
|
483 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
|
484 REMOVED_FLAG = int("011" "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
|
485 # `100` is reserved for future use |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
486 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
|
487 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
488 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
|
489 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
|
490 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
|
491 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
492 # 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
|
493 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
|
494 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
|
495 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
496 |
45569
64d18e9e8508
sidedata: rename `encode_copies_sidedata` to `encode_files_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45507
diff
changeset
|
497 def encode_files_sidedata(files): |
45660
e66db30f95a8
salvaged: explicitly skip salvaged file while encoding
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45659
diff
changeset
|
498 all_files = set(files.touched - files.salvaged) |
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
|
499 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
|
500 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
|
501 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
|
502 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
|
503 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
|
504 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
505 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
|
506 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
507 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
|
508 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
|
509 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
|
510 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
|
511 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
|
512 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
|
513 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
|
514 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
|
515 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
|
516 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
|
517 flag |= 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
|
518 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
|
519 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
|
520 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
521 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
|
522 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
|
523 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
|
524 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
|
525 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
|
526 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
|
527 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
|
528 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
|
529 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
|
530 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
|
531 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
|
532 |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
533 |
45635
9003e6524f78
changing-files: drop the now useless changelogrevision argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45634
diff
changeset
|
534 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
|
535 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
|
536 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
|
537 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
538 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
|
539 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
|
540 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
541 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
|
542 all_files = [] |
45571
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
543 |
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
|
544 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
|
545 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
|
546 |
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
|
547 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
|
548 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
|
549 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
|
550 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
551 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
|
552 |
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
|
553 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
|
554 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
|
555 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
|
556 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
|
557 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
|
558 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
|
559 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
|
560 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
|
561 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
|
562 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
|
563 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
|
564 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
|
565 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
|
566 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
|
567 md.mark_removed(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
|
568 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
|
569 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
|
570 |
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
|
571 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
|
572 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
|
573 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
|
574 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
|
575 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
|
576 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
577 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
|
578 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
|
579 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
580 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
|
581 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
|
582 |
9a6b409b8ebc
changing-files: rework the way we store changed files in side-data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45623
diff
changeset
|
583 return md |
45571
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
584 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
585 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
586 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
|
587 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
|
588 files = compute_all_files_changes(ctx) |
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
|
589 return encode_files_sidedata(files) |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
590 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
591 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
592 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
|
593 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
|
594 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
|
595 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
|
596 else: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
597 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
|
598 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
599 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
600 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
|
601 """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
|
602 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
603 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
|
604 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
|
605 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
606 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
|
607 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
608 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
|
609 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
|
610 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
|
611 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
612 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
|
613 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
|
614 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
|
615 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
|
616 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
|
617 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
|
618 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
|
619 # 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
|
620 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
|
621 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
622 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
623 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
|
624 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
625 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
626 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
|
627 """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
|
628 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
629 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
|
630 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
|
631 # 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
|
632 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
|
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 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
|
635 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
636 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
|
637 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
|
638 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
|
639 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
640 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
|
641 # 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
|
642 # 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
|
643 # |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
644 # 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
|
645 # 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
|
646 # 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
|
647 # cost. |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
648 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
|
649 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
|
650 # 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
|
651 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
|
652 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
|
653 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
654 allworkers = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
655 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
|
656 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
|
657 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
|
658 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
|
659 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
|
660 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
661 # 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
|
662 # 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
|
663 # 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
|
664 staging = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
665 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
666 def sidedata_companion(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
|
667 sidedata = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
668 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
|
669 # 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
|
670 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
|
671 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
|
672 # 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
|
673 # for (shelve the other ones) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
674 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
|
675 while r != rev: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
676 staging[r] = sidedata |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
677 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
|
678 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
|
679 return False, (), sidedata |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
680 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
681 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
|
682 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
683 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
684 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
|
685 """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
|
686 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
687 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
|
688 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
689 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
|
690 sidedata = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
691 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
|
692 sidedata = _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
|
693 return False, (), sidedata |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
694 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
695 return sidedatacompanion |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
696 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
697 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
698 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
|
699 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
|
700 f = () |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
701 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
|
702 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
|
703 f = ( |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
704 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
|
705 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
|
706 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
|
707 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
|
708 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
709 return False, f, {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
710 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
711 return sidedatacompanion |