annotate hgsubversion/stupid.py @ 769:cc1d4aa3ba41

configurable substitution for empty commit message (fixes #195) The value of the default commit message is now configurable by setting 'hgsubversion.defaultmessage'. In addition, the log output is made consistent with the result of the conversion.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Sun, 28 Nov 2010 03:47:04 +0100
parents c31a1f92e1c6
children 4bbc6bf947f5
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 patch
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6 from mercurial import node
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7 from mercurial import context
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8 from mercurial import revlog
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10 import svnwrap
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
11 import svnexternals
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
12 import util
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
13
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 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
16 =*
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
17 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
18
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
19 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
20 _*
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
21 (?: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
22 \+''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
23
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
24 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
25 _*
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
26 (?: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
27 -''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
28
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
29 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
30
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
31 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
32
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
33 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
34 _*
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
35 (?: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
36 \+''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
37
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
38 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
39 _*
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
40 (?: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
41 \-''')
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
42
239
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
43
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
44 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
45 pass
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
46
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 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
49 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
50 "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
51
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
552
2d44461e8617 fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 547
diff changeset
82 def filterhunks(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
83 applycurrent = False
424
3ae8edc3d8f1 stupid: handle the new eol option in hg-crew.
Augie Fackler <durin42@gmail.com>
parents: 422
diff changeset
84 # 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
85 # be ignoring EOL type.
739
2bf300b83136 stupid: handle patch.iterhunks() changed brought by cfedc529e4a1
Patrick Mezard <pmezard@gmail.com>
parents: 656
diff changeset
86 if not iterhunks.func_defaults:
2bf300b83136 stupid: handle patch.iterhunks() changed brought by cfedc529e4a1
Patrick Mezard <pmezard@gmail.com>
parents: 656
diff changeset
87 # Since 1.7 (cfedc529e4a1)
2bf300b83136 stupid: handle patch.iterhunks() changed brought by cfedc529e4a1
Patrick Mezard <pmezard@gmail.com>
parents: 656
diff changeset
88 gen = iterhunks(ui, fp)
2bf300b83136 stupid: handle patch.iterhunks() changed brought by cfedc529e4a1
Patrick Mezard <pmezard@gmail.com>
parents: 656
diff changeset
89 elif len(iterhunks.func_defaults) == 1:
552
2d44461e8617 fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 547
diff changeset
90 gen = iterhunks(ui, fp, sourcefile)
2d44461e8617 fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 547
diff changeset
91 else:
2d44461e8617 fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 547
diff changeset
92 gen = iterhunks(ui, fp, sourcefile, textmode)
2d44461e8617 fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 547
diff changeset
93 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
94 if data[0] == 'file':
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
95 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
96 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
97 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
98 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
99 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
100 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
101 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
102 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
103
239
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
104
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
105 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
106 """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
107
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
108 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
109 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
110 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
111 error.
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
112 """
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
113 try:
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
114 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
115 except KeyError:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
116 prev, pbranch, ppath = None, None, None
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
117 try:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
118 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
119 # letting patch handle binaries sounded
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
120 # 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
121 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
122 ignore_type=False)
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
123 else:
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
124 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
125 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
126 deleted=True, ignore_type=True)
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
127 if d:
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
128 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
129 except svnwrap.SubversionRepoCanNotDiff:
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
130 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
131 except svnwrap.SubversionException, e:
0fe490ce2fbb isolate all imports of Subversion modules in svnwrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 588
diff changeset
132 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
133 raise
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
134 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
135 if '\0' in d:
f1919e1c35bf fetch_command: cancel patching when encountering binary diffs
Patrick Mezard <pmezard@gmail.com>
parents: 168
diff changeset
136 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
137 files_data = {}
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
138 # 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
139 # which sucks but we've got no choice
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
140 binary_files = set(binary_file_re.findall(d))
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
141 touched_files = set(binary_files)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
142 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
143 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
144 d2 = property_exec_removed_re.sub('', d2)
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
145 # 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
146 # are marked as touched. Content is loaded on demand.
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
147 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
148 if d2.strip() and len(re.findall('\n[-+]', d2.strip())) > 0:
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
149 try:
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
150 oldpatchfile = patch.patchfile
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
151 olditerhunks = patch.iterhunks
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
152 patch.patchfile = mempatchproxy(parentctx, files_data)
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
153 patch.iterhunks = filteriterhunks(meta)
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
154 try:
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
155 # We can safely ignore the changed list since we are
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
156 # handling non-git patches. Touched files are known
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
157 # by our memory patcher.
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
158 patch_st = patch.applydiff(ui, cStringIO.StringIO(d2),
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
159 {}, strip=0)
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
160 finally:
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
161 patch.patchfile = oldpatchfile
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
162 patch.iterhunks = olditerhunks
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
163 except patch.PatchError:
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
164 # TODO: this happens if the svn server has the wrong mime
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
165 # type stored and doesn't know a file is binary. It would
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
166 # be better to do one file at a time and only do a
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
167 # full fetch on files that had problems.
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
168 raise BadPatchApply('patching failed')
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
169 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
170 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
171 # if this patch didn't apply right, fall back to exporting the
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
172 # entire rev.
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
173 if patch_st == -1:
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
174 assert False, ('This should only happen on case-insensitive'
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
175 ' volumes.')
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
176 elif patch_st == 1:
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
177 # When converting Django, I saw fuzz on .po files that was
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
178 # causing revisions to end up failing verification. If that
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
179 # can be fixed, maybe this won't ever be reached.
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
180 raise BadPatchApply('patching succeeded with fuzz')
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
181 else:
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
182 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
183 r.revnum)
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
184
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
185 exec_files = {}
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
186 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
187 exec_files[m] = False
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
188 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
189 exec_files[m] = True
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
190 touched_files.update(exec_files)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
191 link_files = {}
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
192 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
193 # 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
194 # 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
195 # 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
196 assert m in files_data
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
197 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
198 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
199 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
200 link_files[m] = False
127
7e45bcf52b64 fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 119
diff changeset
201
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
202 unknown_files = set()
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
203 for p in r.paths:
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
204 action = r.paths[p].action
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
205 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
206 continue
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
207 if branchpath:
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
208 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
209 else:
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
210 p2 = p
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
211 if p2 in parentctx:
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
212 toucheds = [p2]
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
213 else:
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
214 # 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
215 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
216 if action == 'R':
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
217 # 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
218 unknown_files.update(toucheds)
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
219 else:
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
220 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
221
529
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
222 touched_files.update(files_data)
68667b627bd5 stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents: 528
diff changeset
223 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
224
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
225 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
226 parentctx)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
227
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
228 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
229 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
230 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
231
528
052050ca59d6 replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents: 517
diff changeset
232 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
233 pa = path
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
234 if branchpath:
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
235 pa = branchpath + '/' + path
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
236 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
237 isexe = 'x' in mode
bab5bcbbb3dc fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 127
diff changeset
238 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
239 else:
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
240 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
241 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
242 data = ''
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
243 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
244 data = files_data[path]
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
245 if islink:
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
246 data = data[len('link '):]
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
247 elif path in parentctx:
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
248 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
249
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
250 copied = copies.get(path)
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
251 # 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
252 # and this may actually imply a bug in getcopies
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
253 if copied not in parentctx.manifest():
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
254 copied = None
128
bab5bcbbb3dc fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 127
diff changeset
255 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
256 isexec=isexe, copied=copied)
108
de19a13edfa8 fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents: 107
diff changeset
257
129
59f8603a6641 fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents: 128
diff changeset
258 return list(touched_files), filectxfn
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
259
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
260 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
261 """Return a function detecting copies.
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
262
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
263 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
264 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
265 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
266 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
267 "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
268 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
269 """
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
270 # cache changeset contexts and map them to source svn revisions
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
271 ctxs = {}
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
272 def getctx(branch, svnrev):
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
273 if svnrev in ctxs:
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
274 return ctxs[svnrev]
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
275 changeid = meta.get_parent_revision(svnrev + 1, branch, True)
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
276 ctx = None
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
277 if changeid != revlog.nullid:
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
278 ctx = meta.repo.changectx(changeid)
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
279 ctxs[svnrev] = ctx
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
280 return ctx
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
281
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
282 # filter copy information for current branch
495
44bde69b6c49 stupid: detect renames with empty branchpath properly
Augie Fackler <durin42@gmail.com>
parents: 494
diff changeset
283 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
284 copies = []
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
285 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
286 if not e.copyfrom_path:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
287 continue
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
288 if not path.startswith(branchpath):
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
289 continue
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
290 # compute converted source path and revision
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
291 frompath, frombranch = meta.split_branch_path(e.copyfrom_path)[:2]
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
292 if frompath is None:
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
293 continue
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
294 fromctx = getctx(frombranch, e.copyfrom_rev)
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
295 if fromctx is None:
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
296 continue
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
297 destpath = path[len(branchpath):]
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
298 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
299
163
fdc249cd1a0a Combine sort and reverse.
Martin Geisler <mg@daimi.au.dk>
parents: 158
diff changeset
300 copies.sort(reverse=True)
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
301 exactcopies = dict(copies)
101
a3b717e4abf5 Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents: 98
diff changeset
302
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
303 def finder(path):
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
304 if path in exactcopies:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
305 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
306 # look for parent directory copy, longest first
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
307 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
308 dest = dest + '/'
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
309 if not path.startswith(dest):
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
310 continue
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
311 sourcepath = source + '/' + path[len(dest):]
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
312 return (source, sourcectx), sourcepath
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
313 return None
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
314
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
315 return finder
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
316
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
317 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
318 """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
319 """
110
a4dcffaa6538 fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents: 109
diff changeset
320 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
321 return {}
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
322
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
323 # 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
324 # 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
325 # 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
326 # 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
327 # copy sources in revision info.
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
328 svncopies = {}
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
329 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
330 for f in files:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
331 copy = finder(f)
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
332 if copy:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
333 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
334 if not svncopies:
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
335 return {}
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
336
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
337 # 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
338 hgcopies = {}
588
2723152c8111 stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents: 583
diff changeset
339 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
340 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
341 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
342 continue
5e0dfe59d4c3 copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents: 495
diff changeset
343 hgcopies.update({k: v})
73
9c1b53abefcb fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 63
diff changeset
344 return hgcopies
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
345
762
c31a1f92e1c6 svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents: 758
diff changeset
346 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
347 """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
348
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
349 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
350 to convert and never were.
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
351 """
762
c31a1f92e1c6 svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents: 758
diff changeset
352 externals = svnexternals.parse(ui, parentctx)
174
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
353 # 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
354 # 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
355 # 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
356 # 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
357 # revision in the common case.
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
358 dirs = set(externals)
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
359 if parentctx.node() == revlog.nullid:
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
360 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
361 dirs.add('')
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
362 else:
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
363 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
364 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
365 if e.action == 'D':
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
366 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
367 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
368 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
369 kind = svn.checkpath(path, r.revnum)
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
370 if kind != 'd':
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
371 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
372 path = path[len(branchprefix):]
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
373 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
374 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
375 # 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
376 # 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
377 continue
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
378 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
379 if k == 'd':
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
380 dirs.add((path + '/' + child).strip('/'))
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
381
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
382 # Retrieve new or updated values
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
383 for dir in dirs:
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
384 try:
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
385 dpath = (branchpath and branchpath + '/' + dir) or dir
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
386 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
387 externals[dir] = values.get('svn:externals', '')
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
388 except IOError:
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
389 externals[dir] = ''
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
390 return externals
f80132c5fea5 Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents: 169
diff changeset
391
239
e2214c8fc91f Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 237
diff changeset
392
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
393 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
394 """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
395
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
396 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
397 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
398 callable to retrieve individual file information.
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
399 """
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 79
diff changeset
400 files = []
110
a4dcffaa6538 fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents: 109
diff changeset
401 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
402 # 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
403 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
404 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
405 files.append(path)
88
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
406 else:
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
407 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
408 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
409 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
410 continue
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
411 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
412 continue
88
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
413 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
414 path = path[len(branchprefix):]
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
415 if kind == 'f':
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
416 files.append(path)
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
417 elif kind == 'd':
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
418 if e.action == 'M':
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
419 continue
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
420 dirpath = branchprefix + path
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
421 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
422 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
423 if path:
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
424 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
425 else:
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
426 childpath = child
1add57910c82 stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 648
diff changeset
427 files.append(childpath)
583
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
428 if e.action == 'R':
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
429 # Check all files in replaced directory
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
430 path = path + '/'
a016b253910b stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 574
diff changeset
431 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
432 else:
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
433 if path in parentctx:
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
434 files.append(path)
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
435 continue
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
436 # 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
437 path = path + '/'
3b60f223893a fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
438 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
439 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
440
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
441 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
442
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
443 def filectxfn(repo, memctx, path):
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
444 svnpath = path
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
445 if branchpath:
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
446 svnpath = branchpath + '/' + path
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
447 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
448 isexec = 'x' in mode
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
449 islink = 'l' in mode
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
450 copied = copies.get(path)
535
715d2e3e153b stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents: 532
diff changeset
451 # 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
452 # 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
453 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
454 copied = None
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
455 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
456 isexec=isexec, copied=copied)
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
457
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
458 return files, filectxfn
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
459
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
460 def checkbranch(meta, r, branch):
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
461 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
462 if not branchedits:
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
463 return None
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
464 branchtip = branchedits[0][1]
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
465 for child in meta.repo[branchtip].children():
375
af9fc01299b4 Make branch closing more Mercurial-like.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 374
diff changeset
466 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
467 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
468 return None
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
469 return branchtip
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
470
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
471 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
472 '''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
473 to their branch path.
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
474 '''
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
475 branches = {}
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
476 paths_need_discovery = []
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
477 for p in paths:
540
8dc759dc9ca9 svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents: 536
diff changeset
478 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
479 if relpath is not None:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
480 branches[branch] = branchpath
517
ef288fb7f2fe svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents: 514
diff changeset
481 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
482 ln = meta.localname(p)
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
483 # 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
484 # already updated the branch map
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
485 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
486 branches[ln] = p
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
487 else:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
488 paths_need_discovery.append(p)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
489
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
490 if not paths_need_discovery:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
491 return branches
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
492
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
493 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
494 paths_need_discovery.sort()
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
495 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
496 actually_files = []
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
497 while paths_need_discovery:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
498 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
499 path_could_be_file = True
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
500 ind = 0
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
501 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
502 if op.startswith(p):
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
503 path_could_be_file = False
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
504 ind += 1
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
505 if path_could_be_file:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
506 if checkpath(p, revnum) == 'f':
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
507 actually_files.append(p)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
508 # 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
509 # 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
510 # 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
511 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
512 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
513 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
514 if x[1] == 'f'])
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
515
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
516 if not actually_files:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
517 continue
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
518
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
519 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
520 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
521 filepaths.sort()
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
522 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
523 while filepaths:
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
524 path = filepaths.pop(0)
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
525 parentdir = '/'.join(path[:-1])
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
526 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
527 branchpath = meta.normalize(parentdir)
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
528 if branchpath.startswith('tags/'):
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
529 continue
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
530 branchname = meta.localname(branchpath)
377
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
531 if branchpath.startswith('trunk/'):
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
532 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
533 continue
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
534 if branchname and branchname.startswith('../'):
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
535 continue
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
536 branches[branchname] = branchpath
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
537 return branches
7e9269555e72 Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 376
diff changeset
538
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
539 def convert_rev(ui, meta, svn, r, tbdelta):
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
540 # 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
541
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
542 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
543 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
544 brpaths = branches.values()
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
545 bad_branch_paths = {}
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
546 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
547 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
548
490
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
549 # 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
550 # 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
551 # 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
552 # 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
553 # 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
554
490
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
555 # 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
556 # 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
557 for existingbr in meta.branches:
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
558 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
559 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
560 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
561
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
562 deleted_branches = {}
203
907c160c6289 Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents: 200
diff changeset
563 for p in r.paths:
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
564 tag = meta.get_path_tag(p)
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
565 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
566 continue
417
8630d1ebcdb9 svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 416
diff changeset
567 branch = meta.localname(p)
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
568 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
569 continue
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
570 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
571 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
572 deleted_branches[branch] = closed
237
c90cfa665b81 Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 234
diff changeset
573
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
574 date = meta.fixdate(r.date)
472
ba65e97538d1 stupid: take tbdelta closed branches in account
Patrick Mezard <pmezard@gmail.com>
parents: 452
diff changeset
575 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
576 for b in branches:
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
577 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
578 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
579 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
580 if kind != 'd':
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
581 if not tag:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
582 # 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
583 # revision and remove everything.
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
584 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
585 continue
179
a336e3e82648 Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents: 176
diff changeset
586
648
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
587 incremental = (meta.revmap.oldest > 0)
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
588
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
589 if incremental:
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
590 try:
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
591 files_touched, filectxfn2 = diff_branchrev(
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
592 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
593 except BadPatchApply, e:
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
594 # 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
595 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
596 incremental = False
8fb38602e3ed stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 640
diff changeset
597 if not incremental:
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
598 files_touched, filectxfn2 = fetch_branchrev(
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
599 svn, meta, b, branches[b], r, parentctx)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
600
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
601 externals = {}
499
1fd3cfa47c5e Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
602 if meta.layout != 'single':
762
c31a1f92e1c6 svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents: 758
diff changeset
603 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
604 externals = svnexternals.getchanges(ui, meta.repo, parentctx,
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
605 externals)
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
606 files_touched.extend(externals)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
607
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
608 def filectxfn(repo, memctx, path):
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
609 if path in externals:
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
610 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
611 raise IOError(errno.ENOENT, 'no externals')
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
612 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
613 islink=False, isexec=False,
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 739
diff changeset
614 copied=None)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
615 for bad in bad_branch_paths[b]:
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
616 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
617 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
618 return filectxfn2(repo, memctx, path)
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
619
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
620 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
621 files_touched.remove('')
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
622 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
623 for f in excluded:
f48cd62a9de4 fetch_command: fix coding style
Patrick Mezard <pmezard@gmail.com>
parents: 187
diff changeset
624 files_touched.remove(f)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
625
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
626 if b:
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
627 # 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
628 # 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
629 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
630 b not in meta.branches
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
631 and b not in meta.repo.branchtags()
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
632 and not files_touched):
536
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
633 continue
460eb781d840 Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents: 535
diff changeset
634
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
635 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
636 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
637 continue
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
638
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
639 for f in files_touched:
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
640 if f:
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
641 # 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
642 # something is very wrong
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
643 assert f[0] != '/'
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
644
422
6086363e8230 svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 418
diff changeset
645 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
646 if tag:
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
647 if parentctx.node() == node.nullid:
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
648 continue
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
649 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
650 'close': 1})
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
651
640
a3d20d6e96b0 stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
652 origbranch = extra.get('branch', None)
574
8e025a6f0db4 add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 557
diff changeset
653 meta.mapbranch(extra)
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
654 current_ctx = context.memctx(meta.repo,
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
655 [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
656 r.message or util.default_commit_msg(ui),
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
657 files_touched,
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
658 filectxfn,
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
659 meta.authors[r.author],
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
660 date,
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
661 extra)
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
662 ha = meta.repo.commitctx(current_ctx)
401
9e87f7047bf1 stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 377
diff changeset
663
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
664 if not tag:
640
a3d20d6e96b0 stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
665 if (not origbranch in meta.branches
a3d20d6e96b0 stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
666 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
667 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
668 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
669 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
670 meta.movetag(tag, ha, r, date)
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 540
diff changeset
671 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
672 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
673
8c91e6a69d05 Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 368
diff changeset
674 # 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
675 # 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
676 for branch in check_deleted_branches:
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 415
diff changeset
677 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
678 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
679 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
680
432
4bf90f8c9b7b consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 424
diff changeset
681 return deleted_branches