annotate svnwrap/svn_swig_wrapper.py @ 301:79440ed81011

Allow specifying a revision to stop at using the -H flag. This is useful for converting repositories which have been deleted or renamed, such as llvm-gcc-4-2 in the LLVM repositories which was renamed to llvm-gcc-4.2 shortly after its creation. Also, consolidate the two places in svn_swig_wrapper.py where a default chunk size is specified to one, single variable declaration.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Fri, 27 Mar 2009 03:21:45 +0100
parents 4aba7542f6a9
children ce676eff002b
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
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2 import getpass
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3 import os
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4 import shutil
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5 import sys
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6 import tempfile
47
9738a7c4e3dd fix svn push when there's just a file removal
Valentino Volonghi aka dialtone <valentino@adroll.com>
parents: 46
diff changeset
7 import hashlib
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
8 import collections
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
9 import gc
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11 from svn import client
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
12 from svn import core
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
13 from svn import delta
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
14 from svn import ra
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
15
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
16 from mercurial import util as hgutil
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
17
196
77812f98e250 Add a naive hg svn version command that works as long as hgsubversion is run from a checkout.
Augie Fackler <durin42@gmail.com>
parents: 181
diff changeset
18 def version():
77812f98e250 Add a naive hg svn version command that works as long as hgsubversion is run from a checkout.
Augie Fackler <durin42@gmail.com>
parents: 181
diff changeset
19 return '%d.%d.%d' % (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_MICRO)
77812f98e250 Add a naive hg svn version command that works as long as hgsubversion is run from a checkout.
Augie Fackler <durin42@gmail.com>
parents: 181
diff changeset
20
63
2e30b59a9c19 Added some coverage pragmas to stop it from trying to cover things we can't test.
Augie Fackler <durin42@gmail.com>
parents: 59
diff changeset
21 if (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_MICRO) < (1, 5, 0): #pragma: no cover
50
80b923ab242b Drop any pretense of supporting svn 1.4.x.
Augie Fackler <durin42@gmail.com>
parents: 47
diff changeset
22 raise ImportError, 'You must have Subversion 1.5.0 or newer and matching SWIG bindings.'
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
23
89
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
24 class SubversionRepoCanNotReplay(Exception):
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
25 """Exception raised when the svn server is too old to have replay.
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
26 """
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
27
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
28 class SubversionRepoCanNotDiff(Exception):
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
29 """Exception raised when the svn API diff3() command cannot be used
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
30 """
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
31
301
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
32 '''Default chunk size used in fetch_history_at_paths() and revisions().'''
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
33 _chunk_size = 1000
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
34
75
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
35 def optrev(revnum):
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
36 optrev = core.svn_opt_revision_t()
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
37 optrev.kind = core.svn_opt_revision_number
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
38 optrev.value.number = revnum
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
39 return optrev
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
40
50
80b923ab242b Drop any pretense of supporting svn 1.4.x.
Augie Fackler <durin42@gmail.com>
parents: 47
diff changeset
41 svn_config = core.svn_config_get_config(None)
45
ce00e6ffaa90 Change the implementation of the ra_session stuff. Thanks to Ben Collins-Sussman for pointing out the problem with the other method I was using.
Augie Fackler <durin42@gmail.com>
parents: 36
diff changeset
42 class RaCallbacks(ra.Callbacks):
298
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
43 @staticmethod
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
44 def open_tmp_file(pool): #pragma: no cover
46
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
45 (fd, fn) = tempfile.mkstemp()
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
46 os.close(fd)
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
47 return fn
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
48
298
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
49 @staticmethod
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
50 def get_client_string(pool):
45
ce00e6ffaa90 Change the implementation of the ra_session stuff. Thanks to Ben Collins-Sussman for pointing out the problem with the other method I was using.
Augie Fackler <durin42@gmail.com>
parents: 36
diff changeset
51 return 'hgsubversion'
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
52
63
2e30b59a9c19 Added some coverage pragmas to stop it from trying to cover things we can't test.
Augie Fackler <durin42@gmail.com>
parents: 59
diff changeset
53 def user_pass_prompt(realm, default_username, ms, pool): #pragma: no cover
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
54 # FIXME: should use getpass() and username() from mercurial.ui
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
55 creds = core.svn_auth_cred_simple_t()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
56 creds.may_save = ms
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
57 if default_username:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
58 sys.stderr.write('Auth realm: %s\n' % (realm,))
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
59 creds.username = default_username
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
60 else:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
61 sys.stderr.write('Auth realm: %s\n' % (realm,))
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
62 sys.stderr.write('Username: ')
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
63 sys.stderr.flush()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
64 creds.username = sys.stdin.readline().strip()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
65 creds.password = getpass.getpass('Password for %s: ' % creds.username)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
66 return creds
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
67
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
68 def _create_auth_baton(pool):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
69 """Create a Subversion authentication baton. """
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
70 # Give the client context baton a suite of authentication
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
71 # providers.h
92
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
72 platform_specific = ['svn_auth_get_gnome_keyring_simple_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
73 'svn_auth_get_gnome_keyring_ssl_client_cert_pw_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
74 'svn_auth_get_keychain_simple_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
75 'svn_auth_get_keychain_ssl_client_cert_pw_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
76 'svn_auth_get_kwallet_simple_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
77 'svn_auth_get_kwallet_ssl_client_cert_pw_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
78 'svn_auth_get_ssl_client_cert_file_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
79 'svn_auth_get_windows_simple_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
80 'svn_auth_get_windows_ssl_server_trust_provider',
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
81 ]
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
82
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
83 providers = []
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
84
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
85 for p in platform_specific:
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
86 if hasattr(core, p):
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
87 try:
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
88 providers.append(getattr(core, p)())
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
89 except RuntimeError:
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
90 pass
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
91
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
92 providers += [
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
93 client.get_simple_provider(),
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
94 client.get_username_provider(),
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
95 client.get_ssl_client_cert_file_provider(),
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
96 client.get_ssl_client_cert_pw_file_provider(),
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
97 client.get_ssl_server_trust_file_provider(),
92
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
98 client.get_simple_prompt_provider(user_pass_prompt, 2),
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
99 ]
92
7486c6f6cccc svnwrap: Fix handling of auth providers so cached credentials can work.
Augie Fackler <durin42@gmail.com>
parents: 89
diff changeset
100
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
101 return core.svn_auth_open(providers, pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
102
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
103
298
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
104 class Revision(tuple):
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
105 """Wrapper for a Subversion revision.
298
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
106
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
107 Derives from tuple in an attempt to minimise the memory footprint.
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
108 """
298
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
109 def __new__(self, revnum, author, message, date, paths, strip_path=''):
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
110 _paths = {}
20
2953c867ca99 Minor fixes to the push command to make it more robust.
Augie Fackler <durin42@gmail.com>
parents: 10
diff changeset
111 if paths:
2953c867ca99 Minor fixes to the push command to make it more robust.
Augie Fackler <durin42@gmail.com>
parents: 10
diff changeset
112 for p in paths:
298
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
113 _paths[p[len(strip_path):]] = paths[p]
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
114 return tuple.__new__(self,
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
115 (revnum, author, message, date, _paths))
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
116
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
117 def get_revnum(self):
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
118 return self[0]
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
119 revnum = property(get_revnum)
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
120
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
121 def get_author(self):
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
122 return self[1]
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
123 author = property(get_author)
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
124
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
125 def get_message(self):
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
126 return self[2]
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
127 message = property(get_message)
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
128
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
129 def get_date(self):
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
130 return self[3]
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
131 date = property(get_date)
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
132
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
133 def get_paths(self):
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
134 return self[4]
32d3f1716e66 Two minor optimisations/cleanups for svn_swig_wrapper:
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 293
diff changeset
135 paths = property(get_paths)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
136
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
137 def __str__(self):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
138 return 'r%d by %s' % (self.revnum, self.author)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
139
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
140 _svntypes = {
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
141 core.svn_node_dir: 'd',
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
142 core.svn_node_file: 'f',
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
143 }
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
144
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
145 class SubversionRepo(object):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
146 """Wrapper for a Subversion repository.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
147
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
148 This uses the SWIG Python bindings, and will only work on svn >= 1.4.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
149 It takes a required param, the URL.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
150 """
301
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
151 def __init__(self, url='', username='', head=None):
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
152 self.svn_url = url
6
1a5bb173170b Fixes for win32 compatibility. Changes suggested by Shun-ichi GOTO, with some alterations by me.
Augie Fackler <durin42@gmail.com>
parents: 0
diff changeset
153 self.uname = username
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
154 self.auth_baton_pool = core.Pool()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
155 self.auth_baton = _create_auth_baton(self.auth_baton_pool)
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
156 # self.init_ra_and_client() assumes that a pool already exists
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
157 self.pool = core.Pool()
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
158
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
159 self.init_ra_and_client()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
160 self.uuid = ra.get_uuid(self.ra, self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
161 repo_root = ra.get_repos_root(self.ra, self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
162 # *will* have a leading '/', would not if we used get_repos_root2
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
163 self.subdir = url[len(repo_root):]
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
164 if not self.subdir or self.subdir[-1] != '/':
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
165 self.subdir += '/'
89
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
166 self.hasdiff3 = True
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
167
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
168 def init_ra_and_client(self):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
169 """Initializes the RA and client layers, because sometimes getting
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
170 unified diffs runs the remote server out of open files.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
171 """
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
172 # Debugging code; retained for possible later use.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
173 if False:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
174 gc.collect()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
175 import pympler.muppy.tracker
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
176 try:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
177 self.memory_tracker
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
178 try:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
179 self.memory_tracker.print_diff(self.memory_base)
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
180 except:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
181 print 'HOP'
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
182 self.memory_base = self.memory_tracker.create_summary()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
183 except:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
184 print 'HEP'
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
185 self.memory_tracker = pympler.muppy.tracker.SummaryTracker()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
186
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
187 # while we're in here we'll recreate our pool, but first, we clear it
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
188 # and destroy it to make possible leaks cause fatal errors.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
189 self.pool.clear()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
190 self.pool.destroy()
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
191 self.pool = core.Pool()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
192 self.client_context = client.create_context()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
193
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
194 self.client_context.auth_baton = self.auth_baton
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
195 self.client_context.config = svn_config
45
ce00e6ffaa90 Change the implementation of the ra_session stuff. Thanks to Ben Collins-Sussman for pointing out the problem with the other method I was using.
Augie Fackler <durin42@gmail.com>
parents: 36
diff changeset
196 callbacks = RaCallbacks()
ce00e6ffaa90 Change the implementation of the ra_session stuff. Thanks to Ben Collins-Sussman for pointing out the problem with the other method I was using.
Augie Fackler <durin42@gmail.com>
parents: 36
diff changeset
197 callbacks.auth_baton = self.auth_baton
ce00e6ffaa90 Change the implementation of the ra_session stuff. Thanks to Ben Collins-Sussman for pointing out the problem with the other method I was using.
Augie Fackler <durin42@gmail.com>
parents: 36
diff changeset
198 self.callbacks = callbacks
293
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
199 try:
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
200 self.ra = ra.open2(self.svn_url.encode('utf-8'), callbacks,
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
201 svn_config, self.pool)
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
202 except core.SubversionException, e:
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
203 raise hgutil.Abort(e.args[0])
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
204
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
205 def HEAD(self):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
206 return ra.get_latest_revnum(self.ra, self.pool)
181
e37f9d3fd5e7 remove decorators (compat with python2.3)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 180
diff changeset
207 HEAD = property(HEAD)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
208
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
209 def START(self):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
210 return 0
181
e37f9d3fd5e7 remove decorators (compat with python2.3)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 180
diff changeset
211 START = property(START)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
212
301
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
213 def last_changed_rev(self):
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
214 try:
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
215 holder = []
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
216 ra.get_log(self.ra, [''],
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
217 self.HEAD, 1,
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
218 1, #limit of how many log messages to load
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
219 True, # don't need to know changed paths
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
220 True, # stop on copies
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
221 lambda paths, revnum, author, date, message, pool:
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
222 holder.append(revnum),
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
223 self.pool)
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
224
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
225 return holder[-1]
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
226 except core.SubversionException, e:
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
227 if e.apr_err not in [core.SVN_ERR_FS_NOT_FOUND]:
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
228 raise
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
229 else:
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
230 return self.HEAD
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
231 last_changed_rev = property(last_changed_rev)
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
232
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
233 def branches(self):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
234 """Get the branches defined in this repo assuming a standard layout.
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
235
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
236 This method should be eliminated; this class does not have
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
237 sufficient knowledge to yield all known tags.
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
238 """
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
239 branches = self.list_dir('branches').keys()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
240 branch_info = {}
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
241 head=self.HEAD
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
242 for b in branches:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
243 b_path = 'branches/%s' %b
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
244 hist_gen = self.fetch_history_at_paths([b_path], stop=head)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
245 hist = hist_gen.next()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
246 source, source_rev = self._get_copy_source(b_path, cached_head=head)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
247 # This if statement guards against projects that have non-ancestral
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
248 # branches by not listing them has branches
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
249 # Note that they probably are really ancestrally related, but there
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
250 # is just no way for us to know how.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
251 if source is not None and source_rev is not None:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
252 branch_info[b] = (source, source_rev, hist.revnum)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
253 return branch_info
181
e37f9d3fd5e7 remove decorators (compat with python2.3)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 180
diff changeset
254 branches = property(branches)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
255
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
256 def tags(self):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
257 """Get the current tags in this repo assuming a standard layout.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
258
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
259 This returns a dictionary of tag: (source path, source rev)
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
260
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
261 This method should be eliminated; this class does not have
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
262 sufficient knowledge to yield all known tags.
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
263 """
155
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
264 return self.tags_at_rev(self.HEAD)
181
e37f9d3fd5e7 remove decorators (compat with python2.3)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 180
diff changeset
265 tags = property(tags)
155
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
266
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
267 def tags_at_rev(self, revision):
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
268 """Get the tags in this repo at the given revision, assuming a
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
269 standard layout.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
270
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
271 This returns a dictionary of tag: (source path, source rev)
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
272
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
273 This method should be eliminated; this class does not have
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
274 sufficient knowledge to yield all known tags.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
275 """
155
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
276 try:
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
277 tags = self.list_dir('tags', revision=revision).keys()
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
278 except core.SubversionException, e:
293
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
279 if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
155
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
280 return {}
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
281 raise
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
282 tag_info = {}
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
283 for t in tags:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
284 tag_info[t] = self._get_copy_source('tags/%s' % t,
155
ba801f44d240 utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents: 122
diff changeset
285 cached_head=revision)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
286 return tag_info
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
287
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
288 def _get_copy_source(self, path, cached_head=None):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
289 """Get copy revision for the given path, assuming it was meant to be
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
290 a copy of the entire tree.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
291 """
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
292 if not cached_head:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
293 cached_head = self.HEAD
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
294 hist_gen = self.fetch_history_at_paths([path], stop=cached_head)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
295 hist = hist_gen.next()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
296 if hist.paths[path].copyfrom_path is None:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
297 return None, None
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
298 source = hist.paths[path].copyfrom_path
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
299 source_rev = 0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
300 for p in hist.paths:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
301 if hist.paths[p].copyfrom_rev:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
302 # We assume that the revision of the source tree as it was
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
303 # copied was actually the revision of the highest revision
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
304 # copied item. This could be wrong, but in practice it will
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
305 # *probably* be correct
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
306 if source_rev < hist.paths[p].copyfrom_rev:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
307 source_rev = hist.paths[p].copyfrom_rev
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
308 source = source[len(self.subdir):]
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
309 return source, source_rev
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
310
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
311 def list_dir(self, dir, revision=None):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
312 """List the contents of a server-side directory.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
313
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
314 Returns a dict-like object with one dict key per directory entry.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
315
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
316 Args:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
317 dir: the directory to list, no leading slash
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
318 rev: the revision at which to list the directory, defaults to HEAD
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
319 """
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
320 if dir[-1] == '/':
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
321 dir = dir[:-1]
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
322 if revision is None:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
323 revision = self.HEAD
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
324 r = ra.get_dir2(self.ra, dir, revision, core.SVN_DIRENT_KIND, self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
325 folders, props, junk = r
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
326 return folders
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
327
301
79440ed81011 Allow specifying a revision to stop at using the -H flag.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 300
diff changeset
328 def revisions(self, start=None, stop=None, chunk_size=_chunk_size):
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
329 """Load the history of this repo.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
330
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
331 This is LAZY. It returns a generator, and fetches a small number
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
332 of revisions at a time.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
333
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
334 The reason this is lazy is so that you can use the same repo object
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
335 to perform RA calls to get deltas.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
336 """
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
337 # NB: you'd think this would work, but you'd be wrong. I'm pretty
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
338 # convinced there must be some kind of svn bug here.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
339 #return self.fetch_history_at_paths(['tags', 'trunk', 'branches'],
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
340 # start=start)
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
341 # However, we no longer need such filtering, as we gracefully handle
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
342 # branches located at arbitrary locations.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
343 return self.fetch_history_at_paths([''], start=start, stop=stop,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
344 chunk_size=chunk_size)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
345
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
346 def fetch_history_at_paths(self, paths, start=None, stop=None,
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
347 chunk_size=_chunk_size):
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
348 '''TODO: This method should be merged with self.revisions() as
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
349 they are now functionally equivalent.'''
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
350 if not start:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
351 start = self.START
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
352 if not stop:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
353 stop = self.HEAD
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
354 while stop > start:
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
355 def callback(paths, revnum, author, date, message, pool):
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
356 r = Revision(revnum, author, message, date, paths,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
357 strip_path=self.subdir)
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
358 revisions.append(r)
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
359 # use a queue; we only access revisions in a FIFO manner
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
360 revisions = collections.deque()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
361
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
362 try:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
363 # TODO: using min(start + chunk_size, stop) may be preferable;
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
364 # ra.get_log(), even with chunk_size set, takes a while
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
365 # when converting the 65k+ rev. in LLVM.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
366 ra.get_log(self.ra,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
367 paths,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
368 start+1,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
369 stop,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
370 chunk_size, #limit of how many log messages to load
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
371 True, # don't need to know changed paths
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
372 True, # stop on copies
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
373 callback,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
374 self.pool)
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
375 except core.SubversionException, e:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
376 if e.apr_err not in [core.SVN_ERR_FS_NOT_FOUND]:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
377 raise
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
378 else:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
379 raise hgutil.Abort('%s not found at revision %d!'
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
380 % (self.subdir.rstrip('/'), stop))
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
381
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
382 while len(revisions) > 1:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
383 yield revisions.popleft()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
384 # Now is a good time to do a quick garbage collection.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
385 gc.collect(0)
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
386
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
387 if len(revisions) == 0:
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
388 # exit the loop; there is no history for the path.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
389 break
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
390 else:
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
391 r = revisions.popleft()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
392 start = r.revnum
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
393 yield r
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
394 self.init_ra_and_client()
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
395 # Now is a good time to do a thorough garbage colection.
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
396 gc.collect()
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
397
83
6c9b7cf1c5aa push_cmd: delete empty svn directories, refactor directory creation
Patrick Mezard <pmezard@gmail.com>
parents: 81
diff changeset
398 def commit(self, paths, message, file_data, base_revision, addeddirs,
6c9b7cf1c5aa push_cmd: delete empty svn directories, refactor directory creation
Patrick Mezard <pmezard@gmail.com>
parents: 81
diff changeset
399 deleteddirs, properties, copies):
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
400 """Commits the appropriate targets from revision in editor's store.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
401 """
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
402 self.init_ra_and_client()
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
403 commit_info = []
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
404 def commit_cb(_commit_info, pool):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
405 commit_info.append(_commit_info)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
406 editor, edit_baton = ra.get_commit_editor2(self.ra,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
407 message,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
408 commit_cb,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
409 None,
20
2953c867ca99 Minor fixes to the push command to make it more robust.
Augie Fackler <durin42@gmail.com>
parents: 10
diff changeset
410 False,
2953c867ca99 Minor fixes to the push command to make it more robust.
Augie Fackler <durin42@gmail.com>
parents: 10
diff changeset
411 self.pool)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
412 checksum = []
46
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
413 # internal dir batons can fall out of scope and get GCed before svn is
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
414 # done with them. This prevents that (credit to gvn for the idea).
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
415 # TODO: verify that these are not the cause of our leaks
46
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
416 batons = [edit_baton, ]
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
417 def driver_cb(parent, path, pool):
46
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
418 if not parent:
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
419 bat = editor.open_root(edit_baton, base_revision, self.pool)
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
420 batons.append(bat)
f30cda3389c2 This appears to fix pushing over both the http and svn protocols.
Augie Fackler <durin42@gmail.com>
parents: 45
diff changeset
421 return bat
83
6c9b7cf1c5aa push_cmd: delete empty svn directories, refactor directory creation
Patrick Mezard <pmezard@gmail.com>
parents: 81
diff changeset
422 if path in deleteddirs:
6c9b7cf1c5aa push_cmd: delete empty svn directories, refactor directory creation
Patrick Mezard <pmezard@gmail.com>
parents: 81
diff changeset
423 bat = editor.delete_entry(path, base_revision, parent, pool)
6c9b7cf1c5aa push_cmd: delete empty svn directories, refactor directory creation
Patrick Mezard <pmezard@gmail.com>
parents: 81
diff changeset
424 batons.append(bat)
6c9b7cf1c5aa push_cmd: delete empty svn directories, refactor directory creation
Patrick Mezard <pmezard@gmail.com>
parents: 81
diff changeset
425 return bat
175
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
426 if path not in file_data:
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
427 if path in addeddirs:
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
428 bat = editor.add_directory(path, parent, None, -1, pool)
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
429 else:
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
430 bat = editor.open_directory(path, parent, base_revision, pool)
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
431 batons.append(bat)
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
432 props = properties.get(path, {})
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
433 if 'svn:externals' in props:
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
434 value = props['svn:externals']
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
435 editor.change_dir_prop(bat, 'svn:externals', value, pool)
2412800b1258 Support svn:externals changes via .hgsvnexternals updates
Patrick Mezard <pmezard@gmail.com>
parents: 172
diff changeset
436 return bat
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
437 base_text, new_text, action = file_data[path]
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
438 compute_delta = True
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
439 if action == 'modify':
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
440 baton = editor.open_file(path, parent, base_revision, pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
441 elif action == 'add':
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
442 try:
70
49b7cbe4c8e3 push_cmd: handle copies at file level
Patrick Mezard <pmezard@gmail.com>
parents: 66
diff changeset
443 frompath, fromrev = copies.get(path, (None, -1))
49b7cbe4c8e3 push_cmd: handle copies at file level
Patrick Mezard <pmezard@gmail.com>
parents: 66
diff changeset
444 if frompath:
49b7cbe4c8e3 push_cmd: handle copies at file level
Patrick Mezard <pmezard@gmail.com>
parents: 66
diff changeset
445 frompath = self.svn_url + '/' + frompath
49b7cbe4c8e3 push_cmd: handle copies at file level
Patrick Mezard <pmezard@gmail.com>
parents: 66
diff changeset
446 baton = editor.add_file(path, parent, frompath, fromrev, pool)
63
2e30b59a9c19 Added some coverage pragmas to stop it from trying to cover things we can't test.
Augie Fackler <durin42@gmail.com>
parents: 59
diff changeset
447 except (core.SubversionException, TypeError), e: #pragma: no cover
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
448 print e
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
449 raise
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
450 elif action == 'delete':
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
451 baton = editor.delete_entry(path, base_revision, parent, pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
452 compute_delta = False
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
453
10
dfdc078661db Auto-set executable, symlink, and auto-props.
Augie Fackler <durin42@gmail.com>
parents: 9
diff changeset
454 if path in properties:
dfdc078661db Auto-set executable, symlink, and auto-props.
Augie Fackler <durin42@gmail.com>
parents: 9
diff changeset
455 if properties[path].get('svn:special', None):
dfdc078661db Auto-set executable, symlink, and auto-props.
Augie Fackler <durin42@gmail.com>
parents: 9
diff changeset
456 new_text = 'link %s' % new_text
dfdc078661db Auto-set executable, symlink, and auto-props.
Augie Fackler <durin42@gmail.com>
parents: 9
diff changeset
457 for p, v in properties[path].iteritems():
dfdc078661db Auto-set executable, symlink, and auto-props.
Augie Fackler <durin42@gmail.com>
parents: 9
diff changeset
458 editor.change_file_prop(baton, p, v)
dfdc078661db Auto-set executable, symlink, and auto-props.
Augie Fackler <durin42@gmail.com>
parents: 9
diff changeset
459
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
460 if compute_delta:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
461 handler, wh_baton = editor.apply_textdelta(baton, None,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
462 self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
463
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
464 txdelta_stream = delta.svn_txdelta(
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
465 cStringIO.StringIO(base_text), cStringIO.StringIO(new_text),
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
466 self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
467 delta.svn_txdelta_send_txstream(txdelta_stream, handler,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
468 wh_baton, pool)
47
9738a7c4e3dd fix svn push when there's just a file removal
Valentino Volonghi aka dialtone <valentino@adroll.com>
parents: 46
diff changeset
469
9738a7c4e3dd fix svn push when there's just a file removal
Valentino Volonghi aka dialtone <valentino@adroll.com>
parents: 46
diff changeset
470 # TODO pass md5(new_text) instead of None
9738a7c4e3dd fix svn push when there's just a file removal
Valentino Volonghi aka dialtone <valentino@adroll.com>
parents: 46
diff changeset
471 editor.close_file(baton, None, pool)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
472
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
473 delta.path_driver(editor, edit_baton, base_revision, paths, driver_cb,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
474 self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
475 editor.close_edit(edit_baton, self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
476
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
477 def get_replay(self, revision, editor, oldest_rev_i_have=0):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
478 e_ptr, e_baton = delta.make_editor(editor)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
479 try:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
480 ra.replay(self.ra, revision, oldest_rev_i_have, True, e_ptr,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
481 e_baton, self.pool)
63
2e30b59a9c19 Added some coverage pragmas to stop it from trying to cover things we can't test.
Augie Fackler <durin42@gmail.com>
parents: 59
diff changeset
482 except core.SubversionException, e: #pragma: no cover
293
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
483 if (e.apr_err == core.SVN_ERR_RA_NOT_IMPLEMENTED or
fa26c7ef0180 Exception clean-ups; use symbolic names & avoid Python 2.6 deprecations.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 196
diff changeset
484 e.apr_err == core.SVN_ERR_UNSUPPORTED_FEATURE):
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
485 raise SubversionRepoCanNotReplay, ('This Subversion server '
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
486 'is older than 1.4.0, and cannot satisfy replay requests.')
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
487 else:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
488 raise
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
489
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
490 def get_unified_diff(self, path, revision, other_path=None, other_rev=None,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
491 deleted=True, ignore_type=False):
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
492 """Gets a unidiff of path at revision against revision-1.
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
493 """
89
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
494 if not self.hasdiff3:
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
495 raise SubversionRepoCanNotDiff()
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
496
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
497 assert path[0] != '/'
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
498 url = self.svn_url + '/' + path
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
499 url2 = url
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
500 if other_path is not None:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
501 url2 = self.svn_url + '/' + other_path
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
502 if other_rev is None:
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
503 other_rev = revision - 1
81
85dcea81f22b SubversionRepo: close files before rmtree() in diff3
Patrick Mezard <pmezard@gmail.com>
parents: 77
diff changeset
504 old_cwd = os.getcwd()
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
505 tmpdir = tempfile.mkdtemp('svnwrap_temp')
89
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
506 out, err = None, None
66
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
507 try:
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
508 # hot tip: the swig bridge doesn't like StringIO for these bad boys
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
509 out_path = os.path.join(tmpdir, 'diffout')
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
510 error_path = os.path.join(tmpdir, 'differr')
89
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
511 out = open(out_path, 'w')
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
512 err = open(error_path, 'w')
81
85dcea81f22b SubversionRepo: close files before rmtree() in diff3
Patrick Mezard <pmezard@gmail.com>
parents: 77
diff changeset
513 try:
85dcea81f22b SubversionRepo: close files before rmtree() in diff3
Patrick Mezard <pmezard@gmail.com>
parents: 77
diff changeset
514 client.diff3([], url2, optrev(other_rev), url, optrev(revision),
85dcea81f22b SubversionRepo: close files before rmtree() in diff3
Patrick Mezard <pmezard@gmail.com>
parents: 77
diff changeset
515 True, True, deleted, ignore_type, 'UTF-8', out, err,
85dcea81f22b SubversionRepo: close files before rmtree() in diff3
Patrick Mezard <pmezard@gmail.com>
parents: 77
diff changeset
516 self.client_context, self.pool)
89
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
517 except core.SubversionException, e:
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
518 # "Can't write to stream: The handle is invalid."
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
519 # This error happens systematically under Windows, possibly
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
520 # related to file handles being non-write shareable by default.
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
521 if e.apr_err != 720006:
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
522 raise
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
523 self.hasdiff3 = False
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
524 raise SubversionRepoCanNotDiff()
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
525 out.close()
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
526 err.close()
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
527 out, err = None, None
66
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
528 assert len(open(error_path).read()) == 0
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
529 diff = open(out_path).read()
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
530 return diff
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
531 finally:
89
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
532 if out: out.close()
edeec6829d80 SubversionRepo: remember svn.diff3() does not work
Patrick Mezard <pmezard@gmail.com>
parents: 87
diff changeset
533 if err: err.close()
66
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
534 shutil.rmtree(tmpdir)
81
85dcea81f22b SubversionRepo: close files before rmtree() in diff3
Patrick Mezard <pmezard@gmail.com>
parents: 77
diff changeset
535 os.chdir(old_cwd)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
536
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
537 def get_file(self, path, revision):
76
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
538 """Return content and mode of file at given path and revision.
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
539
97
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
540 "link " prefix is dropped from symlink content. Mode is 'x' if
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
541 file is executable, 'l' if a symlink, the empty string
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
542 otherwise. If the file does not exist at this revision, raise
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
543 IOError.
76
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
544 """
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
545 mode = ''
66
a31968146f3c svnwrap: Fix leakage of temp dirs by using try/finally blocks.
Augie Fackler <durin42@gmail.com>
parents: 63
diff changeset
546 try:
122
04c92c2c4501 SubversionRepo: work around ra.get_files() not releasing input buffer
Patrick Mezard <pmezard@gmail.com>
parents: 97
diff changeset
547 out = cStringIO.StringIO()
76
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
548 info = ra.get_file(self.ra, path, revision, out)
122
04c92c2c4501 SubversionRepo: work around ra.get_files() not releasing input buffer
Patrick Mezard <pmezard@gmail.com>
parents: 97
diff changeset
549 data = out.getvalue()
04c92c2c4501 SubversionRepo: work around ra.get_files() not releasing input buffer
Patrick Mezard <pmezard@gmail.com>
parents: 97
diff changeset
550 out.close()
76
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
551 if isinstance(info, list):
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
552 info = info[-1]
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
553 mode = ("svn:executable" in info) and 'x' or ''
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
554 mode = ("svn:special" in info) and 'l' or mode
74
450d5d9d3b80 SubversionRepo: do not use temporary file in get_file()
Patrick Mezard <pmezard@gmail.com>
parents: 70
diff changeset
555 except core.SubversionException, e:
450d5d9d3b80 SubversionRepo: do not use temporary file in get_file()
Patrick Mezard <pmezard@gmail.com>
parents: 70
diff changeset
556 notfound = (core.SVN_ERR_FS_NOT_FOUND,
450d5d9d3b80 SubversionRepo: do not use temporary file in get_file()
Patrick Mezard <pmezard@gmail.com>
parents: 70
diff changeset
557 core.SVN_ERR_RA_DAV_PATH_NOT_FOUND)
450d5d9d3b80 SubversionRepo: do not use temporary file in get_file()
Patrick Mezard <pmezard@gmail.com>
parents: 70
diff changeset
558 if e.apr_err in notfound: # File not found
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
559 raise IOError, e.args[0]
74
450d5d9d3b80 SubversionRepo: do not use temporary file in get_file()
Patrick Mezard <pmezard@gmail.com>
parents: 70
diff changeset
560 raise
97
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
561 if mode == 'l':
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
562 linkprefix = "link "
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
563 if data.startswith(linkprefix):
0d3a2a7cefa3 hg_delta_editor: fix symlink prefix confusion
Patrick Mezard <pmezard@gmail.com>
parents: 92
diff changeset
564 data = data[len(linkprefix):]
76
6c62bd201785 SubversionRepo: make get_file() return the file mode
Patrick Mezard <pmezard@gmail.com>
parents: 75
diff changeset
565 return data, mode
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
566
172
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
567 def list_props(self, path, revision):
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
568 """Return a mapping of property names to values, raise IOError if
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
569 specified path does not exist.
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
570 """
180
3f1e8a5ec9dd svn_swig_wrapper: hacky workaround to prevent running out of files in stupid
Augie Fackler <durin42@gmail.com>
parents: 175
diff changeset
571 self.init_ra_and_client()
75
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
572 rev = optrev(revision)
172
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
573 rpath = (self.svn_url + '/' + path.strip('/')).strip('/')
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
574 try:
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
575 pl = client.proplist2(rpath, rev, rev, False,
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
576 self.client_context, self.pool)
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
577 except core.SubversionException, e:
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
578 # Specified path does not exist at this revision
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
579 if e.apr_err == core.SVN_ERR_NODE_UNKNOWN_KIND:
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
580 raise IOError()
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
581 raise
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
582 if not pl:
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
583 return {}
84fbf1469a31 SubversionRepo: simplify and rename proplist() into list_prop()
Patrick Mezard <pmezard@gmail.com>
parents: 155
diff changeset
584 return pl[0][1]
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
585
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
586 def fetch_all_files_to_dir(self, path, revision, checkout_path):
75
cca31b6b1318 SubversionRepo: add optrev() to help generate client API revisions
Patrick Mezard <pmezard@gmail.com>
parents: 74
diff changeset
587 rev = optrev(revision)
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
588 client.export3(self.svn_url+'/'+path, checkout_path, rev,
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
589 rev, True, True, True, 'LF', # should be 'CRLF' on win32
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
590 self.client_context, self.pool)
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
591
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
592 def list_files(self, dirpath, revision):
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
593 """List the content of a directory at a given revision, recursively.
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
594
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
595 Yield tuples (path, kind) where 'path' is the entry path relatively to
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
596 'dirpath' and 'kind' is 'f' if the entry is a file, 'd' if it is a
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
597 directory. Raise IOError if the directory cannot be found at given
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
598 revision.
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
599 """
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
600 dirpath = dirpath.strip('/')
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
601 rpath = '/'.join([self.svn_url, dirpath]).strip('/')
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
602 rev = optrev(revision)
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
603 try:
300
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
604 entries = client.ls(rpath, rev, True, self.client_context,
4aba7542f6a9 Various cleanups, cosmetics and removal of superfluous assertions.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 298
diff changeset
605 self.pool)
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
606 except core.SubversionException, e:
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
607 if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
608 raise IOError('%s cannot be found at r%d' % (dirpath, revision))
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
609 raise
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
610 for path, e in entries.iteritems():
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
611 kind = _svntypes.get(e.kind)
77
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
612 yield path, kind
ed3dd5bf45da fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents: 76
diff changeset
613
87
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
614 def checkpath(self, path, revision):
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
615 """Return the entry type at the given revision, 'f', 'd' or None
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
616 if the entry does not exist.
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
617 """
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
618 kind = ra.check_path(self.ra, path.strip('/'), revision)
b033d74be76b fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents: 83
diff changeset
619 return _svntypes.get(kind)