#!/usr/bin/env python
#
# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

# Updates the list of Observatory source files.

import os
import sys
from datetime import date


def getDir(rootdir, target):
    sources = []
    for root, subdirs, files in os.walk(rootdir):
        subdirs.sort()
        files.sort()
        for f in files:
            sources.append(root + '/' + f)
    return sources


HEADER = """# Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

# DO NOT EDIT. This file is generated by update_sources.py in this directory.

# This file contains all dart, css, and html sources for Observatory.
"""


def main():
    with open('observatory_sources.gni', 'w') as target:
        target.write(HEADER)
        target.write('observatory_sources = [\n')
        sources = []
        for rootdir in ['lib', 'web']:
            sources.extend(getDir(rootdir, target))
        sources.sort()
        for s in sources:
            if (s[-9:] != 'README.md'):
                target.write('  "' + s + '",\n')
        target.write(']\n')


if __name__ == "__main__":
    main()
