Mercurial > public > mercurial-scm > hg
annotate mercurial/metadata.py @ 45611:e5578dbe36cb
changing-files: add the ability to track merged files too
The set of merged files is used when doing changeset centric copy tracing (cf
`is_merged` in `mercurial/copies.py`. So tracking (and persisting) this set will
be useful. We start with adding the attribute on the new object.
Differential Revision: https://phab.mercurial-scm.org/D9087
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 24 Sep 2020 09:50:09 +0200 |
parents | 3d5b2b8e93fd |
children | ddcee0b0fd67 |
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 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 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
|
13 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
|
14 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
|
15 pycompat, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
16 util, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
17 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 from .revlogutils import ( |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 flagutil as sidedataflag, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 sidedata as sidedatamod, |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
23 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
24 |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
25 class ChangingFiles(object): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
26 """A class recording the changes made to a file by a changeset |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
27 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
28 Actions performed on files are gathered into 3 sets: |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
29 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
30 - added: files actively added in the changeset. |
45611
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
31 - merged: files whose history got merged |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
32 - removed: files removed in the revision |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
33 - 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
|
34 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
35 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
|
36 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
37 - 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
|
38 - 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
|
39 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
40 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
|
41 """ |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
42 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
43 def __init__( |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
44 self, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
45 touched=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
46 added=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
47 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
|
48 merged=None, |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
49 p1_copies=None, |
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
50 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
|
51 ): |
45589
3d5b2b8e93fd
changing-files: move default constructor value to None
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
52 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
|
53 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
|
54 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
|
55 self._touched = set(() if touched is None else touched) |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
56 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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
62 def __eq__(self, other): |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
63 return ( |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
64 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
|
65 and self.merged == other.merged |
45507
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
66 and self.removed == other.removed |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
67 and self.touched == other.touched |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
68 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
|
69 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
|
70 ) |
df87821081ee
changing-files: implement equality checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45506
diff
changeset
|
71 |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
72 @property |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
73 def added(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
74 """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
|
75 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
76 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
|
77 parents. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
78 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
79 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
|
80 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
|
81 added by an ancestor) |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
82 """ |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
83 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
|
84 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
85 def mark_added(self, filename): |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
86 self._added.add(filename) |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
87 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
|
88 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
89 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
|
90 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
|
91 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
|
92 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
93 @property |
45611
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
94 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
|
95 """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
|
96 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
97 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
|
98 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
99 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
|
100 """ |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
101 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
|
102 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
103 def mark_merged(self, filename): |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
104 self._merged.add(filename) |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
105 self._touched.add(filename) |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
106 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
107 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
|
108 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
|
109 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
|
110 |
e5578dbe36cb
changing-files: add the ability to track merged files too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45589
diff
changeset
|
111 @property |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
112 def removed(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
113 """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
|
114 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
115 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
|
116 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
|
117 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
118 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
|
119 by this changeset. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
120 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
121 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
|
122 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
|
123 and then got "actively" removed. |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
124 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
125 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
|
126 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
|
127 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
|
128 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
|
129 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
|
130 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
131 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
|
132 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
|
133 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
|
134 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
|
135 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
|
136 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
137 Summary table for merge: |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
138 |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
139 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
|
140 (a) | both | * || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
141 (b) | one | none || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
142 (c) | one | same filenode || no |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
143 (d) | one | new filenode || yes |
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
144 """ |
45323
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
145 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
|
146 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
147 def mark_removed(self, filename): |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
148 self._removed.add(filename) |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
149 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
|
150 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
151 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
|
152 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
|
153 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
|
154 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
155 @property |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
156 def touched(self): |
45506
1f50bcc96595
changing-files: document the various sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45325
diff
changeset
|
157 """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
|
158 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
|
159 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
160 def mark_touched(self, filename): |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
161 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
|
162 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
163 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
|
164 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
|
165 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
|
166 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
167 @property |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
168 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
|
169 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
|
170 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
171 def mark_copied_from_p1(self, source, dest): |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
172 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
|
173 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
174 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
|
175 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
|
176 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
|
177 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
178 @property |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
179 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
|
180 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
|
181 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
182 def mark_copied_from_p2(self, source, dest): |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
183 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
|
184 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 |
aea6a812f7cb
commitctx: return a richer object from _prepare_files
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44942
diff
changeset
|
189 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
190 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
|
191 """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
|
192 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
193 added = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
194 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
|
195 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
|
196 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
|
197 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
|
198 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
199 |
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
|
200 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
|
201 """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
|
202 |
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
|
203 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
|
204 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
|
205 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
|
206 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
|
207 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
|
208 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
|
209 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
|
210 - 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
|
211 - 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
|
212 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
|
213 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
|
214 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
|
215 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
|
216 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
|
217 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
|
218 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
|
219 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
|
220 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
|
221 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
|
222 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
|
223 """ |
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
|
224 |
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
|
225 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
|
226 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
|
227 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
|
228 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
|
229 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
|
230 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
|
231 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
|
232 |
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
|
233 @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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
239 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
|
240 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
|
241 |
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
|
242 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
|
243 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
|
244 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
|
245 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
|
246 ) |
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
|
247 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
|
248 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
|
249 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
|
250 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
|
251 |
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
|
252 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
|
253 |
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
|
254 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
255 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
|
256 """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
|
257 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
258 removed = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
267 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
268 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
|
269 """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
|
270 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
271 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
|
272 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
273 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
|
274 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
275 p1copies = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
276 p2copies = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
277 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
|
278 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
|
279 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
|
280 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
|
281 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
|
282 continue |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
283 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
|
284 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
|
285 continue |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
286 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
|
287 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
|
288 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
|
289 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
|
290 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
|
291 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
|
292 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
293 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
294 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
|
295 items = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
296 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
|
297 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
303 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
|
304 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
305 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
306 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
|
307 try: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
308 copies = {} |
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 data: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 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
|
318 # 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
|
319 # 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
|
320 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
|
321 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
322 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
323 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
|
324 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
|
325 indices = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
326 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
|
327 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
|
328 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
|
329 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
|
330 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
331 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
332 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
|
333 try: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
334 subset = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 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
|
339 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
|
340 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
|
341 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
|
342 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
|
343 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
|
344 # 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
|
345 # 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
|
346 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
|
347 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
348 |
45569
64d18e9e8508
sidedata: rename `encode_copies_sidedata` to `encode_files_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45507
diff
changeset
|
349 def encode_files_sidedata(files): |
45325
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
350 sortedfiles = sorted(files.touched) |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
351 sidedata = {} |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
352 p1copies = files.copied_from_p1 |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
353 if p1copies: |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
354 p1copies = encodecopies(sortedfiles, p1copies) |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
355 sidedata[sidedatamod.SD_P1COPIES] = p1copies |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
356 p2copies = files.copied_from_p2 |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
357 if p2copies: |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
358 p2copies = encodecopies(sortedfiles, p2copies) |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
359 sidedata[sidedatamod.SD_P2COPIES] = p2copies |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
360 filesadded = files.added |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
361 if filesadded: |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
362 filesadded = encodefileindices(sortedfiles, filesadded) |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
363 sidedata[sidedatamod.SD_FILESADDED] = filesadded |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
364 filesremoved = files.removed |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
365 if filesremoved: |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
366 filesremoved = encodefileindices(sortedfiles, filesremoved) |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
367 sidedata[sidedatamod.SD_FILESREMOVED] = filesremoved |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
368 if not sidedata: |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
369 sidedata = None |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
370 return sidedata |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
371 |
c6eea5804551
commitctx: extract sidedata encoding inside its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45323
diff
changeset
|
372 |
45571
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
373 def decode_files_sidedata(changelogrevision, sidedata): |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
374 """Return a ChangingFiles instance from a changelogrevision using sidata |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
375 """ |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
376 touched = changelogrevision.files |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
377 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
378 rawindices = sidedata.get(sidedatamod.SD_FILESADDED) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
379 added = decodefileindices(touched, rawindices) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
380 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
381 rawindices = sidedata.get(sidedatamod.SD_FILESREMOVED) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
382 removed = decodefileindices(touched, rawindices) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
383 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
384 rawcopies = sidedata.get(sidedatamod.SD_P1COPIES) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
385 p1_copies = decodecopies(touched, rawcopies) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
386 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
387 rawcopies = sidedata.get(sidedatamod.SD_P2COPIES) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
388 p2_copies = decodecopies(touched, rawcopies) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
389 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
390 return ChangingFiles( |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
391 touched=touched, |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
392 added=added, |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
393 removed=removed, |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
394 p1_copies=p1_copies, |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
395 p2_copies=p2_copies, |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
396 ) |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
397 |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
398 |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
399 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
|
400 ctx = 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
|
401 filescopies = 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
|
402 filesadded = 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
|
403 filesremoved = 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
|
404 sidedata = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
405 if any([filescopies, filesadded, filesremoved]): |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
406 sortedfiles = sorted(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
|
407 p1copies, p2copies = filescopies |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
408 p1copies = encodecopies(sortedfiles, p1copies) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
409 p2copies = encodecopies(sortedfiles, p2copies) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
410 filesadded = encodefileindices(sortedfiles, filesadded) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
411 filesremoved = encodefileindices(sortedfiles, filesremoved) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
412 if p1copies: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
413 sidedata[sidedatamod.SD_P1COPIES] = p1copies |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
414 if p2copies: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
415 sidedata[sidedatamod.SD_P2COPIES] = p2copies |
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 filesadded: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
417 sidedata[sidedatamod.SD_FILESADDED] = filesadded |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
418 if filesremoved: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
419 sidedata[sidedatamod.SD_FILESREMOVED] = filesremoved |
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 sidedata |
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 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
|
424 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
|
425 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
|
426 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
|
427 else: |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
428 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
|
429 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
430 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
431 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
|
432 """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
|
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 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
|
435 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
|
436 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
437 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
|
438 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
439 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
|
440 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
|
441 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
|
442 """ |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
443 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
|
444 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
|
445 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
|
446 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
|
447 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
|
448 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
|
449 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
|
450 # 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
|
451 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
|
452 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
453 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
454 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
|
455 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
456 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
457 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
|
458 """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
|
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 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
|
461 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
|
462 # 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
|
463 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
|
464 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
465 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
|
466 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
467 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
|
468 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
|
469 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
|
470 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
471 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
|
472 # 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
|
473 # 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
|
474 # |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
475 # 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
|
476 # 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
|
477 # 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
|
478 # cost. |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
479 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
|
480 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
|
481 # 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
|
482 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
|
483 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
|
484 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
485 allworkers = [] |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
486 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
|
487 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
|
488 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
|
489 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
|
490 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
|
491 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
492 # 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
|
493 # 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
|
494 # 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
|
495 staging = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
496 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
497 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
|
498 sidedata = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
499 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
|
500 # 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
|
501 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
|
502 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
|
503 # 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
|
504 # 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
|
505 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
|
506 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
|
507 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
|
508 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
|
509 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
|
510 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
|
511 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
512 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
|
513 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
514 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
515 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
|
516 """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
|
517 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
518 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
|
519 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
520 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
|
521 sidedata = {} |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
522 if 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
|
523 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
|
524 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
|
525 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
526 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
|
527 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
528 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
529 def 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
|
530 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
|
531 f = () |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
532 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
|
533 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
|
534 f = ( |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
535 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
|
536 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
|
537 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
|
538 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
|
539 ) |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
540 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
|
541 |
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
542 return sidedatacompanion |