1 #!/usr/bin/python2.6 2 # 3 # This program is free software; you can redistribute it and/or modify 4 # it under the terms of the GNU General Public License version 2 5 # as published by the Free Software Foundation. 6 # 7 # This program is distributed in the hope that it will be useful, 8 # but WITHOUT ANY WARRANTY; without even the implied warranty of 9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 # GNU General Public License for more details. 11 # 12 # You should have received a copy of the GNU General Public License 13 # along with this program; if not, write to the Free Software 14 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 15 # 16 17 # 18 # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 19 # 20 21 ''' 22 Create a wx-style active list on stdout based on a Mercurial 23 workspace in support of webrev's Mercurial support. 24 ''' 25 26 # 27 # NB: This assumes the normal onbld directory structure 28 # 29 import sys, os 30 31 sys.path.insert(1, os.path.join(os.path.dirname(__file__), "..", "lib", 32 "python%d.%d" % sys.version_info[:2])) 33 34 # Allow running from the source tree, using the modules in the source tree 35 sys.path.insert(2, os.path.join(os.path.dirname(__file__), "..")) 36 37 from onbld.Scm import Version 38 39 try: 40 Version.check_version() 41 except Version.VersionMismatch, versionerror: 42 sys.stderr.write("Error: %s\n" % versionerror) 43 sys.exit(1) 44 45 46 import getopt, binascii 47 from mercurial import error, hg, ui, util 48 from onbld.Scm.WorkSpace import WorkSpace 49 50 51 def usage(): 52 sys.stderr.write("usage: %s [-p parent] -w workspace\n" % 53 os.path.basename(__file__)) 54 sys.exit(2) 55 56 57 def main(argv): 58 try: 59 opts = getopt.getopt(argv, 'w:o:p:')[0] 60 except getopt.GetoptError, e: 61 sys.stderr.write(str(e) + '\n') 62 usage() 63 64 parentpath = None 65 wspath = None 66 outputfile = None 67 68 for opt, arg in opts: 69 if opt == '-w': 70 wspath = arg 71 elif opt == '-o': 72 outputfile = arg 73 elif opt == '-p': 74 parentpath = arg 75 76 if not wspath: 77 usage() 78 79 try: 80 repository = hg.repository(ui.ui(), wspath) 81 except error.RepoError, e: 82 sys.stderr.write("failed to open repository: %s\n" % e) 83 sys.exit(1) 84 85 ws = WorkSpace(repository) 86 act = ws.active(parentpath) 87 88 node = act.parenttip.node() 89 parenttip = binascii.hexlify(node) 90 91 fh = None 92 if outputfile: 93 try: 94 fh = open(outputfile, 'w') 95 except EnvironmentError, e: 96 sys.stderr.write("could not open output file: %s\n" % e) 97 sys.exit(1) 98 else: 99 fh = sys.stdout 100 101 fh.write("HG_PARENT=%s\n" % parenttip) 102 103 entries = [i for i in act] 104 entries.sort() 105 106 for entry in entries: 107 if entry.is_renamed() or entry.is_copied(): 108 fh.write("%s %s\n" % (entry.name, entry.parentname)) 109 else: 110 fh.write("%s\n" % entry.name) 111 112 # Strip blank lines. 113 comments = filter(lambda x: x and not x.isspace(), 114 entry.comments) 115 116 fh.write('\n') 117 if comments: 118 fh.write('%s\n' % '\n'.join(comments)) 119 else: 120 fh.write("*** NO COMMENTS ***\n") 121 fh.write('\n') 122 123 if __name__ == '__main__': 124 try: 125 main(sys.argv[1:]) 126 except KeyboardInterrupt: 127 sys.exit(1) 128 except util.Abort, msg: 129 sys.stderr.write("Abort: %s\n" % msg) 130 sys.exit(1)