# Buggy code
def build_process():
    """Forked for each build. Has its own process and python
    module space set up by build_environment.fork()."""

    start_time = time.time()
    if not fake:
        if not skip_patch:
            self.do_patch()
        else:
            self.do_stage()

    tty.msg("Building %s" % self.name)

    self.stage.keep = keep_stage
    self.install_phases = install_phases
    self.build_directory = join_path(self.stage.path, "spack-build")
    self.source_directory = self.stage.source_path

    with self.stage:
        # Run the pre-install hook in the child process after
        # the directory is created.
        spack.hooks.pre_install(self)

        if fake:
            self.do_fake_install()
        else:
            # Do the real install in the source directory.
            self.stage.chdir_to_source()

            # Save the build environment in a file before building.
            env_path = join_path(os.getcwd(), "spack-build.env")

            try:
                # Redirect I/O to a build log (and optionally to
                # the terminal)
                log_path = join_path(os.getcwd(), "spack-build.out")
                log_file = open(log_path, "w")
                with log_output(log_file, verbose, sys.stdout.isatty(), True):
                    dump_environment(env_path)
                    self.install(self.spec, self.prefix)

            except ProcessError as e:
                # Annotate ProcessErrors with the location of
                # the build log
                e.build_log = log_path
                raise e

            # Ensure that something was actually installed.
            if "install" in self.install_phases:
                self.sanity_check_prefix()

            # Copy provenance into the install directory on success
            if "provenance" in self.install_phases:
                log_install_path = layout.build_log_path(self.spec)
                env_install_path = layout.build_env_path(self.spec)
                packages_dir = layout.build_packages_path(self.spec)

                # Remove first if we're overwriting another build
                # (can happen with spack setup)
                try:
                    # log_install_path and env_install_path are here
                    shutil.rmtree(packages_dir)
                except:
                    pass

                install(log_path, log_install_path)
                install(env_path, env_install_path)
                dump_packages(self.spec, packages_dir)

        # Run post install hooks before build stage is removed.
        spack.hooks.post_install(self)

    # Stop timer.
    self._total_time = time.time() - start_time
    build_time = self._total_time - self._fetch_time

    tty.msg(
        "Successfully installed %s" % self.name,
        "Fetch: %s.  Build: %s.  Total: %s."
        % (_hms(self._fetch_time), _hms(build_time), _hms(self._total_time)),
    )
    print_pkg(self.prefix)


# Traceback (KeyError)
==> Installing cactusext
==> openmpi is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/openmpi-2.0.0-5l3pomaqonrx3phvbm4kblzsms56ljtj
==> hwloc is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/hwloc-1.11.3-xgdwohjb2o26uftzaqtcmwf2ejxlhidw
==> git is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/git-2.8.1-jh72meyfuritl2wexqmckrshmufe7az4
==> papi is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/papi-5.4.3-tnovpyennp4cerqns4xnfscfvl6d3zlz
==> hdf5-blosc is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/hdf5-blosc-master-6m7xtyqubxsb2merc36i2oyhtdvno3zp
==> lmod is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/lmod-6.4.1-i2xu3l63aipam7bdlu3ig4eriqtjnbbd
==> hdf5 is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/hdf5-1.10.0-patch1-jfa4zar7ysebuadia7zlhoebrlaeo5lv
==> python is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/python-2.7.11-y6bfneoxof25qt6wgdsbfsra62grfdnz
==> lua is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/lua-5.3.2-xe6niqb4cwgkdpq33qjoi3rby3vcdnew
==> fftw is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/fftw-3.3.4-ojokm7aahpro46e4tvoqgsc57lzbfdum
==> openssl is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/openssl-1.0.2h-ookfh4fsbv5ijqjsewerc5vvf4hzfme6
==> julia is already installed in /home/ux452368/comet/src/spack/opt/spack/linux-centos6-x86_64/gcc-6.1.0-spack/julia-master-bzqdzwekzl3geaeyuexssnelbnwfiwsf
Traceback (most recent call last):
File "/home/ux452368/comet/src/spack/bin/spack", line 179, in <module>
main()
File "/home/ux452368/comet/src/spack/bin/spack", line 157, in main
return_val = command(parser, args)
File "/home/ux452368/comet/src/spack/lib/spack/spack/cmd/install.py", line 91, in install
explicit=True)
File "/home/ux452368/comet/src/spack/lib/spack/spack/package.py", line 943, in do_install
run_tests=run_tests)
File "/home/ux452368/comet/src/spack/lib/spack/spack/package.py", line 1096, in do_install_dependencies
dep.package.do_install(**kwargs)
File "/home/ux452368/comet/src/spack/lib/spack/spack/package.py", line 925, in do_install
rec = spack.installed_db.get_record(self.spec)
File "/home/ux452368/comet/src/spack/lib/spack/spack/database.py", line 76, in converter
return function(self, spec_like, *args, **kwargs)
File "/home/ux452368/comet/src/spack/lib/spack/spack/database.py", line 461, in get_record
key = self._get_matching_spec_key(spec, **kwargs)
File "/home/ux452368/comet/src/spack/lib/spack/spack/database.py", line 456, in _get_matching_spec_key
raise KeyError("No such spec in database! %s" % spec)
KeyError: 'No such spec in database! julia@master%gcc@6.1.0-spack+binutils~cxx+hdf5+mpi~plot~python arch=linux-centos6-x86_64^binutils@2.25%gcc@6.1.0-spack+gold~krellpatch~libiberty arch=linux-centos6-x86_64^bzip2@1.0.6%gcc@6.1.0-spack arch=linux-centos6-x86_64^cmake@3.5.2%gcc@6.1.0-spack~doc+ncurses+openssl~qt arch=linux-centos6-x86_64^curl@7.49.1%gcc@6.1.0-spack arch=linux-centos6-x86_64^expat@2.1.0%gcc@6.1.0-spack arch=linux-centos6-x86_64^git@2.8.1%gcc@6.1.0-spack arch=linux-centos6-x86_64^hdf5@1.10.0-patch1%gcc@6.1.0-spack+cxx~debug+fortran+mpi+shared~szip~threadsafe arch=linux-centos6-x86_64^hwloc@1.11.3%gcc@6.1.0-spack arch=linux-centos6-x86_64^libpciaccess@0.13.4%gcc@6.1.0-spack arch=linux-centos6-x86_64^libsigsegv@2.10%gcc@6.1.0-spack arch=linux-centos6-x86_64^m4@1.4.17%gcc@6.1.0-spack+sigsegv arch=linux-centos6-x86_64^ncurses@6.0%gcc@6.1.0-spack arch=linux-centos6-x86_64^openmpi@2.0.0%gcc@6.1.0-spack~mxm~pmi~psm~psm2~slurm~sqlite3~thread_multiple~tm+verbs+vt arch=linux-centos6-x86_64^openssl@1.0.2h%gcc@6.1.0-spack arch=linux-centos6-x86_64^python@2.7.11%gcc@6.1.0-spack~ucs4 arch=linux-centos6-x86_64^readline@6.3%gcc@6.1.0-spack arch=linux-centos6-x86_64^sqlite@3.8.5%gcc@6.1.0-spack arch=linux-centos6-x86_64^zlib@1.2.8%gcc@6.1.0-spack arch=linux-centos6-x86_64'

