#!/usr/bin/env python
#
# autoprop_tests.py: testing automatic properties
#
# Subversion is a tool for revision control.
# See http://subversion.apache.org for more information.
#
# ====================================================================
# 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.
######################################################################
# General modules
import os
# Our testing module
import svntest
# (abbreviation)
Skip = svntest.testcase.Skip_deco
SkipUnless = svntest.testcase.SkipUnless_deco
XFail = svntest.testcase.XFail_deco
Issues = svntest.testcase.Issues_deco
Issue = svntest.testcase.Issue_deco
Wimp = svntest.testcase.Wimp_deco
Item = svntest.wc.StateItem
# Helper function
def check_proplist(path, exp_out):
"""Verify that property list on PATH has a value of EXP_OUT"""
props = svntest.tree.get_props([path]).get(path, {})
if props != exp_out:
print("Expected properties: %s" % exp_out)
print("Actual properties: %s" % props)
raise svntest.Failure
######################################################################
# Tests
#----------------------------------------------------------------------
def create_config(config_dir, enable_flag):
"create config directories and files"
# contents of the file 'config'
config_contents = '''\
[auth]
password-stores =
[miscellany]
enable-auto-props = %s
[auto-props]
*.c = cfile=yes
*.jpg = jpgfile=ja
fubar* = tarfile=si
foobar.lha = lhafile=da;lzhfile=niet
spacetest = abc = def ; ghi = ; = j
escapetest = myval=;;;;val;myprop=p
quotetest = svn:keywords="Author Date Id Rev URL";
* = auto=oui
''' % (enable_flag and 'yes' or 'no')
svntest.main.create_config_dir(config_dir, config_contents)
#----------------------------------------------------------------------
def autoprops_test(sbox, cmd, cfgenable, clienable, subdir):
"""configurable autoprops test.
CMD is the subcommand to test: 'import' or 'add'
if CFGENABLE is true, enable autoprops in the config file, else disable
if CLIENABLE == 1: --auto-props is added to the command line
0: nothing is added
-1: --no-auto-props is added to command line
if string SUBDIR is not empty files are created in that subdir and the
directory is added/imported"""
# Bootstrap
sbox.build()
# some directories
wc_dir = sbox.wc_dir
tmp_dir = os.path.abspath(svntest.main.temp_dir)
config_dir = os.path.join(tmp_dir, 'autoprops_config_' + sbox.name)
repos_url = sbox.repo_url
# initialize parameters
if cmd == 'import':
parameters = ['import', '-m', 'bla']
files_dir = tmp_dir
else:
parameters = ['add']
files_dir = wc_dir
parameters = parameters + ['--config-dir', config_dir]
create_config(config_dir, cfgenable)
# add comandline flags
if clienable == 1:
parameters = parameters + ['--auto-props']
enable_flag = 1
elif clienable == -1:
parameters = parameters + ['--no-auto-props']
enable_flag = 0
else:
enable_flag = cfgenable
# setup subdirectory if needed
if len(subdir) > 0:
files_dir = os.path.join(files_dir, subdir)
files_wc_dir = os.path.join(wc_dir, subdir)
os.makedirs(files_dir)
else:
files_wc_dir = wc_dir
# create test files
filenames = ['foo.h',
'foo.c',
'foo.jpg',
'fubar.tar',
'foobar.lha',
'spacetest',
'escapetest',
'quotetest']
for filename in filenames:
svntest.main.file_write(os.path.join(files_dir, filename),
'foo\nbar\nbaz\n')
if len(subdir) == 0:
# add/import the files
for filename in filenames:
path = os.path.join(files_dir, filename)
if cmd == 'import':
tmp_params = parameters + [path, repos_url + '/' + filename]
else:
tmp_params = parameters + [path]
svntest.main.run_svn(None, *tmp_params)
else:
# add/import subdirectory
if cmd == 'import':
parameters = parameters + [files_dir, repos_url]
else:
parameters = parameters + [files_wc_dir]
svntest.main.run_svn(None, *parameters)
# do an svn co if needed
if cmd == 'import':
svntest.main.run_svn(None, 'checkout', repos_url, files_wc_dir,
'--config-dir', config_dir)
# check the properties
if enable_flag:
filename = os.path.join(files_wc_dir, 'foo.h')
check_proplist(filename, {'auto':'oui'})
filename = os.path.join(files_wc_dir, 'foo.c')
check_proplist(filename, {'auto':'oui', 'cfile':'yes'})
filename = os.path.join(files_wc_dir, 'foo.jpg')
check_proplist(filename, {'auto':'oui', 'jpgfile':'ja'})
filename = os.path.join(files_wc_dir, 'fubar.tar')
check_proplist(filename, {'auto':'oui', 'tarfile':'si'})
filename = os.path.join(files_wc_dir, 'foobar.lha')
check_proplist(filename, {'auto':'oui', 'lhafile':'da', 'lzhfile':'niet'})
filename = os.path.join(files_wc_dir, 'spacetest')
check_proplist(filename, {'auto':'oui', 'abc':'def', 'ghi':''})
filename = os.path.join(files_wc_dir, 'escapetest')
check_proplist(filename, {'auto':'oui', 'myval':';;val', 'myprop':'p'})
filename = os.path.join(files_wc_dir, 'quotetest')
check_proplist(filename, {'auto':'oui',
'svn:keywords': 'Author Date Id Rev URL'})
else:
for filename in filenames:
check_proplist(os.path.join(files_wc_dir, filename), {})
#----------------------------------------------------------------------
def autoprops_add_no_none(sbox):
"add: config=no, commandline=none"
autoprops_test(sbox, 'add', 0, 0, '')
#----------------------------------------------------------------------
def autoprops_add_yes_none(sbox):
"add: config=yes, commandline=none"
autoprops_test(sbox, 'add', 1, 0, '')
#----------------------------------------------------------------------
def autoprops_add_no_yes(sbox):
"add: config=no, commandline=yes"
autoprops_test(sbox, 'add', 0, 1, '')
#----------------------------------------------------------------------
def autoprops_add_yes_yes(sbox):
"add: config=yes, commandline=yes"
autoprops_test(sbox, 'add', 1, 1, '')
#----------------------------------------------------------------------
def autoprops_add_no_no(sbox):
"add: config=no, commandline=no"
autoprops_test(sbox, 'add', 0, -1, '')
#----------------------------------------------------------------------
def autoprops_add_yes_no(sbox):
"add: config=yes, commandline=no"
autoprops_test(sbox, 'add', 1, -1, '')
#----------------------------------------------------------------------
def autoprops_imp_no_none(sbox):
"import: config=no, commandline=none"
autoprops_test(sbox, 'import', 0, 0, '')
#----------------------------------------------------------------------
def autoprops_imp_yes_none(sbox):
"import: config=yes, commandline=none"
autoprops_test(sbox, 'import', 1, 0, '')
#----------------------------------------------------------------------
def autoprops_imp_no_yes(sbox):
"import: config=no, commandline=yes"
autoprops_test(sbox, 'import', 0, 1, '')
#----------------------------------------------------------------------
def autoprops_imp_yes_yes(sbox):
"import: config=yes, commandline=yes"
autoprops_test(sbox, 'import', 1, 1, '')
#----------------------------------------------------------------------
def autoprops_imp_no_no(sbox):
"import: config=no, commandline=no"
autoprops_test(sbox, 'import', 0, -1, '')
#----------------------------------------------------------------------
def autoprops_imp_yes_no(sbox):
"import: config=yes, commandline=no"
autoprops_test(sbox, 'import', 1, -1, '')
#----------------------------------------------------------------------
def autoprops_add_dir(sbox):
"add directory"
autoprops_test(sbox, 'add', 1, 0, 'autodir')
#----------------------------------------------------------------------
def autoprops_imp_dir(sbox):
"import directory"
autoprops_test(sbox, 'import', 1, 0, 'autodir')
#----------------------------------------------------------------------
# Issue #2713: adding a file with an svn:eol-style property, svn should abort
# if the file has mixed EOL style. Previously, svn aborted but had added the
# file anyway.
@Issue(2713)
def fail_add_mixed_eol_style(sbox):
"fail to add a file with mixed EOL style"
from svntest.actions import run_and_verify_svn, run_and_verify_unquiet_status
# Bootstrap
sbox.build()
filename = 'mixed-eol.txt'
filepath = os.path.join(sbox.wc_dir, filename)
parameters = ['--auto-props',
'--config-option=config:auto-props:' + filename
+ '=svn:eol-style=native']
svntest.main.file_write(filepath, 'foo\nbar\r\nbaz\r')
expected_stderr = "svn: E200009: File '.*" + filename + \
"' has inconsistent newlines" + \
"|" + "svn: E135000: Inconsistent line ending style\n"
run_and_verify_svn(None, [], expected_stderr,
'add', filepath, *parameters)
expected_status = svntest.wc.State(sbox.wc_dir,
{filename : Item(status='? ')})
run_and_verify_unquiet_status(filepath, expected_status)
########################################################################
# Run the tests
# list all tests here, starting with None:
test_list = [ None,
autoprops_add_no_none,
autoprops_add_yes_none,
autoprops_add_no_yes,
autoprops_add_yes_yes,
autoprops_add_no_no,
autoprops_add_yes_no,
autoprops_imp_no_none,
autoprops_imp_yes_none,
autoprops_imp_no_yes,
autoprops_imp_yes_yes,
autoprops_imp_no_no,
autoprops_imp_yes_no,
autoprops_add_dir,
autoprops_imp_dir,
fail_add_mixed_eol_style,
]
if __name__ == '__main__':
svntest.main.run_tests(test_list)
# NOTREACHED
### End of file.