summaryrefslogtreecommitdiff
path: root/tools/examples/get-location-segments.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/examples/get-location-segments.py')
-rwxr-xr-xtools/examples/get-location-segments.py118
1 files changed, 118 insertions, 0 deletions
diff --git a/tools/examples/get-location-segments.py b/tools/examples/get-location-segments.py
new file mode 100755
index 0000000..c084dae
--- /dev/null
+++ b/tools/examples/get-location-segments.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+import sys
+import os
+from svn import client, ra, core
+
+def printer(segment, pool):
+ path = segment.path is not None and segment.path or "(null)"
+ print("r%d-r%d: %s" % (segment.range_start, segment.range_end, path))
+
+
+def parse_args(args):
+ argc = len(sys.argv)
+
+ # parse the target URL and optional peg revision
+ path_pieces = args[0].split('@')
+ if len(path_pieces) > 1:
+ peg_revision = int(path_pieces[-1])
+ assert peg_revision >= 0
+ url = '@'.join(path_pieces[:-1])
+ else:
+ peg_revision = core.SVN_INVALID_REVNUM
+ url = path_pieces[0]
+ url = core.svn_path_canonicalize(url)
+
+ # parse the revision range, if any
+ if argc > 2:
+ rev_pieces = args[1].split(':')
+ num_revs = len(rev_pieces)
+ assert num_revs < 3
+ if num_revs == 2:
+ start_revision = int(rev_pieces[0])
+ end_revision = int(rev_pieces[1])
+ else:
+ start_revision = end_revision = int(rev_pieces[0])
+ assert(start_revision >= 0)
+ assert(end_revision >= 0)
+ else:
+ start_revision = peg_revision
+ end_revision = 0
+
+ # validate
+ if start_revision >= 0 \
+ and end_revision >= 0 \
+ and end_revision > start_revision:
+ raise Exception("End revision must not be younger than start revision")
+ if peg_revision >= 0 \
+ and start_revision >= 0 \
+ and start_revision > peg_revision:
+ raise Exception("Start revision must not be younger than peg revision")
+
+ return url, peg_revision, start_revision, end_revision
+
+
+def main():
+ try:
+ url, peg_revision, start_revision, end_revision = parse_args(sys.argv[1:])
+ except Exception, e:
+ sys.stderr.write("""Usage: %s URL[@PEG-REV] [START-REV[:END-REV]]
+
+Trace the history of URL@PEG-REV, printing the location(s) of its
+existence between START-REV and END-REV. If START-REV is not
+provided, the entire history of URL@PEG-REV back to its origin will be
+displayed. If provided, START-REV must not be younger than PEG-REV.
+If END-REV is provided, it must not be younger than START-REV.
+
+(This is a wrapper around Subversion's svn_ra_get_location_segments() API.)
+
+ERROR: %s
+""" % (os.path.basename(sys.argv[0]), str(e)))
+ sys.exit(1)
+
+ core.svn_config_ensure(None)
+ ctx = client.ctx_t()
+
+ # Make sure that these are at the start of the list, so passwords from
+ # gnome-keyring / kwallet are checked before asking for new passwords.
+ # Note that we don't pass our config here, since we can't seem to access
+ # ctx.config.config (ctx.config is opaque).
+ providers = core.svn_auth_get_platform_specific_client_providers(None, None)
+ providers.extend([
+ client.get_simple_provider(),
+ client.get_username_provider(),
+ client.get_ssl_server_trust_file_provider(),
+ client.get_ssl_client_cert_file_provider(),
+ client.get_ssl_client_cert_pw_file_provider(),
+ ])
+
+ ctx.auth_baton = core.svn_auth_open(providers)
+ ctx.config = core.svn_config_get_config(None)
+
+ ra_callbacks = ra.callbacks_t()
+ ra_callbacks.auth_baton = ctx.auth_baton
+ ra_session = ra.open(url, ra_callbacks, None, ctx.config)
+ ra.get_location_segments(ra_session, "", peg_revision,
+ start_revision, end_revision, printer)
+
+if __name__ == "__main__":
+ main()