# Fixed code
def build_process():
    """Forked for each build. Has its own process and python
    module space set up by build_environment.fork()."""

    start_time = time.time()
    if not fake:
        if not skip_patch:
            self.do_patch()
        else:
            self.do_stage()

    tty.msg("Building %s" % self.name)

    self.stage.keep = keep_stage
    self.install_phases = install_phases
    self.build_directory = join_path(self.stage.path, "spack-build")
    self.source_directory = self.stage.source_path

    with contextlib.nested(self.stage, self._prefix_write_lock()):
        # Run the pre-install hook in the child process after
        # the directory is created.
        spack.hooks.pre_install(self)

        if fake:
            self.do_fake_install()
        else:
            # Do the real install in the source directory.
            self.stage.chdir_to_source()

            # Save the build environment in a file before building.
            env_path = join_path(os.getcwd(), "spack-build.env")

            try:
                # Redirect I/O to a build log (and optionally to
                # the terminal)
                log_path = join_path(os.getcwd(), "spack-build.out")
                log_file = open(log_path, "w")
                with log_output(log_file, verbose, sys.stdout.isatty(), True):
                    dump_environment(env_path)
                    self.install(self.spec, self.prefix)

            except ProcessError as e:
                # Annotate ProcessErrors with the location of
                # the build log
                e.build_log = log_path
                raise e

            # Ensure that something was actually installed.
            if "install" in self.install_phases:
                self.sanity_check_prefix()

            # Copy provenance into the install directory on success
            if "provenance" in self.install_phases:
                log_install_path = layout.build_log_path(self.spec)
                env_install_path = layout.build_env_path(self.spec)
                packages_dir = layout.build_packages_path(self.spec)

                # Remove first if we're overwriting another build
                # (can happen with spack setup)
                try:
                    # log_install_path and env_install_path are here
                    shutil.rmtree(packages_dir)
                except:
                    pass

                install(log_path, log_install_path)
                install(env_path, env_install_path)
                dump_packages(self.spec, packages_dir)

        # Run post install hooks before build stage is removed.
        spack.hooks.post_install(self)

    # Stop timer.
    self._total_time = time.time() - start_time
    build_time = self._total_time - self._fetch_time

    tty.msg(
        "Successfully installed %s" % self.name,
        "Fetch: %s.  Build: %s.  Total: %s."
        % (_hms(self._fetch_time), _hms(build_time), _hms(self._total_time)),
    )
    print_pkg(self.prefix)