66 sys.stdout.write('Content-disposition: attachment; filename=%s\n' |
66 sys.stdout.write('Content-disposition: attachment; filename=%s\n' |
67 % file) |
67 % file) |
68 if size > 0: |
68 if size > 0: |
69 sys.stdout.write('Content-length: %d\n' % size) |
69 sys.stdout.write('Content-length: %d\n' % size) |
70 sys.stdout.write('\n') |
70 sys.stdout.write('\n') |
71 |
|
72 def httpnotfound(filename): |
|
73 sys.stdout.write("Status: 404\r\n\r\n") |
|
74 sys.stdout.write("File not found: (%s)" % (filename, )) |
|
75 |
71 |
76 def write(*things): |
72 def write(*things): |
77 for thing in things: |
73 for thing in things: |
78 if hasattr(thing, "__iter__"): |
74 if hasattr(thing, "__iter__"): |
79 for part in thing: |
75 for part in thing: |
935 def __init__(self, config): |
931 def __init__(self, config): |
936 self.cp = ConfigParser.SafeConfigParser() |
932 self.cp = ConfigParser.SafeConfigParser() |
937 self.cp.read(config) |
933 self.cp.read(config) |
938 |
934 |
939 def run(self): |
935 def run(self): |
|
936 def header(**map): |
|
937 yield tmpl("header", **map) |
|
938 |
|
939 def footer(**map): |
|
940 yield tmpl("footer", **map) |
|
941 |
|
942 templates = templatepath() |
|
943 m = os.path.join(templates, "map") |
|
944 tmpl = templater(m, common_filters, |
|
945 {"header": header, "footer": footer}) |
|
946 |
|
947 def entries(**map): |
|
948 parity = 0 |
|
949 l = self.cp.items("paths") |
|
950 l.sort() |
|
951 for v,r in l: |
|
952 cp2 = ConfigParser.SafeConfigParser() |
|
953 cp2.read(os.path.join(r, ".hg", "hgrc")) |
|
954 |
|
955 def get(sec, val, default): |
|
956 try: |
|
957 return cp2.get(sec, val) |
|
958 except: |
|
959 return default |
|
960 |
|
961 url = os.environ["REQUEST_URI"] + "/" + v |
|
962 url = url.replace("//", "/") |
|
963 |
|
964 yield dict(author=get("web", "author", "unknown"), |
|
965 name=get("web", "name", v), |
|
966 url=url, |
|
967 parity=parity, |
|
968 shortdesc=get("web", "description", "unknown"), |
|
969 lastupdate=os.stat(os.path.join(r, ".hg", |
|
970 "00changelog.d")).st_mtime) |
|
971 |
|
972 parity = 1 - parity |
|
973 |
940 try: |
974 try: |
941 virtual = os.environ["PATH_INFO"] |
975 virtual = os.environ["PATH_INFO"] |
942 except: |
976 except: |
943 virtual = "" |
977 virtual = "" |
944 |
978 |
949 real = self.cp.get("paths", virtual) |
983 real = self.cp.get("paths", virtual) |
950 h = hgweb(real) |
984 h = hgweb(real) |
951 h.run() |
985 h.run() |
952 return |
986 return |
953 else: |
987 else: |
954 httpnotfound(virtual) |
988 write(tmpl("notfound", repo = virtual)) |
955 return |
989 return |
956 |
990 |
957 def header(**map): |
|
958 yield tmpl("header", **map) |
|
959 |
|
960 def footer(**map): |
|
961 yield tmpl("footer", **map) |
|
962 |
|
963 templates = templatepath() |
|
964 m = os.path.join(templates, "map") |
|
965 tmpl = templater(m, common_filters, |
|
966 {"header": header, "footer": footer}) |
|
967 |
|
968 def entries(**map): |
|
969 parity = 0 |
|
970 l = self.cp.items("paths") |
|
971 l.sort() |
|
972 for v,r in l: |
|
973 cp2 = ConfigParser.SafeConfigParser() |
|
974 cp2.read(os.path.join(r, ".hg", "hgrc")) |
|
975 |
|
976 def get(sec, val, default): |
|
977 try: |
|
978 return cp2.get(sec, val) |
|
979 except: |
|
980 return default |
|
981 |
|
982 url = os.environ["REQUEST_URI"] + "/" + v |
|
983 url = url.replace("//", "/") |
|
984 |
|
985 yield dict(author=get("web", "author", "unknown"), |
|
986 name=get("web", "name", v), |
|
987 url=url, |
|
988 parity=parity, |
|
989 shortdesc=get("web", "description", "unknown"), |
|
990 lastupdate=os.stat(os.path.join(r, ".hg", |
|
991 "00changelog.d")).st_mtime) |
|
992 |
|
993 parity = 1 - parity |
|
994 |
|
995 write(tmpl("index", entries=entries)) |
991 write(tmpl("index", entries=entries)) |