annotate treepkg/subversion.py @ 282:f58f9adb7dc3

Add functions to get SVN logs and extract tag revisions from it. Add some tests for the log parsing.
author Bernhard Herzog <bh@intevation.de>
date Tue, 04 Aug 2009 10:09:12 +0000
parents 4b700b39c32f
children 020421cd3ee2
rev   line source
224
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
1 # Copyright (C) 2007, 2008, 2009 by Intevation GmbH
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
2 # Authors:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
3 # Bernhard Herzog <bh@intevation.de>
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
4 #
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
5 # This program is free software under the GPL (>=v2)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
6 # Read the file COPYING coming with the software for details.
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
7
224
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
8 """Collection of subversion utility code"""
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
9
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
10 import os
230
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
11 import shutil
273
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
12 import re
282
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
13 import StringIO
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
14
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
15 from lxml import etree
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
16
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
17 import run
45
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 0
diff changeset
18 from cmdexpand import cmdexpand
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
19 from util import extract_value_for_key
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
20
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
21
269
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
22 class SubversionError(Exception):
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
23 pass
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
24
262
81ba86662cbd Add treepkg/subversion.list_url function, a wrapper for "svn list"
Bernhard Herzog <bh@intevation.de>
parents: 230
diff changeset
25 def list_url(url):
81ba86662cbd Add treepkg/subversion.list_url function, a wrapper for "svn list"
Bernhard Herzog <bh@intevation.de>
parents: 230
diff changeset
26 """Runs svn list with the given url and returns files listed as a list"""
81ba86662cbd Add treepkg/subversion.list_url function, a wrapper for "svn list"
Bernhard Herzog <bh@intevation.de>
parents: 230
diff changeset
27 output = run.capture_output(cmdexpand("svn list $url", **locals()))
81ba86662cbd Add treepkg/subversion.list_url function, a wrapper for "svn list"
Bernhard Herzog <bh@intevation.de>
parents: 230
diff changeset
28 return output.splitlines()
81ba86662cbd Add treepkg/subversion.list_url function, a wrapper for "svn list"
Bernhard Herzog <bh@intevation.de>
parents: 230
diff changeset
29
208
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
30 def checkout(url, localdir, revision=None, recurse=True):
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
31 """Runs svn to checkout the repository at url into the localdir"""
208
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
32 args = []
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
33 if revision:
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
34 args.extend(["--revision", revision])
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
35 if not recurse:
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
36 args.append("-N")
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
37 run.call(cmdexpand("svn checkout -q @args $url $localdir", **locals()))
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
38
208
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
39 def update(localdir, revision=None, recurse=True):
79
570ac81865be Add revision parameter to update so that a checkout can be updated to a
Bernhard Herzog <bh@intevation.de>
parents: 45
diff changeset
40 """Runs svn update on the localdir.
570ac81865be Add revision parameter to update so that a checkout can be updated to a
Bernhard Herzog <bh@intevation.de>
parents: 45
diff changeset
41 The parameter revision, if given, is passed to svn as the value of
570ac81865be Add revision parameter to update so that a checkout can be updated to a
Bernhard Herzog <bh@intevation.de>
parents: 45
diff changeset
42 the --revision option.
570ac81865be Add revision parameter to update so that a checkout can be updated to a
Bernhard Herzog <bh@intevation.de>
parents: 45
diff changeset
43 """
208
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
44 args = []
79
570ac81865be Add revision parameter to update so that a checkout can be updated to a
Bernhard Herzog <bh@intevation.de>
parents: 45
diff changeset
45 if revision:
208
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
46 args.extend(["--revision", revision])
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
47 if not recurse:
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
48 args.append("-N")
1527c37bd7aa Allow checkouts of specific revision and to prohibit recursion during
Bernhard Herzog <bh@intevation.de>
parents: 79
diff changeset
49 run.call(cmdexpand("svn update -q @args $localdir", **locals()))
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
50
266
e201ea1f6d0e Add revision and recurse parameters to treepkg.subversion.export
Bernhard Herzog <bh@intevation.de>
parents: 262
diff changeset
51 def export(src, dest, revision=None, recurse=True):
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
52 """Runs svn export src dest"""
266
e201ea1f6d0e Add revision and recurse parameters to treepkg.subversion.export
Bernhard Herzog <bh@intevation.de>
parents: 262
diff changeset
53 args = []
e201ea1f6d0e Add revision and recurse parameters to treepkg.subversion.export
Bernhard Herzog <bh@intevation.de>
parents: 262
diff changeset
54 if revision:
e201ea1f6d0e Add revision and recurse parameters to treepkg.subversion.export
Bernhard Herzog <bh@intevation.de>
parents: 262
diff changeset
55 args.extend(["--revision", revision])
e201ea1f6d0e Add revision and recurse parameters to treepkg.subversion.export
Bernhard Herzog <bh@intevation.de>
parents: 262
diff changeset
56 if not recurse:
e201ea1f6d0e Add revision and recurse parameters to treepkg.subversion.export
Bernhard Herzog <bh@intevation.de>
parents: 262
diff changeset
57 args.append("-N")
e201ea1f6d0e Add revision and recurse parameters to treepkg.subversion.export
Bernhard Herzog <bh@intevation.de>
parents: 262
diff changeset
58 run.call(cmdexpand("svn export -q @args $src $dest", **locals()))
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
59
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
60 def last_changed_revision(svn_working_copy):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
61 """return the last changed revision of an SVN working copy as an int"""
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
62 # Make sure we run svn under the C locale to avoid localized
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
63 # messages
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
64 env = os.environ.copy()
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
65 env["LANG"] = "C"
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
66
45
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 0
diff changeset
67 output = run.capture_output(cmdexpand("svn info $svn_working_copy",
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 0
diff changeset
68 **locals()),
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 0
diff changeset
69 env=env)
269
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
70 str_rev = extract_value_for_key(output.splitlines(), "Last Changed Rev:")
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
71 if str_rev is None:
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
72 raise SubversionError("Cannot determine last changed revision for %r"
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
73 % svn_working_copy)
97fd2584df5f Make treepkg.subversion.last_changed_revision raise SubversionError if
Bernhard Herzog <bh@intevation.de>
parents: 266
diff changeset
74 return int(str_rev)
224
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
75
282
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
76 def log_xml(url, base_revision):
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
77 """Return the log in XML of the repository at url from base_revision to HEAD
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
78 """
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
79 args = ["--revision", str(base_revision) + ":HEAD",
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
80 "--verbose",
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
81 "--xml"]
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
82 return run.capture_output(cmdexpand("svn log @args $url", **locals()))
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
83
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
84
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
85 def extract_tag_revisions(xml_log):
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
86 """Extracts the revisions which changed an SVN tag since its creation
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
87 This includes the revision which created the tag and all subsequent
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
88 changes. The xml_log parameter should contain the xml-Version of
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
89 the SVN log of the tag that includes at least the revision that
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
90 created the tag and all the newer revisions.
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
91 """
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
92 tree = etree.parse(StringIO.StringIO(xml_log))
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
93 tag_revisions = tree.xpath("logentry/@revision"
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
94 "[.>=../../logentry/@revision"
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
95 "[../paths/path[@copyfrom-path]]]")
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
96 return tag_revisions
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
97
f58f9adb7dc3 Add functions to get SVN logs and extract tag revisions from it. Add
Bernhard Herzog <bh@intevation.de>
parents: 273
diff changeset
98
224
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
99
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
100 class SvnRepository(object):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
101
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
102 """Describes a subversion repository"""
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
103
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
104 def __init__(self, url, external_subdirs=()):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
105 """Initialize the subversion repository description
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
106 Parameters:
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
107 url -- The url of the repository
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
108 external_subdirs -- A list of subdirectories which are managed
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
109 by svn externals definitions
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
110 """
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
111 self.url = url
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
112 self.external_subdirs = external_subdirs
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
113
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
114 def checkout(self, localdir, revision=None):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
115 """Checks out the repository into localdir. The revision
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
116 parameter should be an and indicates the revision to check out.
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
117 """
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
118 checkout(self.url, localdir, revision=revision)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
119
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
120 def export(self, localdir, destdir):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
121 """Exports the working copy in localdir to destdir"""
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
122 export(localdir, destdir)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
123 for subdir in self.external_subdirs:
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
124 absdir = os.path.join(destdir, subdir)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
125 if not os.path.isdir(absdir):
228
d2ddd037ddaf Fix a bug introduced by the subversion interface reorganization
Bernhard Herzog <bh@intevation.de>
parents: 224
diff changeset
126 export(os.path.join(localdir, subdir), absdir)
224
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
127
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
128 def last_changed_revision(self, localdir):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
129 """Returns the last changed revision of the working copy in localdir"""
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
130 return max([last_changed_revision(os.path.join(localdir, d))
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
131 for d in [localdir] + list(self.external_subdirs)])
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
132
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
133
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
134 class SvnWorkingCopy(object):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
135
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
136 """Represents a checkout of a subversion repository"""
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
137
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
138 def __init__(self, repository, localdir, logger=None):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
139 """
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
140 Initialize the working copy.
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
141 Parameters:
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
142 repository -- The SvnRepository instance describing the
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
143 repository
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
144 localdir -- The directory for the working copy
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
145 logger -- logging object to use for some info/debug messages
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
146 """
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
147 self.repository = repository
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
148 self.localdir = localdir
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
149 self.logger = logger
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
150
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
151 def log_info(self, *args):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
152 if self.logger is not None:
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
153 self.logger.info(*args)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
154
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
155 def update_or_checkout(self, revision=None):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
156 """Updates the working copy or creates by checking out the repository"""
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
157 if os.path.exists(self.localdir):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
158 self.log_info("Updating the working copy in %r", self.localdir)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
159 update(self.localdir, revision=revision)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
160 else:
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
161 self.log_info("The working copy in %r doesn't exist yet."
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
162 " Checking out from %r",
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
163 self.localdir, self.repository.url)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
164 self.repository.checkout(self.localdir, revision=revision)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
165
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
166 def export(self, destdir):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
167 """Exports the working copy to destdir"""
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
168 self.repository.export(self.localdir, destdir)
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
169
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
170 def last_changed_revision(self):
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
171 """Returns the last changed rev of the working copy"""
6bac65dcf258 Handle the svn repositories and working copies in a more object oriented way
Bernhard Herzog <bh@intevation.de>
parents: 208
diff changeset
172 return self.repository.last_changed_revision(self.localdir)
230
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
173
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
174
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
175 class ManualWorkingCopy(object):
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
176
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
177 """A manually managed working copy"""
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
178
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
179 def __init__(self, directory):
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
180 self.directory = directory
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
181
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
182 def update_or_checkout(self, revision=None, recurse=True):
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
183 """This method does nothing"""
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
184 pass
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
185
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
186 def export(self, destdir):
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
187 """Copies the entire working copy to destdir"""
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
188 shutil.copytree(self.directory, destdir)
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
189
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
190 def last_changed_revision(self):
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
191 """Always returns 0"""
e387b879fd38 Add treepkg.subversion.ManualWorkingCopy. Same interface as
Bernhard Herzog <bh@intevation.de>
parents: 228
diff changeset
192 return 0
273
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
193
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
194
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
195 class TagDetector(object):
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
196
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
197 """Class to automatically find SVN tags and help package them
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
198
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
199 The tags are found using three parameters:
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
200 url -- The base url of the SVN tags directory to use
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
201 pattern -- A regular expression matching the subdirectories to
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
202 consider in the tag directory specified by the url
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
203 subdir -- A subdirectory of the directory matched by pattern to
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
204 export and use to determine revision number
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
205
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
206 The subdir parameter is there to cope with the kdepim enterprise
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
207 tags. The URL for a tag is of the form
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
208 .../tags/kdepim/enterprise4.0.<date>.<rev> . Each such tag has
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
209 subdirectories for kdepim, kdelibs, etc. The url and pattern are
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
210 used to match the URL for the tag, and the subdir is used to select
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
211 which part of the tag is meant.
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
212
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
213 The subdir also determines which SVN directory's revision number is
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
214 used. Normally, just appending the subdir to the tag URL would be
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
215 enough for this, but the situation is more complex for
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
216 kdebase_workspace and kdebase_runtime, whose code comes from
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
217 different subdirectories of the kdebase-4.X-branch subdirectory (for
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
218 enterprise4 tags). Here the revision number must be taken from
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
219 kdebase-4.X-branch, but the URL to use when exporting the sources,
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
220 must refer to e.g. kdebase-4.1-branch/kdebase_workspace. To achieve
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
221 that, subdir may contain slashes to indicate subdirectories of
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
222 subdirectories, but only the first part of subdir (up to the first
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
223 slash) is used when determining the revision number.
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
224 """
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
225
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
226 def __init__(self, url, pattern, subdir):
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
227 self.url = url
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
228 self.pattern = re.compile(pattern)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
229 self.subdir = subdir
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
230
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
231 def list_tags(self):
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
232 matches = []
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
233 if self.url:
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
234 for tag in list_url(self.url):
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
235 if self.pattern.match(tag.rstrip("/")):
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
236 matches.append(tag)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
237 return sorted(matches)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
238
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
239 def newest_tag_revision(self):
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
240 """Determines the newest tag revision and returns (tagurl, revno)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
241 If no tag can be found, the method returns the tuple (None, None).
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
242 """
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
243 candidates = self.list_tags()
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
244 urlrev = (None, None)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
245 if candidates:
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
246 newest = candidates[-1]
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
247 urlrev = self.determine_revision(self.url + "/" + newest,
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
248 self.subdir)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
249 return urlrev
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
250
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
251 def determine_revision(self, baseurl, subdir):
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
252 urlrev = (None, None)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
253 revision_url = baseurl + "/" + subdir.split("/")[0]
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
254 try:
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
255 revision = last_changed_revision(revision_url)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
256 urlrev = (baseurl + "/" + subdir, revision)
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
257 except SubversionError:
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
258 pass
4b700b39c32f Refactoring: Move the TagDetector class into the treepkg.subversion module
Bernhard Herzog <bh@intevation.de>
parents: 269
diff changeset
259 return urlrev
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)