1#!/usr/bin/python2.4
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'''
22Create a wx-style active list on stdout based on a Mercurial
23workspace in support of webrev's Mercurial support.
24'''
25
26#
27# NB: This assumes the normal onbld directory structure
28#
29import sys, os
30
31sys.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
35sys.path.insert(2, os.path.join(os.path.dirname(__file__), ".."))
36
37from onbld.Scm import Version
38
39try:
40    Version.check_version()
41except Version.VersionMismatch, versionerror:
42    sys.stderr.write("Error: %s\n" % versionerror)
43    sys.exit(1)
44
45
46import getopt, binascii
47from mercurial import hg, ui, util
48from onbld.Scm.WorkSpace import WorkSpace, HgRepoError
49
50
51def usage():
52    sys.stderr.write("usage: %s [-p parent] -w workspace\n" %
53                     os.path.basename(__file__))
54    sys.exit(2)
55
56
57def 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 HgRepoError, 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
123if __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)
131