| require "English" |
| require "svn/error" |
| require "svn/util" |
| require "svn/core" |
| require "svn/delta" |
| require "svn/ext/wc" |
| |
| module Svn |
| module Wc |
| Util.set_constants(Ext::Wc, self) |
| Util.set_methods(Ext::Wc, self) |
| self.swig_init_asp_dot_net_hack() |
| |
| @@alias_targets = %w(parse_externals_description |
| ensure_adm cleanup) |
| class << self |
| @@alias_targets.each do |target| |
| alias_method "_#{target}", target |
| end |
| end |
| @@alias_targets.each do |target| |
| alias_method "_#{target}", target |
| end |
| @@alias_targets = nil |
| |
| module_function |
| def locked?(path) |
| Wc.locked(path) |
| end |
| |
| def ensure_adm(*args) |
| AdmAccess.ensure(*args) |
| end |
| |
| # For backward compatibility |
| def parse_externals_description(*args) |
| ExternalsDescription.parse(*args) |
| end |
| |
| def actual_target(path) |
| Wc.get_actual_target(path) |
| end |
| |
| def normal_prop?(name) |
| Wc.is_normal_prop(name) |
| end |
| |
| def wc_prop?(name) |
| Wc.is_wc_prop(name) |
| end |
| |
| def entry_prop?(name) |
| Wc.is_entry_prop(name) |
| end |
| |
| def pristine_copy_path(path) |
| Wc.get_pristine_copy_path(path) |
| end |
| |
| def default_ignores(config) |
| Wc.get_default_ignores(config) |
| end |
| |
| def cleanup(path, diff3_cmd=nil, cancel_func=nil) |
| Wc.cleanup2(path, diff3_cmd, cancel_func) |
| end |
| |
| def ignore?(path, patterns) |
| Wc.match_ignore_list(path, patterns) |
| end |
| |
| module ExternalsDescription |
| module_function |
| def parse(parent_dir, desc, canonicalize_url=true) |
| Wc.parse_externals_description3(parent_dir, desc, canonicalize_url) |
| end |
| end |
| |
| class ExternalItem |
| class << self |
| undef new |
| end |
| end |
| |
| AdmAccess = SWIG::TYPE_p_svn_wc_adm_access_t |
| class AdmAccess |
| class << self |
| def ensure(path, uuid, url, repos, revision, depth=nil) |
| Wc.ensure_adm3(path, uuid, url, repos, revision, depth) |
| end |
| |
| def open(associated, path, write_lock=true, |
| depth=-1, cancel_func=nil, &block) |
| _open(:adm_open3, associated, path, write_lock, |
| depth, cancel_func, &block) |
| end |
| |
| def probe_open(associated, path, write_lock=true, depth=-1, |
| cancel_func=nil, &block) |
| _open(:adm_probe_open3, associated, path, write_lock, |
| depth, cancel_func, &block) |
| end |
| |
| def open_anchor(path, write_lock=true, depth=-1, |
| cancel_func=nil, &block) |
| _open(:adm_open_anchor, path, write_lock, depth, |
| cancel_func, &block) |
| end |
| |
| private |
| def _open(name, *args, &block) |
| results = Wc.__send__(name, *args, &block) |
| adm, *rest = results |
| |
| if block_given? |
| begin |
| yield *results |
| ensure |
| adm.close |
| end |
| else |
| results |
| end |
| end |
| end |
| |
| attr_accessor :traversal_info |
| |
| def open(*args, &block) |
| self.class.open(self, *args, &block) |
| end |
| |
| def probe_open(*args, &block) |
| self.class.probe_open(self, *args, &block) |
| end |
| |
| def retrieve(path) |
| Wc.adm_retrieve(self, path) |
| end |
| |
| def probe_retrieve(path) |
| Wc.adm_probe_retrieve(self, path) |
| end |
| |
| def probe_try(path, write_lock, depth, &cancel_func) |
| Wc.adm_probe_try3(self, path, write_lock, depth, cancel_func) |
| end |
| |
| def close |
| Wc.adm_close(self) |
| end |
| |
| def path |
| Wc.adm_access_path(self) |
| end |
| |
| def locked? |
| Wc.adm_locked(self) |
| end |
| |
| def has_binary_prop?(path) |
| Wc.has_binary_prop(path, self) |
| end |
| |
| def text_modified?(filename, force=false) |
| Wc.text_modified_p(filename, force, self) |
| end |
| |
| def props_modified?(path) |
| Wc.props_modified_p(path, self) |
| end |
| |
| def entry(path, show_hidden=false) |
| Entry.new(path, self, show_hidden, Svn::Core::Pool.new) |
| end |
| |
| def read_entries(show_hidden=false) |
| Wc.entries_read(self, show_hidden, Svn::Core::Pool.new) |
| end |
| |
| def ancestry(path) |
| Wc.get_ancestry(path, self) |
| end |
| |
| def walk_entries(path, callbacks, show_hidden=false, cancel_func=nil, |
| depth=nil) |
| Wc.walk_entries3(path, self, callbacks, depth, show_hidden, |
| cancel_func) |
| end |
| |
| def mark_missing_deleted(path) |
| Wc.mark_missing_deleted(path, self) |
| end |
| |
| def maybe_set_repos_root(path, repos) |
| Wc.maybe_set_repos_root(self, path, repos) |
| end |
| |
| def status(path) |
| Wc.status2(path, self) |
| end |
| |
| def status_editor(target, config, recurse=true, |
| get_all=true, no_ignore=true, |
| cancel_func=nil, traversal_info=nil) |
| traversal_info ||= _traversal_info |
| status_func = Proc.new do |path, status| |
| yield(path, status) |
| end |
| ret = Wc.get_status_editor2(self, target, config, recurse, |
| get_all, no_ignore, status_func, |
| cancel_func, traversal_info) |
| editor, editor_baton, set_lock_baton = *ret |
| editor.instance_variable_set("@__status_fun__", status_func) |
| editor.baton = editor_baton |
| def set_lock_baton.set_repos_locks(locks, repos_root) |
| Wc.status_set_repos_locks(self, locks, repos_root) |
| end |
| [editor, set_lock_baton] |
| end |
| |
| def copy(src, dst_basename, cancel_func=nil, notify_func=nil) |
| Wc.copy2(src, self, dst_basename, cancel_func, notify_func) |
| end |
| |
| def delete(path, cancel_func=nil, notify_func=nil, keep_local=false) |
| Wc.delete3(path, self, cancel_func, notify_func, keep_local) |
| end |
| |
| def add(path, copyfrom_url=nil, copyfrom_rev=0, |
| cancel_func=nil, notify_func=nil) |
| Wc.add2(path, self, copyfrom_url, copyfrom_rev, |
| cancel_func, notify_func) |
| end |
| |
| def add_repos_file(dst_path, new_text_path, new_props, |
| copyfrom_url=nil, copyfrom_rev=0) |
| Wc.add_repos_file(dst_path, self, new_text_path, |
| new_props, copyfrom_url, copyfrom_rev) |
| end |
| |
| def add_repos_file2(dst_path, new_text_base_path, new_base_props, |
| new_text_path=nil, new_props=nil, |
| copyfrom_url=nil, copyfrom_rev=0) |
| Wc.add_repos_file2(dst_path, self, |
| new_text_base_path, new_text_path, |
| new_base_props, new_props, |
| copyfrom_url, copyfrom_rev) |
| end |
| |
| def remove_from_revision_control(name, destroy_wf=true, |
| instant_error=true, |
| cancel_func=nil) |
| Wc.remove_from_revision_control(self, name, |
| destroy_wf, |
| instant_error, |
| cancel_func) |
| end |
| |
| def resolved_conflict(path, resolve_text=true, |
| resolve_props=true, recurse=true, |
| notify_func=nil, cancel_func=nil) |
| Wc.resolved_conflict2(path, self, resolve_text, |
| resolve_props, recurse, |
| notify_func, cancel_func) |
| end |
| |
| def process_committed(path, new_revnum, rev_date=nil, rev_author=nil, |
| wcprop_changes=[], recurse=true, |
| remove_lock=true, digest=nil, |
| remove_changelist=false) |
| Wc.process_committed4(path, self, recurse, |
| new_revnum, rev_date, |
| rev_author, wcprop_changes, |
| remove_lock, remove_changelist, digest) |
| end |
| |
| def crawl_revisions(path, reporter, restore_files=true, |
| depth=nil, use_commit_times=true, |
| notify_func=nil, traversal_info=nil) |
| traversal_info ||= _traversal_info |
| Wc.crawl_revisions3(path, self, reporter, reporter.baton, |
| restore_files, depth, use_commit_times, |
| notify_func, traversal_info) |
| end |
| |
| def wc_root?(path) |
| Wc.is_wc_root(path, self) |
| end |
| |
| def update_editor(target, target_revision=nil, use_commit_times=nil, |
| depth=nil, allow_unver_obstruction=nil, diff3_cmd=nil, |
| notify_func=nil, cancel_func=nil, traversal_info=nil, |
| preserved_exts=nil) |
| update_editor2(:target => target, |
| :target_revision => target_revision, |
| :use_commit_times => use_commit_times, |
| :depth => depth, |
| :allow_unver_obstruction => allow_unver_obstruction, |
| :diff3_cmd => diff3_cmd, |
| :notify_func => notify_func, |
| :cancel_func => cancel_func, |
| :traversal_info => traversal_info, |
| :preserved_exts => preserved_exts ) |
| end |
| |
| UPDATE_EDITOR2_REQUIRED_ARGUMENTS_KEYS = [:target] |
| def update_editor2(arguments={}) |
| arguments = arguments.reject {|k, v| v.nil?} |
| optional_arguments_defaults = { |
| :target_revision => nil, |
| :use_commit_times => true, |
| :depth => nil, |
| :depth_is_sticky => false, |
| :allow_unver_obstruction => false, |
| :diff3_cmd => nil, |
| :notify_func => nil, |
| :cancel_func => nil, |
| :conflict_func => nil, |
| :traversal_info => _traversal_info, |
| :preserved_exts => [] |
| } |
| |
| arguments = optional_arguments_defaults.merge(arguments) |
| Util.validate_options(arguments, |
| optional_arguments_defaults.keys, |
| UPDATE_EDITOR2_REQUIRED_ARGUMENTS_KEYS) |
| |
| # TODO(rb support fetch_fun): implement support for the fetch_func |
| # callback. |
| arguments[:fetch_func] = nil |
| |
| results = Wc.get_update_editor3(arguments[:target_revision], self, |
| arguments[:target], |
| arguments[:use_commit_times], |
| arguments[:depth], |
| arguments[:depth_is_sticky], |
| arguments[:allow_unver_obstruction], |
| arguments[:notify_func], |
| arguments[:cancel_func], |
| arguments[:conflict_func], |
| arguments[:fetch_func], |
| arguments[:diff3_cmd], |
| arguments[:preserved_exts], |
| arguments[:traversal_info]) |
| target_revision_address, editor, editor_baton = results |
| editor.__send__(:target_revision_address=, target_revision_address) |
| editor.baton = editor_baton |
| editor |
| end |
| |
| def switch_editor(target, switch_url, target_revision=nil, |
| use_commit_times=nil, depth=nil, |
| allow_unver_obstruction=nil, diff3_cmd=nil, |
| notify_func=nil, cancel_func=nil, traversal_info=nil, |
| preserved_exts=nil) |
| switch_editor2(:target => target, |
| :switch_url => switch_url, |
| :target_revision => target_revision, |
| :use_commit_times => use_commit_times, |
| :depth => depth, |
| :allow_unver_obstruction => allow_unver_obstruction, |
| :diff3_cmd => diff3_cmd, |
| :notify_func => notify_func, |
| :cancel_func => cancel_func, |
| :traversal_info => traversal_info, |
| :preserved_exts => preserved_exts ) |
| end |
| |
| SWITCH_EDITOR2_REQUIRED_ARGUMENTS_KEYS = [:target, :switch_url] |
| def switch_editor2(arguments={}) |
| arguments = arguments.reject {|k, v| v.nil?} |
| optional_arguments_defaults = { |
| :target_revision => nil, |
| :use_commit_times => true, |
| :depth => nil, |
| :depth_is_sticky => false, |
| :allow_unver_obstruction => false, |
| :diff3_cmd => nil, |
| :notify_func => nil, |
| :cancel_func => nil, |
| :conflict_func => nil, |
| :traversal_info => _traversal_info, |
| :preserved_exts => [] |
| } |
| arguments = optional_arguments_defaults.merge(arguments) |
| Util.validate_options(arguments, |
| optional_arguments_defaults.keys, |
| SWITCH_EDITOR2_REQUIRED_ARGUMENTS_KEYS) |
| |
| results = Wc.get_switch_editor3(arguments[:target_revision], self, |
| arguments[:target], |
| arguments[:switch_url], |
| arguments[:use_commit_times], |
| arguments[:depth], |
| arguments[:depth_is_sticky], |
| arguments[:allow_unver_obstruction], |
| arguments[:notify_func], |
| arguments[:cancel_func], |
| arguments[:conflict_func], |
| arguments[:diff3_cmd], |
| arguments[:preserved_exts], |
| arguments[:traversal_info]) |
| target_revision_address, editor, editor_baton = results |
| editor.__send__(:target_revision_address=, target_revision_address) |
| editor.baton = editor_baton |
| editor |
| end |
| |
| def prop_list(path) |
| Wc.prop_list(path, self) |
| end |
| |
| def prop(name, path) |
| Wc.prop_get(name, path, self) |
| end |
| |
| def set_prop(name, value, path, skip_checks=false) |
| Wc.prop_set2(name, value, path, self, skip_checks) |
| end |
| |
| def diff_editor(target, callbacks, depth=nil, |
| ignore_ancestry=true, use_text_base=false, |
| reverse_order=false, cancel_func=nil) |
| callbacks_wrapper = DiffCallbacksWrapper.new(callbacks) |
| args = [target, callbacks_wrapper, depth, ignore_ancestry, |
| use_text_base, reverse_order, cancel_func] |
| diff_editor2(*args) |
| end |
| |
| def diff_editor2(target, callbacks, depth=nil, |
| ignore_ancestry=true, use_text_base=false, |
| reverse_order=false, cancel_func=nil, changelists=nil) |
| editor, editor_baton = Wc.get_diff_editor4(self, target, callbacks, |
| depth, ignore_ancestry, |
| use_text_base, reverse_order, |
| cancel_func, changelists) |
| editor.baton = editor_baton |
| editor |
| end |
| |
| def diff(target, callbacks, recurse=true, ignore_ancestry=true) |
| callbacks_wrapper = DiffCallbacksWrapper.new(callbacks) |
| args = [target, callbacks_wrapper, recurse, ignore_ancestry] |
| diff2(*args) |
| end |
| |
| def diff2(target, callbacks, recurse=true, ignore_ancestry=true) |
| Wc.diff3(self, target, callbacks, recurse, ignore_ancestry) |
| end |
| |
| def prop_diffs(path) |
| Wc.get_prop_diffs(path, self) |
| end |
| |
| def merge(left, right, merge_target, left_label, |
| right_label, target_label, dry_run=false, |
| diff3_cmd=nil, merge_options=nil) |
| Wc.merge2(left, right, merge_target, self, |
| left_label, right_label, target_label, |
| dry_run, diff3_cmd, merge_options) |
| end |
| |
| def merge_props(path, baseprops, propchanges, base_merge=true, |
| dry_run=false) |
| Wc.merge_props(path, self, baseprops, propchanges, |
| base_merge, dry_run) |
| end |
| |
| def merge_prop_diffs(path, propchanges, base_merge=true, |
| dry_run=false) |
| Wc.merge_prop_diffs(path, self, propchanges, |
| base_merge, dry_run) |
| end |
| |
| def relocate(path, from, to, recurse=true, old_validator=nil, &validator) |
| if validator.nil? and !old_validator.nil? |
| validator = Proc.new do |uuid, url, root_url| |
| old_validator.call(uuid, |
| root_url ? root_url : url, |
| root_url ? true : false) |
| end |
| end |
| Wc.relocate3(path, self, from, to, recurse, validator) |
| end |
| |
| def revert(path, recurse=true, use_commit_times=true, |
| cancel_func=nil, notify_func=nil) |
| Wc.revert2(path, self, recurse, use_commit_times, |
| cancel_func, notify_func) |
| end |
| |
| def translated_file(src, versioned_file, flags) |
| temp = Wc.translated_file2(src, versioned_file, self, flags) |
| temp.close |
| path = temp.path |
| path.instance_variable_set("@__temp__", temp) |
| path |
| end |
| |
| def translated_file2(src, versioned_file, flags) |
| Wc.translated_file2(src, versioned_file, self, flags) |
| end |
| |
| def translated_stream(path, versioned_file, flags) |
| Wc.translated_stream(path, versioned_file, self, flags) |
| end |
| |
| def transmit_text_deltas(path, editor, file_baton, fulltext=false) |
| editor.baton = file_baton |
| Wc.transmit_text_deltas(path, self, fulltext, editor) |
| end |
| |
| def transmit_text_deltas2(path, editor, fulltext=false) |
| Wc.transmit_text_deltas2(path, self, fulltext, editor) |
| end |
| |
| def transmit_prop_deltas(path, entry, editor, baton=nil) |
| editor.baton = baton if baton |
| Wc.transmit_prop_deltas(path, self, entry, editor) |
| end |
| |
| def ignores(config) |
| Wc.get_ignores(config, self) |
| end |
| |
| def add_lock(path, lock) |
| Wc.add_lock(path, lock, self) |
| end |
| |
| def remove_lock(path) |
| Wc.remove_lock(path, self) |
| end |
| |
| def set_changelist(path, changelist_name, cancel_func=nil, |
| notify_func=nil) |
| Wc.set_changelist(path, changelist_name, self, cancel_func, |
| notify_func) |
| end |
| |
| private |
| def _traversal_info |
| @traversal_info ||= nil |
| end |
| end |
| |
| class DiffCallbacksWrapper |
| def initialize(original) |
| @original = original |
| end |
| |
| def file_changed(access, path, tmpfile1, tmpfile2, rev1, |
| rev2, mimetype1, mimetype2, |
| prop_changes, original_props) |
| prop_changes = Util.hash_to_prop_array(prop_changes) |
| @original.file_changed(access, path, tmpfile1, tmpfile2, rev1, |
| rev2, mimetype1, mimetype2, |
| prop_changes, original_props) |
| end |
| |
| def file_added(access, path, tmpfile1, tmpfile2, rev1, |
| rev2, mimetype1, mimetype2, |
| prop_changes, original_props) |
| prop_changes = Util.hash_to_prop_array(prop_changes) |
| @original.file_added(access, path, tmpfile1, tmpfile2, rev1, |
| rev2, mimetype1, mimetype2, |
| prop_changes, original_props) |
| end |
| |
| def dir_props_changed(access, path, prop_changes, original_props) |
| prop_changes = Util.hash_to_prop_array(prop_changes) |
| @original.dir_props_changed(access, path, prop_changes, original_props) |
| end |
| |
| def method_missing(method, *args, &block) |
| @original.__send__(method, *args, &block) |
| end |
| end |
| |
| class TraversalInfo |
| def edited_externals |
| Wc.edited_externals(self) |
| end |
| end |
| |
| class Entry |
| def dup |
| Wc.entry_dup(self, Svn::Core::Pool.new) |
| end |
| |
| def conflicted(dir_path) |
| Wc.conflicted_p(dir_path, self) |
| end |
| |
| def conflicted?(dir_path) |
| conflicted(dir_path).any? {|x| x} |
| end |
| |
| def text_conflicted?(dir_path) |
| conflicted(dir_path)[0] |
| end |
| |
| def prop_conflicted?(dir_path) |
| conflicted(dir_path)[1] |
| end |
| |
| def dir? |
| kind == Core::NODE_DIR |
| end |
| |
| def file? |
| kind == Core::NODE_FILE |
| end |
| |
| def add? |
| schedule == SCHEDULE_ADD |
| end |
| |
| def normal? |
| schedule == SCHEDULE_NORMAL |
| end |
| end |
| |
| class Status2 |
| def dup |
| Wc.dup_status2(self, Core::Pool.new) |
| end |
| |
| def text_added? |
| text_status == STATUS_ADDED |
| end |
| |
| def text_normal? |
| text_status == STATUS_NORMAL |
| end |
| end |
| |
| class Notify |
| def dup |
| Wc.dup_notify(self, Core::Pool.new) |
| end |
| |
| def commit_added? |
| action == NOTIFY_COMMIT_ADDED |
| end |
| |
| def commit_deleted? |
| action == NOTIFY_COMMIT_DELETED |
| end |
| |
| def commit_postfix_txdelta? |
| action == NOTIFY_COMMIT_POSTFIX_TXDELTA |
| end |
| |
| def add? |
| action == NOTIFY_ADD |
| end |
| |
| def locked? |
| lock_state = NOTIFY_LOCK_STATE_LOCKED |
| end |
| |
| def unlocked? |
| lock_state = NOTIFY_LOCK_STATE_UNLOCKED |
| end |
| end |
| |
| class RevisionStatus |
| alias _initialize initialize |
| def initialize(wc_path, trail_url, committed, cancel_func=nil) |
| _initialize(wc_path, trail_url, committed, cancel_func) |
| end |
| end |
| |
| class CommittedQueue |
| def push(access, path, recurse=true, wcprop_changes={}, remove_lock=true, |
| remove_changelist=false, digest=nil) |
| Wc.queue_committed(self, path, access, recurse, wcprop_changes, |
| remove_lock, remove_changelist, digest) |
| self |
| end |
| |
| def process(access, new_rev, rev_date=nil, rev_author=nil) |
| rev_date = rev_date.to_svn_format if rev_date.is_a?(Time) |
| Wc.process_committed_queue(self, access, new_rev, rev_date, rev_author) |
| end |
| end |
| end |
| end |