#!/usr/bin/python # -*- coding: UTF-8 -*- """\ @file update_source_contributors.py @brief Update the source contributor list in one place, instead of having to substitute by hand. Derived from update_viewer_version.py $LicenseInfo:firstyear=2006&license=viewergpl$ Copyright (c) 2006-2009, Linden Research, Inc. Second Life Viewer Source Code The source code in this file ("Source Code") is provided by Linden Lab to you under the terms of the GNU General Public License, version 2.0 ("GPL"), unless you have obtained a separate licensing agreement ("Other License"), formally executed by you and Linden Lab. Terms of the GPL can be found in doc/GPL-license.txt in this distribution, or online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 There are special exceptions to the terms and conditions of the GPL as it is applied to this Source Code. View the full text of the exception in the file doc/FLOSS-exception.txt in this software distribution, or online at http://secondlifegrid.net/programs/open_source/licensing/flossexception By copying, modifying or distributing this software, you acknowledge that you have read and understood your obligations described above, and agree to abide by those obligations. ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, COMPLETENESS OR PERFORMANCE. $/LicenseInfo$ """ import sys import os.path import string import getopt, os, re, commands lang_sep={"es":", ", "en-us":", ", "ru":", ", "hu":", ", "pl":", ", "ko":", ", "tr":", ", "it":", ", "da":", ", "pt":", ", "de":", ", "zh":", ", "fr":", ", "ja":"、", "uk":", "} intro="Snowglobe includes source code contributions of the following residents: " def add_indra_lib_path(): root = os.path.realpath(__file__) # always insert the directory of the script in the search path dir = os.path.dirname(root) if dir not in sys.path: sys.path.insert(0, dir) # Now go look for indra/lib/python in the parent dies while root != os.path.sep: root = os.path.dirname(root) dir = os.path.join(root, 'indra', 'lib', 'python') if os.path.isdir(dir): if dir not in sys.path: sys.path.insert(0, dir) return root else: print >>sys.stderr, "This script is not inside a valid installation." sys.exit(1) src_root = add_indra_lib_path() from indra.util import llversion def usage(): print "Usage:" print sys.argv[0] + """ [options] Options: --version Specify the version string to replace current version. --skip-on-branch Specify a regular expression against which the current branch is matched. If it matches, then leave version strings alone. Use this to avoid changing version strings on release candidate builds. --src-root Location of source tree --verbose --help Print this message and exit. """ def _getstatusoutput(cmd): """Return Win32 (status, output) of executing cmd in a shell.""" if os.path.sep != "/": # stupid #%#$$ windows cmd = 'cmd.exe /c "'+cmd+'"' pipe = os.popen(cmd, 'r') text = pipe.read() sts = pipe.close() if sts is None: sts = 0 if text[-1:] == '\n': text = text[:-1] return sts, text def get_contributors(filename): f = open(filename) credits={} contributors=[] thisres='' for line in f: m = re.search('^(\S+ +\S+)\s*$', line.strip()) if(m): thisres=m.group(1) credits[thisres]=[] contributors.append(thisres) m = re.search('^\s+(\S+\-\d+)\s*$', line) if(m and thisres != ''): credits[thisres].append(m.group(1)) return contributors def main(): global src_root global intro svn = os.path.expandvars("${SVN}") if not svn or svn == "${SVN}": svn = "svn" contributors = get_contributors(src_root + "/doc/contributions.txt") re_map = {} #re_map['filename'] = (('pattern', 'replacement'), # ('pattern', 'replacement') for lang in lang_sep.keys(): filename='indra/newview/skins/default/xui/%(lang)s/floater_about.xml' % locals() searchpattern='%(intro)s.*\n' % {'intro':intro} replacelist=string.join(contributors, lang_sep[lang]) replacement='%(intro)s%(replacelist)s\n' % {'intro':intro,'replacelist':replacelist} re_map[filename] = [[searchpattern, replacement]] verbose = False opts, args = getopt.getopt(sys.argv[1:], "", ['skip-on-branch=', 'src-root=', 'verbose', 'help']) skip_on_branch_re = None for o,a in opts: if o in ('--skip-on-branch'): skip_on_branch_re = re.compile(a) if o in ('--src-root'): src_root = a if o in ('--verbose'): verbose = True if o in ('--help'): usage() return 0 if verbose: print "Source Path:", src_root if viewer_channel != None: print "Current viewer channel/version: '%(viewer_channel)s' / '%(viewer_version)s'" % locals() print # Iterate through all of the files in the map, and apply the # substitution filters for filename in re_map.keys(): try: # Read the entire file into a string full_fn = src_root + '/' + filename file = open(full_fn,"r") file_str = file.read() file.close() if verbose: print "Processing file:",filename for rule in re_map[filename]: repl = rule[1] file_str = re.sub(rule[0], repl, file_str) file = open(full_fn,"w") file.write(file_str) file.close() except IOError: print "File %(filename)s not present, skipping..." % locals() return 0 main()