1import pysvn
2import sys
3import os
4
5def make_tag( from_url, tag_base_url, version ):
6    client = pysvn.Client()
7    client.callback_get_log_message = lambda : (True, 'Tag version '+version)
8    client.callback_get_login = callback_getLogin
9
10    try:
11        from_files = client.ls( from_url, recurse=False )
12        print( 'Info: Found', from_url )
13    except pysvn.ClientError as e:
14        print( 'Error: From does not exist',from_url )
15        return
16
17    try:
18        tag_files = client.ls( tag_base_url, recurse=False )
19        print( 'Info: Found', tag_base_url )
20    except pysvn.ClientError as e:
21        print( 'Error: Tag base does not exist',tag_base_url )
22        return
23
24    cur_versions = [os.path.basename(f['name']) for f in tag_files]
25
26    if version in cur_versions:
27        print( 'Error: Already tagged',version )
28        return
29
30
31    try:
32        to_url = tag_base_url + '/' + version
33        print( 'Info: Copy',repr(from_url), repr(to_url) )
34        client.copy( from_url, to_url )
35        print( 'Info: Copy complete' )
36    except pysvn.ClientError as e:
37        print( 'Error: ', str(e) )
38        return
39
40def callback_getLogin( realm, username, may_save ):
41    print( 'May save:',may_save )
42    print( 'Realm:',realm )
43    if username:
44        print( 'Username:',username )
45    else:
46        sys.stdout.write( 'Username: ' )
47        username = sys.stdin.readline().strip()
48        if len(username) == 0:
49            return 0, '', '', False
50
51    sys.stdout.write( 'Password: ' )
52    password = sys.stdin.readline().strip()
53
54    save_password = 'x'
55    while save_password.lower() not in ['y','ye','yes','n', 'no','']:
56        sys.stdout.write( 'Save password? [y/n] ' )
57        save_password = sys.stdin.readline().strip()
58
59    return 1, username, password, save_password in ['y','ye','yes']
60
61def main():
62    if len(sys.argv) != 2:
63        print( 'Usage: %s version' % sys.argv[0] )
64        return
65
66    version = sys.argv[1]
67    from_url = 'https://svn.code.sf.net/p/cxx/code/trunk/CXX'
68    tag_base_url = 'https://svn.code.sf.net/p/cxx/code/tags'
69
70    make_tag( from_url, tag_base_url, version )
71
72if __name__ == '__main__':
73    main()
74