
import os
import sys
import json


def read_conf(fname):
    if not os.path.isfile(fname):
        return {}

    with open(fname, 'r') as conf:
        return json.load(conf)


def build_qrc(resources):
    yield '<RCC>'
    yield '<qresource>'
    for d in resources:
        for root, dirs, files in os.walk(d):
            for f in files:
                yield '<file>{}</file>'.format(os.path.join(root, f))
    yield '</qresource>'
    yield '</RCC>'


def build_resources(resources, target):
    with open(target, 'w') as f:
        for line in build_qrc(resources):
            f.write(line + os.linesep)


def build(source):
    conf = read_conf(source)
    target = os.path.basename(source)
    if '.' in target:
        target = target.rsplit('.', 1)[0]
    target += '.qrc'
    build_resources(conf.get('resources', []), target)


if __name__ == '__main__':
    build(sys.argv[1] if len(sys.argv) >= 1 else 'resources.json')


import os
import sys
import json


def read_conf(fname):
    if not os.path.isfile(fname):
        return {}

    with open(fname, 'r') as conf:
        return json.load(conf)


def build_qrc(resources):
    yield '<RCC>'
    yield '<qresource>'
    for d in resources:
        for root, dirs, files in os.walk(d):
            dirs.sort()
            files.sort()
            for f in files:
                yield '<file>{}</file>'.format(os.path.join(root, f))
    yield '</qresource>'
    yield '</RCC>'


def build_resources(resources, target):
    with open(target, 'w') as f:
        for line in build_qrc(resources):
            f.write(line + os.linesep)


def build(source):
    conf = read_conf(source)
    target = os.path.basename(source)
    if '.' in target:
        target = target.rsplit('.', 1)[0]
    target += '.qrc'
    build_resources(conf.get('resources', []), target)


if __name__ == '__main__':
    build(sys.argv[1] if len(sys.argv) >= 1 else 'resources.json')

Sort qrc input file list
Sort qrc input file list

so that yubikey-manager-qt packages build in a reproducible way
in spite of indeterministic filesystem readdir order

See https://reproducible-builds.org/ for why this is good.

  
  import os
  import sys
  import json
  
  
  def read_conf(fname):
      if not os.path.isfile(fname):
          return {}
  
      with open(fname, 'r') as conf:
          return json.load(conf)
  
  
  def build_qrc(resources):
      yield '<RCC>'
      yield '<qresource>'
      for d in resources:
          for root, dirs, files in os.walk(d):
+             dirs.sort()
+             files.sort()
              for f in files:
                  yield '<file>{}</file>'.format(os.path.join(root, f))
      yield '</qresource>'
      yield '</RCC>'
  
  
  def build_resources(resources, target):
      with open(target, 'w') as f:
          for line in build_qrc(resources):
              f.write(line + os.linesep)
  
  
  def build(source):
      conf = read_conf(source)
      target = os.path.basename(source)
      if '.' in target:
          target = target.rsplit('.', 1)[0]
      target += '.qrc'
      build_resources(conf.get('resources', []), target)
  
  
  if __name__ == '__main__':
      build(sys.argv[1] if len(sys.argv) >= 1 else 'resources.json')
  
Sort qrc input file list
## Code Before:

import os
import sys
import json


def read_conf(fname):
    if not os.path.isfile(fname):
        return {}

    with open(fname, 'r') as conf:
        return json.load(conf)


def build_qrc(resources):
    yield '<RCC>'
    yield '<qresource>'
    for d in resources:
        for root, dirs, files in os.walk(d):
            for f in files:
                yield '<file>{}</file>'.format(os.path.join(root, f))
    yield '</qresource>'
    yield '</RCC>'


def build_resources(resources, target):
    with open(target, 'w') as f:
        for line in build_qrc(resources):
            f.write(line + os.linesep)


def build(source):
    conf = read_conf(source)
    target = os.path.basename(source)
    if '.' in target:
        target = target.rsplit('.', 1)[0]
    target += '.qrc'
    build_resources(conf.get('resources', []), target)


if __name__ == '__main__':
    build(sys.argv[1] if len(sys.argv) >= 1 else 'resources.json')

## Instruction:
Sort qrc input file list
## Code After:

import os
import sys
import json


def read_conf(fname):
    if not os.path.isfile(fname):
        return {}

    with open(fname, 'r') as conf:
        return json.load(conf)


def build_qrc(resources):
    yield '<RCC>'
    yield '<qresource>'
    for d in resources:
        for root, dirs, files in os.walk(d):
            dirs.sort()
            files.sort()
            for f in files:
                yield '<file>{}</file>'.format(os.path.join(root, f))
    yield '</qresource>'
    yield '</RCC>'


def build_resources(resources, target):
    with open(target, 'w') as f:
        for line in build_qrc(resources):
            f.write(line + os.linesep)


def build(source):
    conf = read_conf(source)
    target = os.path.basename(source)
    if '.' in target:
        target = target.rsplit('.', 1)[0]
    target += '.qrc'
    build_resources(conf.get('resources', []), target)


if __name__ == '__main__':
    build(sys.argv[1] if len(sys.argv) >= 1 else 'resources.json')
