annotate hgsubversion/stupid.py @ 831:be5bbb2f2d68

svnrepo: kludge to work around hash changes between stupid and replay in hg 1.9 This causes every commit to get a new manifest, just like hg 1.8 and earlier. It also fixes some problems where stupid and replay produced different hashes under 1.9, which is the primary motivation for preserving the old behavior. Hopefully some day we can back this out and be smarter about stupid mode, or can stupid mode entirely in favor of some smarter validations in 'hg svn verify'.
author Augie Fackler <durin42@gmail.com>
date Mon, 10 Oct 2011 22:03:13 -0500
parents 033b86e0f56d
children e9af7eba88db
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1 import cStringIO
531
cf4fe45bf8fd Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 529
diff changeset
2 import errno
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3 import re
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5 from mercurial import context
822
033b86e0f56d stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents: 814
diff changeset
6 from mercurial import node
033b86e0f56d stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents: 814
diff changeset
7 from mercurial import patch
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8 from mercurial import revlog
822
033b86e0f56d stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents: 814
diff changeset
9 from mercurial import util as hgutil
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11 import svnwrap
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
12 import svnexternals
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
13 import util
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
14
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
15
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
16 binary_file_re = re.compile(r'''Index: ([^\n]*)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
17 =*
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
18 Cannot display: file marked as a binary type.''')
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
19
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
20 property_exec_set_re = re.compile(r'''Property changes on: ([^\n]*)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
21 _*
25
99f8e4b535e9 svn 1.4 and 1.5 have different ideas of diff output for prop changes.
Augie Fackler <durin42@gmail.com>
parents: 11
diff changeset
22 (?:Added|Name): svn:executable
111
5497d1264b4d fetch_command: Fix mis-converted executable when svn:executable was set to the
Augie Fackler <durin42@gmail.com>
parents: 110
diff changeset
23 \+''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
24
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
25 property_exec_removed_re = re.compile(r'''Property changes on: ([^\n]*)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
26 _*
25
99f8e4b535e9 svn 1.4 and 1.5 have different ideas of diff output for prop changes.
Augie Fackler <durin42@gmail.com>
parents: 11
diff changeset
27 (?:Deleted|Name): svn:executable
111
5497d1264b4d fetch_command: Fix mis-converted executable when svn:executable was set to the
Augie Fackler <durin42@gmail.com>
parents: 110
diff changeset
28 -''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
29
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
30 empty_file_patch_wont_make_re = re.compile(r'''Index: ([^\n]*)\n=*\n(?=Index:)''')
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
31
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
32 any_file_re = re.compile(r'''^Index: ([^\n]*)\n=*\n''', re.MULTILINE)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
33
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
34 property_special_set_re = re.compile(r'''Property changes on: ([^\n]*)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
35 _*
25
99f8e4b535e9 svn 1.4 and 1.5 have different ideas of diff output for prop changes.
Augie Fackler <durin42@gmail.com>
parents: 11
diff changeset
36 (?:Added|Name): svn:special
111
5497d1264b4d fetch_command: Fix mis-converted executable when svn:executable was set to the
Augie Fackler <durin42@gmail.com>
parents: 110
diff changeset
37 \+''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
38
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
39 property_special_removed_re = re.compile(r'''Property changes on: ([^\n]*)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
40 _*
25
99f8e4b535e9 svn 1.4 and 1.5 have different ideas of diff output for prop changes.
Augie Fackler <durin42@gmail.com>
parents: 11
diff changeset
41 (?:Deleted|Name): svn:special
111
5497d1264b4d fetch_command: Fix mis-converted executable when svn:executable was set to the
Augie Fackler <durin42@gmail.com>
parents: 110
diff changeset
42 \-''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
43
239
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
44
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
45 class BadPatchApply(Exception):
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
46 pass
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
47
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
48
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
49 def print_your_svn_is_old_message(ui): #pragma: no cover
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
50 ui.status("In light of that, I'll fall back and do diffs, but it won't do "
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
51 "as good a job. You should really upgrade your server.\n")
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
52
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
53 def mempatchproxy(parentctx, files):
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
54 # Avoid circular references patch.patchfile -> mempatch
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
55 patchfile = patch.patchfile
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
56
605
b72850177e5c stupid: update monkeypatch for 91c58cf54eee
Augie Fackler <durin42@gmail.com>
parents: 601
diff changeset
57 # TODO(durin42): make this a compat path for hg < 1.6.
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
58 class mempatch(patchfile):
605
b72850177e5c stupid: update monkeypatch for 91c58cf54eee
Augie Fackler <durin42@gmail.com>
parents: 601
diff changeset
59 def __init__(self, ui, fname, opener, missing=False, eolmode=None):
b72850177e5c stupid: update monkeypatch for 91c58cf54eee
Augie Fackler <durin42@gmail.com>
parents: 601
diff changeset
60 patchfile.__init__(self, ui, fname, None, False, eolmode)
133
2242dd1163c6 hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents: 129
diff changeset
61
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
62 def readlines(self, fname):
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
63 if fname not in parentctx:
531
cf4fe45bf8fd Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 529
diff changeset
64 raise IOError(errno.ENOENT, 'Cannot find %r to patch' % fname)
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
65 fctx = parentctx[fname]
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
66 data = fctx.data()
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
67 if 'l' in fctx.flags():
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
68 data = 'link ' + data
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
69 return cStringIO.StringIO(data).readlines()
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
70
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
71 def writelines(self, fname, lines):
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
72 files[fname] = ''.join(lines)
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
73
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
74 def unlink(self, fname):
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
75 files[fname] = None
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
76
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
77 return mempatch
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
78
200
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
79
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
80 def filteriterhunks(meta):
200
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
81 iterhunks = patch.iterhunks
801
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
82 def filterhunks(*args, **kwargs):
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
83 # ui, fp, sourcefile=None, textmode=False
200
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
84 applycurrent = False
424
3ae8edc3d8f1 stupid: handle the new eol option in hg-crew.
Augie Fackler <durin42@gmail.com>
parents: 422
diff changeset
85 # Passing False instead of textmode because we should never
3ae8edc3d8f1 stupid: handle the new eol option in hg-crew.
Augie Fackler <durin42@gmail.com>
parents: 422
diff changeset
86 # be ignoring EOL type.
801
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
87 if iterhunks.func_code.co_argcount == 1:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
88 # Since 1.9 (28762bb767dc)
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
89 fp = args[0]
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
90 gen = iterhunks(fp)
552
2d44461e8617 fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 547
diff changeset
91 else:
801
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
92 ui, fp = args[:2]
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
93 if len(args) > 2:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
94 sourcefile = args[2]
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
95 else:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
96 sourcefile = kwargs.get('sourcefile', None)
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
97 if len(args) > 3:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
98 textmode = args[3]
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
99 else:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
100 textmode = kwargs.get('textmode', False)
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
101 if not iterhunks.func_defaults:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
102 # Since 1.7 (cfedc529e4a1)
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
103 gen = iterhunks(ui, fp)
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
104 elif len(iterhunks.func_defaults) == 1:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
105 gen = iterhunks(ui, fp, sourcefile)
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
106 else:
37ad86983a6d stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents: 787
diff changeset
107 gen = iterhunks(ui, fp, sourcefile, textmode)
552
2d44461e8617 fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 547
diff changeset
108 for data in gen:
200
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
109 if data[0] == 'file':
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
110 if data[1][1] in meta.filemap:
200
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
111 applycurrent = True
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
112 else:
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
113 applycurrent = False
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
114 assert data[0] != 'git', 'Filtering git hunks not supported.'
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
115 if applycurrent:
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
116 yield data
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
117 return filterhunks
2e8c527f0456 stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
118
814
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
119 def patchrepoold(ui, meta, parentctx, patchfp):
811
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
120 files = {}
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
121 try:
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
122 oldpatchfile = patch.patchfile
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
123 olditerhunks = patch.iterhunks
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
124 patch.patchfile = mempatchproxy(parentctx, files)
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
125 patch.iterhunks = filteriterhunks(meta)
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
126 try:
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
127 # We can safely ignore the changed list since we are
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
128 # handling non-git patches. Touched files are known
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
129 # by our memory patcher.
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
130 patch_st = patch.applydiff(ui, patchfp, {}, strip=0)
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
131 finally:
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
132 patch.patchfile = oldpatchfile
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
133 patch.iterhunks = olditerhunks
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
134 except patch.PatchError:
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
135 # TODO: this happens if the svn server has the wrong mime
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
136 # type stored and doesn't know a file is binary. It would
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
137 # be better to do one file at a time and only do a
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
138 # full fetch on files that had problems.
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
139 raise BadPatchApply('patching failed')
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
140 # if this patch didn't apply right, fall back to exporting the
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
141 # entire rev.
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
142 if patch_st == -1:
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
143 assert False, ('This should only happen on case-insensitive'
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
144 ' volumes.')
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
145 elif patch_st == 1:
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
146 # When converting Django, I saw fuzz on .po files that was
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
147 # causing revisions to end up failing verification. If that
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
148 # can be fixed, maybe this won't ever be reached.
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
149 raise BadPatchApply('patching succeeded with fuzz')
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
150 return files
239
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
151
814
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
152 try:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
153 class svnbackend(patch.repobackend):
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
154 def getfile(self, fname):
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
155 data, (islink, isexec) = super(svnbackend, self).getfile(fname)
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
156 if islink:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
157 data = 'link ' + data
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
158 return data, (islink, isexec)
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
159 except AttributeError:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
160 svnbackend = None
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
161
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
162 def patchrepo(ui, meta, parentctx, patchfp):
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
163 if not svnbackend:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
164 return patchrepoold(ui, meta, parentctx, patchfp)
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
165 store = patch.filestore()
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
166 try:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
167 touched = set()
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
168 backend = svnbackend(ui, meta.repo, parentctx, store)
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
169 ret = patch.patchbackend(ui, backend, patchfp, 0, touched)
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
170 if ret < 0:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
171 raise BadPatchApply('patching failed')
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
172 if ret > 0:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
173 raise BadPatchApply('patching succeeded with fuzz')
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
174 files = {}
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
175 for f in touched:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
176 try:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
177 data, mode, copied = store.getfile(f)
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
178 files[f] = data
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
179 except IOError:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
180 files[f] = None
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
181 return files
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
182 finally:
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
183 store.close()
d32735c507cd stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents: 811
diff changeset
184
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
185 def diff_branchrev(ui, svn, meta, branch, branchpath, r, parentctx):
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
186 """Extract all 'branch' content at a given revision.
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
187
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
188 Return a tuple (files, filectxfn) where 'files' is the list of all files
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
189 in the branch at the given revision, and 'filectxfn' is a memctx compatible
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
190 callable to retrieve individual file information. Raise BadPatchApply upon
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
191 error.
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
192 """
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
193 try:
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
194 prev, pbranch, ppath = meta.get_source_rev(ctx=parentctx)
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
195 except KeyError:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
196 prev, pbranch, ppath = None, None, None
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
197 try:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
198 if prev is None or pbranch == branch:
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
199 # letting patch handle binaries sounded
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
200 # cool, but it breaks patch in sad ways
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
201 d = svn.get_unified_diff(branchpath, r.revnum, deleted=False,
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
202 ignore_type=False)
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
203 else:
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
204 d = svn.get_unified_diff(branchpath, r.revnum,
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
205 other_path=ppath, other_rev=prev,
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
206 deleted=True, ignore_type=True)
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
207 if d:
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
208 raise BadPatchApply('branch creation with mods')
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
209 except svnwrap.SubversionRepoCanNotDiff:
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
210 raise BadPatchApply('subversion diffing code is not supported')
601
0fe490ce2fbb isolate all imports of Subversion modules in svnwrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 588
diff changeset
211 except svnwrap.SubversionException, e:
0fe490ce2fbb isolate all imports of Subversion modules in svnwrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 588
diff changeset
212 if len(e.args) > 1 and e.args[1] != svnwrap.ERR_FS_NOT_FOUND:
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
213 raise
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
214 raise BadPatchApply('previous revision does not exist')
169
f1919e1c35bf fetch_command: cancel patching when encountering binary diffs
Patrick Mezard <pmezard@gmail.com>
parents: 168
diff changeset
215 if '\0' in d:
f1919e1c35bf fetch_command: cancel patching when encountering binary diffs
Patrick Mezard <pmezard@gmail.com>
parents: 168
diff changeset
216 raise BadPatchApply('binary diffs are not supported')
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
217 files_data = {}
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
218 # we have to pull each binary file by hand as a fulltext,
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
219 # which sucks but we've got no choice
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
220 binary_files = set(binary_file_re.findall(d))
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
221 touched_files = set(binary_files)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
222 d2 = empty_file_patch_wont_make_re.sub('', d)
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
223 d2 = property_exec_set_re.sub('', d2)
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
224 d2 = property_exec_removed_re.sub('', d2)
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
225 # Here we ensure that all files, including the new empty ones
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
226 # are marked as touched. Content is loaded on demand.
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
227 touched_files.update(any_file_re.findall(d))
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
228 if d2.strip() and len(re.findall('\n[-+]', d2.strip())) > 0:
811
ccefff0c4f91 stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents: 801
diff changeset
229 files_data = patchrepo(ui, meta, parentctx, cStringIO.StringIO(d2))
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
230 for x in files_data.iterkeys():
186
6266ba36ee15 Create patch to make normal output much less verbose…
Dan Villiom Podlaski Christiansen <danchr@cs.au.dk>
parents: 185
diff changeset
231 ui.note('M %s\n' % x)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
232 else:
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
233 ui.status('Not using patch for %s, diff had no hunks.\n' %
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
234 r.revnum)
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
235
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
236 exec_files = {}
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
237 for m in property_exec_removed_re.findall(d):
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
238 exec_files[m] = False
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
239 for m in property_exec_set_re.findall(d):
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
240 exec_files[m] = True
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
241 touched_files.update(exec_files)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
242 link_files = {}
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
243 for m in property_special_set_re.findall(d):
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
244 # TODO(augie) when a symlink is removed, patching will fail.
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
245 # We're seeing that above - there's gotta be a better
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
246 # workaround than just bailing like that.
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
247 assert m in files_data
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
248 link_files[m] = True
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
249 for m in property_special_removed_re.findall(d):
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
250 assert m in files_data
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
251 link_files[m] = False
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
252
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
253 unknown_files = set()
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
254 for p in r.paths:
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
255 action = r.paths[p].action
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
256 if not p.startswith(branchpath) or action not in 'DR':
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
257 continue
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
258 if branchpath:
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
259 p2 = p[len(branchpath)+1:].strip('/')
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
260 else:
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
261 p2 = p
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
262 if p2 in parentctx:
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
263 toucheds = [p2]
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
264 else:
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
265 # If this isn't in the parent ctx, it must've been a dir
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
266 toucheds = [f for f in parentctx if f.startswith(p2 + '/')]
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
267 if action == 'R':
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
268 # Files were replaced, we don't know if they still exist
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
269 unknown_files.update(toucheds)
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
270 else:
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
271 files_data.update((f, None) for f in toucheds)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
272
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
273 touched_files.update(files_data)
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
274 touched_files.update(unknown_files)
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
275
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
276 copies = getcopies(svn, meta, branch, branchpath, r, touched_files,
110
a4dcffaa6538 fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents: 109
diff changeset
277 parentctx)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
278
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
279 def filectxfn(repo, memctx, path):
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
280 if path in files_data and files_data[path] is None:
557
d74bf020a61c replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents: 552
diff changeset
281 raise IOError(errno.ENOENT, '%s is deleted' % path)
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
282
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
283 if path in binary_files or path in unknown_files:
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
284 pa = path
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
285 if branchpath:
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
286 pa = branchpath + '/' + path
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
287 data, mode = svn.get_file(pa, r.revnum)
128
bab5bcbbb3dc fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 127
diff changeset
288 isexe = 'x' in mode
bab5bcbbb3dc fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 127
diff changeset
289 islink = 'l' in mode
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
290 else:
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
291 isexe = exec_files.get(path, 'x' in parentctx.flags(path))
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
292 islink = link_files.get(path, 'l' in parentctx.flags(path))
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
293 data = ''
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
294 if path in files_data:
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
295 data = files_data[path]
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
296 if islink:
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
297 data = data[len('link '):]
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
298 elif path in parentctx:
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
299 data = parentctx[path].data()
133
2242dd1163c6 hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents: 129
diff changeset
300
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
301 copied = copies.get(path)
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
302 # TODO this branch feels like it should not be required,
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
303 # and this may actually imply a bug in getcopies
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
304 if copied not in parentctx.manifest():
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
305 copied = None
128
bab5bcbbb3dc fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 127
diff changeset
306 return context.memfilectx(path=path, data=data, islink=islink,
bab5bcbbb3dc fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 127
diff changeset
307 isexec=isexe, copied=copied)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
308
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
309 return list(touched_files), filectxfn
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
310
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
311 def makecopyfinder(meta, r, branchpath):
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
312 """Return a function detecting copies.
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
313
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
314 Returned copyfinder(path) returns None if no copy information can
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
315 be found or ((source, sourcerev), sourcepath) where "sourcepath" is the
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
316 copy source path, "sourcerev" the source svn revision and "source" is the
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
317 copy record path causing the copy to occur. If a single file was copied
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
318 "sourcepath" and "source" are the same, while file copies dectected from
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
319 directory copies return the copied source directory in "source".
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
320 """
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
321 # cache changeset contexts and map them to source svn revisions
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
322 ctxs = {}
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
323 def getctx(branch, svnrev):
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
324 if svnrev in ctxs:
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
325 return ctxs[svnrev]
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
326 changeid = meta.get_parent_revision(svnrev + 1, branch, True)
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
327 ctx = None
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
328 if changeid != revlog.nullid:
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
329 ctx = meta.repo.changectx(changeid)
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
330 ctxs[svnrev] = ctx
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
331 return ctx
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
332
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
333 # filter copy information for current branch
495
44bde69b6c49 stupid: detect renames with empty branchpath properly
Augie Fackler <durin42@gmail.com>
parents: 494
diff changeset
334 branchpath = (branchpath and branchpath + '/') or ''
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
335 copies = []
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
336 for path, e in r.paths.iteritems():
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
337 if not e.copyfrom_path:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
338 continue
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
339 if not path.startswith(branchpath):
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
340 continue
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
341 # compute converted source path and revision
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
342 frompath, frombranch = meta.split_branch_path(e.copyfrom_path)[:2]
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
343 if frompath is None:
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
344 continue
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
345 fromctx = getctx(frombranch, e.copyfrom_rev)
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
346 if fromctx is None:
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
347 continue
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
348 destpath = path[len(branchpath):]
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
349 copies.append((destpath, (frompath, fromctx)))
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
350
163
fdc249cd1a0a Combine sort and reverse.
Martin Geisler <mg@daimi.au.dk>
parents: 158
diff changeset
351 copies.sort(reverse=True)
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
352 exactcopies = dict(copies)
101
a3b717e4abf5 Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents: 98
diff changeset
353
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
354 def finder(path):
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
355 if path in exactcopies:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
356 return exactcopies[path], exactcopies[path][0]
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
357 # look for parent directory copy, longest first
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
358 for dest, (source, sourcectx) in copies:
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
359 dest = dest + '/'
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
360 if not path.startswith(dest):
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
361 continue
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
362 sourcepath = source + '/' + path[len(dest):]
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
363 return (source, sourcectx), sourcepath
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
364 return None
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
365
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
366 return finder
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
367
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
368 def getcopies(svn, meta, branch, branchpath, r, files, parentctx):
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
369 """Return a mapping {dest: source} for every file copied into r.
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
370 """
110
a4dcffaa6538 fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents: 109
diff changeset
371 if parentctx.node() == revlog.nullid:
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
372 return {}
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
373
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
374 # Extract svn copy information, group them by copy source.
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
375 # The idea is to duplicate the replay behaviour where copies are
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
376 # evaluated per copy event (one event for all files in a directory copy,
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
377 # one event for single file copy). We assume that copy events match
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
378 # copy sources in revision info.
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
379 svncopies = {}
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
380 finder = makecopyfinder(meta, r, branchpath)
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
381 for f in files:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
382 copy = finder(f)
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
383 if copy:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
384 svncopies.setdefault(copy[0], []).append((f, copy[1]))
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
385 if not svncopies:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
386 return {}
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
387
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
388 # check svn copies really make sense in mercurial
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
389 hgcopies = {}
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
390 for (sourcepath, sourcectx), copies in svncopies.iteritems():
496
5e0dfe59d4c3 copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents: 495
diff changeset
391 for k, v in copies:
497
cad864ed29de util: make aresamefiles take one file and just be issamefile instead.
Augie Fackler <durin42@gmail.com>
parents: 496
diff changeset
392 if not util.issamefile(sourcectx, parentctx, v):
496
5e0dfe59d4c3 copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents: 495
diff changeset
393 continue
5e0dfe59d4c3 copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents: 495
diff changeset
394 hgcopies.update({k: v})
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
395 return hgcopies
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
396
762
c31a1f92e1c6 svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents: 758
diff changeset
397 def fetch_externals(ui, svn, branchpath, r, parentctx):
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
398 """Extract svn:externals for the current revision and branch
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
399
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
400 Return an externalsfile instance or None if there are no externals
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
401 to convert and never were.
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
402 """
762
c31a1f92e1c6 svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents: 758
diff changeset
403 externals = svnexternals.parse(ui, parentctx)
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
404 # Detect property additions only, changes are handled by checking
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
405 # existing entries individually. Projects are unlikely to store
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
406 # externals on many different root directories, so we trade code
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
407 # duplication and complexity for a constant lookup price at every
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
408 # revision in the common case.
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
409 dirs = set(externals)
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
410 if parentctx.node() == revlog.nullid:
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
411 dirs.update([p for p,k in svn.list_files(branchpath, r.revnum) if k == 'd'])
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
412 dirs.add('')
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
413 else:
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
414 branchprefix = (branchpath and branchpath + '/') or branchpath
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
415 for path, e in r.paths.iteritems():
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
416 if e.action == 'D':
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
417 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
418 if not path.startswith(branchprefix) and path != branchpath:
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
419 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
420 kind = svn.checkpath(path, r.revnum)
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
421 if kind != 'd':
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
422 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
423 path = path[len(branchprefix):]
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
424 dirs.add(path)
184
d3ea6c98a086 Do not recurse for externals on copied directory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 182
diff changeset
425 if e.action == 'M' or (e.action == 'A' and e.copyfrom_path):
d3ea6c98a086 Do not recurse for externals on copied directory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 182
diff changeset
426 # Do not recurse in copied directories, changes are marked
d3ea6c98a086 Do not recurse for externals on copied directory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 182
diff changeset
427 # as 'M', except for the copied one.
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
428 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
429 for child, k in svn.list_files(branchprefix + path, r.revnum):
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
430 if k == 'd':
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
431 dirs.add((path + '/' + child).strip('/'))
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
432
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
433 # Retrieve new or updated values
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
434 for dir in dirs:
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
435 try:
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
436 dpath = (branchpath and branchpath + '/' + dir) or dir
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
437 values = svn.list_props(dpath, r.revnum)
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
438 externals[dir] = values.get('svn:externals', '')
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
439 except IOError:
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
440 externals[dir] = ''
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
441 return externals
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
442
239
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
443
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
444 def fetch_branchrev(svn, meta, branch, branchpath, r, parentctx):
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
445 """Extract all 'branch' content at a given revision.
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
446
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
447 Return a tuple (files, filectxfn) where 'files' is the list of all files
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
448 in the branch at the given revision, and 'filectxfn' is a memctx compatible
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
449 callable to retrieve individual file information.
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
450 """
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 79
diff changeset
451 files = []
110
a4dcffaa6538 fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents: 109
diff changeset
452 if parentctx.node() == revlog.nullid:
88
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
453 # Initial revision, fetch all files
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
454 for path, kind in svn.list_files(branchpath, r.revnum):
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
455 if kind == 'f':
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 79
diff changeset
456 files.append(path)
88
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
457 else:
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
458 branchprefix = (branchpath and branchpath + '/') or ''
88
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
459 for path, e in r.paths.iteritems():
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
460 if not path.startswith(branchprefix):
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 79
diff changeset
461 continue
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
462 if not meta.is_path_valid(path):
179
a336e3e82648 Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents: 176
diff changeset
463 continue
88
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
464 kind = svn.checkpath(path, r.revnum)
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
465 path = path[len(branchprefix):]
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
466 if kind == 'f':
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
467 files.append(path)
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
468 elif kind == 'd':
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
469 if e.action == 'M':
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
470 continue
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
471 dirpath = branchprefix + path
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
472 for child, k in svn.list_files(dirpath, r.revnum):
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
473 if k == 'f':
656
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
474 if path:
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
475 childpath = '%s/%s' % (path, child)
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
476 else:
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
477 childpath = child
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
478 files.append(childpath)
583
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
479 if e.action == 'R':
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
480 # Check all files in replaced directory
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
481 path = path + '/'
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
482 files += [f for f in parentctx if f.startswith(path)]
88
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
483 else:
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
484 if path in parentctx:
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
485 files.append(path)
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
486 continue
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
487 # Assume it's a deleted directory
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
488 path = path + '/'
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
489 deleted = [f for f in parentctx if f.startswith(path)]
101
a3b717e4abf5 Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents: 98
diff changeset
490 files += deleted
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 79
diff changeset
491
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
492 copies = getcopies(svn, meta, branch, branchpath, r, files, parentctx)
101
a3b717e4abf5 Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents: 98
diff changeset
493
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
494 def filectxfn(repo, memctx, path):
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
495 svnpath = path
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
496 if branchpath:
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
497 svnpath = branchpath + '/' + path
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
498 data, mode = svn.get_file(svnpath, r.revnum)
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
499 isexec = 'x' in mode
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
500 islink = 'l' in mode
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
501 copied = copies.get(path)
535
715d2e3e153b stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 532
diff changeset
502 # TODO this branch feels like it should not be required,
715d2e3e153b stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 532
diff changeset
503 # and this may actually imply a bug in getcopies
715d2e3e153b stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 532
diff changeset
504 if copied not in parentctx.manifest():
715d2e3e153b stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 532
diff changeset
505 copied = None
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
506 return context.memfilectx(path=path, data=data, islink=islink,
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
507 isexec=isexec, copied=copied)
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
508
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
509 return files, filectxfn
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
510
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
511 def checkbranch(meta, r, branch):
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
512 branchedits = meta.revmap.branchedits(branch, r)
373
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
513 if not branchedits:
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
514 return None
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
515 branchtip = branchedits[0][1]
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
516 for child in meta.repo[branchtip].children():
375
af9fc01299b4 Make branch closing more Mercurial-like.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 374
diff changeset
517 b = child.branch() != 'default' and child.branch() or None
af9fc01299b4 Make branch closing more Mercurial-like.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 374
diff changeset
518 if b == branch and child.extra().get('close'):
373
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
519 return None
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
520 return branchtip
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
521
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
522 def branches_in_paths(meta, tbdelta, paths, revnum, checkpath, listdir):
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
523 '''Given a list of paths, return mapping of all branches touched
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
524 to their branch path.
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
525 '''
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
526 branches = {}
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
527 paths_need_discovery = []
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
528 for p in paths:
540
8dc759dc9ca9 svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents: 536
diff changeset
529 relpath, branch, branchpath = meta.split_branch_path(p)
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
530 if relpath is not None:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
531 branches[branch] = branchpath
517
ef288fb7f2fe svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents: 514
diff changeset
532 elif paths[p].action == 'D' and not meta.get_path_tag(p):
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
533 ln = meta.localname(p)
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
534 # must check in branches_to_delete as well, because this runs after we
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
535 # already updated the branch map
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
536 if ln in meta.branches or ln in tbdelta['branches'][1]:
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
537 branches[ln] = p
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
538 else:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
539 paths_need_discovery.append(p)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
540
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
541 if not paths_need_discovery:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
542 return branches
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
543
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
544 paths_need_discovery = [(len(p), p) for p in paths_need_discovery]
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
545 paths_need_discovery.sort()
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
546 paths_need_discovery = [p[1] for p in paths_need_discovery]
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
547 actually_files = []
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
548 while paths_need_discovery:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
549 p = paths_need_discovery.pop(0)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
550 path_could_be_file = True
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
551 ind = 0
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
552 while ind < len(paths_need_discovery) and not paths_need_discovery:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
553 if op.startswith(p):
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
554 path_could_be_file = False
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
555 ind += 1
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
556 if path_could_be_file:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
557 if checkpath(p, revnum) == 'f':
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
558 actually_files.append(p)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
559 # if there's a copyfrom_path and there were files inside that copyfrom,
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
560 # we need to detect those branches. It's a little thorny and slow, but
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
561 # seems to be the best option.
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
562 elif paths[p].copyfrom_path and not p.startswith('tags/'):
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
563 paths_need_discovery.extend(['%s/%s' % (p,x[0])
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
564 for x in listdir(p, revnum)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
565 if x[1] == 'f'])
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
566
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
567 if not actually_files:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
568 continue
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
569
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
570 filepaths = [p.split('/') for p in actually_files]
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
571 filepaths = [(len(p), p) for p in filepaths]
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
572 filepaths.sort()
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
573 filepaths = [p[1] for p in filepaths]
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
574 while filepaths:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
575 path = filepaths.pop(0)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
576 parentdir = '/'.join(path[:-1])
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
577 filepaths = [p for p in filepaths if not '/'.join(p).startswith(parentdir)]
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
578 branchpath = meta.normalize(parentdir)
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
579 if branchpath.startswith('tags/'):
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
580 continue
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
581 branchname = meta.localname(branchpath)
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
582 if branchpath.startswith('trunk/'):
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
583 branches[meta.localname('trunk')] = 'trunk'
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
584 continue
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
585 if branchname and branchname.startswith('../'):
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
586 continue
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
587 branches[branchname] = branchpath
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
588 return branches
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
589
787
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 769
diff changeset
590 def convert_rev(ui, meta, svn, r, tbdelta, firstrun):
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
591 # this server fails at replay
367
ce64d57172a3 Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 366
diff changeset
592
822
033b86e0f56d stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents: 814
diff changeset
593 if meta.filemap:
033b86e0f56d stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents: 814
diff changeset
594 raise hgutil.Abort('filemaps currently unsupported with stupid replay.')
033b86e0f56d stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents: 814
diff changeset
595
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
596 branches = branches_in_paths(meta, tbdelta, r.paths, r.revnum,
412
5cba60948f92 stupid: eliminate dependency on editor.current
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 411
diff changeset
597 svn.checkpath, svn.list_files)
203
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
598 brpaths = branches.values()
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
599 bad_branch_paths = {}
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
600 for br, bp in branches.iteritems():
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
601 bad_branch_paths[br] = []
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
602
490
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
603 # This next block might be needed, but for now I'm omitting it until it
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
604 # can be proven necessary.
203
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
605 # for bad in brpaths:
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
606 # if bad.startswith(bp) and len(bad) > len(bp):
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
607 # bad_branch_paths[br].append(bad[len(bp)+1:])
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
608
490
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
609 # We've go a branch that contains other branches. We have to be careful
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
610 # to get results similar to real replay in this case.
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
611 for existingbr in meta.branches:
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
612 bad = meta.remotename(existingbr)
203
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
613 if bad.startswith(bp) and len(bad) > len(bp):
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
614 bad_branch_paths[br].append(bad[len(bp)+1:])
373
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
615
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
616 deleted_branches = {}
203
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
617 for p in r.paths:
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
618 tag = meta.get_path_tag(p)
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
619 if tag and tag not in meta.tags:
203
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
620 continue
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
621 branch = meta.localname(p)
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
622 if not (r.paths[p].action == 'R' and branch in meta.branches):
373
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
623 continue
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
624 closed = checkbranch(meta, r, branch)
373
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
625 if closed is not None:
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
626 deleted_branches[branch] = closed
237
c90cfa665b81 Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 234
diff changeset
627
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
628 date = meta.fixdate(r.date)
472
ba65e97538d1 stupid: take tbdelta closed branches in account
Patrick Mezard <pmezard@gmail.com>
parents: 452
diff changeset
629 check_deleted_branches = set(tbdelta['branches'][1])
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
630 for b in branches:
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
631 parentctx = meta.repo[meta.get_parent_revision(r.revnum, b)]
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
632 tag = meta.get_path_tag(meta.remotename(b))
119
ea65fe2b0856 hg_delta_editor: fix update of stray files in branches/
Patrick Mezard <pmezard@gmail.com>
parents: 118
diff changeset
633 kind = svn.checkpath(branches[b], r.revnum)
ea65fe2b0856 hg_delta_editor: fix update of stray files in branches/
Patrick Mezard <pmezard@gmail.com>
parents: 118
diff changeset
634 if kind != 'd':
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
635 if not tag:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
636 # Branch does not exist at this revision. Get parent
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
637 # revision and remove everything.
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
638 deleted_branches[b] = parentctx.node()
133
2242dd1163c6 hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents: 129
diff changeset
639 continue
179
a336e3e82648 Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents: 176
diff changeset
640
648
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
641 incremental = (meta.revmap.oldest > 0)
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
642
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
643 if incremental:
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
644 try:
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
645 files_touched, filectxfn2 = diff_branchrev(
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
646 ui, svn, meta, b, branches[b], r, parentctx)
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
647 except BadPatchApply, e:
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
648 # Either this revision or the previous one does not exist.
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
649 ui.note("Fetching entire revision: %s.\n" % e.args[0])
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
650 incremental = False
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
651 if not incremental:
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
652 files_touched, filectxfn2 = fetch_branchrev(
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
653 svn, meta, b, branches[b], r, parentctx)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
654
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
655 externals = {}
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
656 if meta.layout != 'single':
762
c31a1f92e1c6 svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents: 758
diff changeset
657 externals = fetch_externals(ui, svn, branches[b], r, parentctx)
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
658 externals = svnexternals.getchanges(ui, meta.repo, parentctx,
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
659 externals)
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
660 files_touched.extend(externals)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
661
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
662 def filectxfn(repo, memctx, path):
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
663 if path in externals:
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
664 if externals[path] is None:
557
d74bf020a61c replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents: 552
diff changeset
665 raise IOError(errno.ENOENT, 'no externals')
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
666 return context.memfilectx(path=path, data=externals[path],
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
667 islink=False, isexec=False,
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
668 copied=None)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
669 for bad in bad_branch_paths[b]:
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
670 if path.startswith(bad):
557
d74bf020a61c replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents: 552
diff changeset
671 raise IOError(errno.ENOENT, 'Path %s is bad' % path)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
672 return filectxfn2(repo, memctx, path)
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
673
59
430af23bef4a Performance fix for branches-from-tags in real replay, which is tied up with
Augie Fackler <durin42@gmail.com>
parents: 58
diff changeset
674 if '' in files_touched:
430af23bef4a Performance fix for branches-from-tags in real replay, which is tied up with
Augie Fackler <durin42@gmail.com>
parents: 58
diff changeset
675 files_touched.remove('')
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
676 excluded = [f for f in files_touched if f not in meta.filemap]
188
f48cd62a9de4 fetch_command: fix coding style
Patrick Mezard <pmezard@gmail.com>
parents: 187
diff changeset
677 for f in excluded:
f48cd62a9de4 fetch_command: fix coding style
Patrick Mezard <pmezard@gmail.com>
parents: 187
diff changeset
678 files_touched.remove(f)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
679
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
680 if b:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
681 # Regular tag without modifications, it will be committed by
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
682 # svnmeta.committag(), we can skip the whole branch for now
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
683 if (tag and tag not in meta.tags and
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
684 b not in meta.branches
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
685 and b not in meta.repo.branchtags()
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
686 and not files_touched):
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
687 continue
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
688
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
689 if parentctx.node() == node.nullid and not files_touched:
494
6eea269ff134 stupid: remove stray print statements, keep one as a ui.debug
Augie Fackler <durin42@gmail.com>
parents: 490
diff changeset
690 meta.repo.ui.debug('skipping commit since parent is null and no files touched.\n')
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
691 continue
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
692
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
693 for f in files_touched:
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
694 if f:
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
695 # this is a case that really shouldn't ever happen, it means
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
696 # something is very wrong
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
697 assert f[0] != '/'
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
698
422
6086363e8230 svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 418
diff changeset
699 extra = meta.genextra(r.revnum, b)
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
700 if tag:
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
701 if parentctx.node() == node.nullid:
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
702 continue
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
703 extra.update({'branch': parentctx.extra().get('branch', None),
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
704 'close': 1})
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
705
640
a3d20d6e96b0 stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
706 origbranch = extra.get('branch', None)
574
8e025a6f0db4 add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 557
diff changeset
707 meta.mapbranch(extra)
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
708 current_ctx = context.memctx(meta.repo,
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
709 [parentctx.node(), revlog.nullid],
769
cc1d4aa3ba41 configurable substitution for empty commit message (fixes #195)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 762
diff changeset
710 r.message or util.default_commit_msg(ui),
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
711 files_touched,
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
712 filectxfn,
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
713 meta.authors[r.author],
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
714 date,
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
715 extra)
831
be5bbb2f2d68 svnrepo: kludge to work around hash changes between stupid and replay in hg 1.9
Augie Fackler <durin42@gmail.com>
parents: 822
diff changeset
716 ha = meta.repo.svn_commitctx(current_ctx)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
717
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
718 if not tag:
640
a3d20d6e96b0 stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
719 if (not origbranch in meta.branches
a3d20d6e96b0 stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
720 and not meta.get_path_tag(meta.remotename(origbranch))):
a3d20d6e96b0 stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
721 meta.branches[origbranch] = None, 0, r.revnum
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
722 meta.revmap[r.revnum, b] = ha
452
ae35c389cdef tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents: 447
diff changeset
723 else:
634
a400f3bf5611 replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 623
diff changeset
724 meta.movetag(tag, ha, r, date)
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
725 meta.addedtags.pop(tag, None)
452
ae35c389cdef tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents: 447
diff changeset
726 util.describe_commit(ui, ha, b)
373
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
727
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
728 # These are branches with an 'R' status in svn log. This means they were
147
22162380c4b9 Improve branch closing in the case of a single-rev replacement of one branch
Augie Fackler <durin42@gmail.com>
parents: 141
diff changeset
729 # replaced by some other branch, so we need to verify they get marked as closed.
22162380c4b9 Improve branch closing in the case of a single-rev replacement of one branch
Augie Fackler <durin42@gmail.com>
parents: 141
diff changeset
730 for branch in check_deleted_branches:
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
731 closed = checkbranch(meta, r, branch)
373
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
732 if closed is not None:
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
733 deleted_branches[branch] = closed
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
734
432
4bf90f8c9b7b consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 424
diff changeset
735 return deleted_branches