Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nix
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 4a2a45f53d16
Choose a base ref
...
head repository: NixOS/nix
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: c9d0cf7e02d4
Choose a head ref

Commits on Mar 22, 2020

  1. Verified

    This commit was signed with the committer’s verified signature. The key has expired.
    dtzWill Will Dietz
    Copy the full SHA
    f694f43 View commit details

Commits on Mar 23, 2020

  1. error test

    bburdette committed Mar 23, 2020

    Verified

    This commit was signed with the committer’s verified signature. The key has expired.
    dtzWill Will Dietz
    Copy the full SHA
    aadd59d View commit details

Commits on Mar 24, 2020

  1. renaming

    bburdette committed Mar 24, 2020

    Verified

    This commit was signed with the committer’s verified signature. The key has expired.
    dtzWill Will Dietz
    Copy the full SHA
    4171ab4 View commit details
  2. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    0166e7a View commit details
  3. fix column range

    bburdette committed Mar 24, 2020
    Copy the full SHA
    657c08c View commit details
  4. Copy the full SHA
    fc310ed View commit details

Commits on Mar 25, 2020

  1. Copy the full SHA
    3582dc3 View commit details
  2. some colors

    bburdette committed Mar 25, 2020
    Copy the full SHA
    d44c9c5 View commit details

Commits on Mar 27, 2020

  1. camelcase; optional hint

    bburdette committed Mar 27, 2020
    Copy the full SHA
    a3ef00b View commit details
  2. more cleanup

    bburdette committed Mar 27, 2020
    Copy the full SHA
    00eb3fc View commit details
  3. remove util.hh from deps

    bburdette committed Mar 27, 2020
    Copy the full SHA
    759f398 View commit details

Commits on Mar 30, 2020

  1. build with make

    bburdette committed Mar 30, 2020
    Copy the full SHA
    35c7bab View commit details
  2. remove cruft

    bburdette committed Mar 30, 2020
    Copy the full SHA
    28d073e View commit details

Commits on Mar 31, 2020

  1. enum style

    bburdette committed Mar 31, 2020
    Copy the full SHA
    09652f5 View commit details
  2. rename errors/warnings

    bburdette committed Mar 31, 2020
    Copy the full SHA
    9e7b89b View commit details
  3. Copy the full SHA
    5b3aeff View commit details

Commits on Apr 1, 2020

  1. examples of invalid errors

    bburdette committed Apr 1, 2020
    Copy the full SHA
    a72b6b2 View commit details
  2. Copy the full SHA
    8713aea View commit details
  3. indenting

    bburdette committed Apr 1, 2020
    Copy the full SHA
    dd7b818 View commit details

Commits on Apr 2, 2020

  1. Copy the full SHA
    e697884 View commit details
  2. full include path

    bburdette committed Apr 2, 2020
    Copy the full SHA
    b85ba3e View commit details
  3. indenting

    bburdette committed Apr 2, 2020
    Copy the full SHA
    1c329ca View commit details
  4. formatted with astyle

    bburdette committed Apr 2, 2020
    Copy the full SHA
    c6b3fcd View commit details

Commits on Apr 3, 2020

  1. Copy the full SHA
    7b7801d View commit details
  2. Copy the full SHA
    9bb528d View commit details
  3. move out of tests/

    bburdette committed Apr 3, 2020
    Copy the full SHA
    9a8b3e9 View commit details

Commits on Apr 5, 2020

  1. libexpr

    bburdette committed Apr 5, 2020
    Copy the full SHA
    1221ae3 View commit details

Commits on Apr 6, 2020

  1. Copy the full SHA
    216263c View commit details
  2. Copy the full SHA
    85f14c4 View commit details
  3. ignore error-demo

    bburdette committed Apr 6, 2020
    Copy the full SHA
    2248cc6 View commit details

Commits on Apr 7, 2020

  1. Copy the full SHA
    ec449c8 View commit details
  2. comment cleanup

    bburdette committed Apr 7, 2020
    Copy the full SHA
    55c96b6 View commit details
  3. Copy the full SHA
    20c0984 View commit details
  4. columnRange -> column

    bburdette committed Apr 7, 2020
    Copy the full SHA
    00c507c View commit details

Commits on Apr 8, 2020

  1. initializer style

    bburdette committed Apr 8, 2020
    Copy the full SHA
    47ed067 View commit details
  2. return of NixCode

    bburdette committed Apr 8, 2020
    Copy the full SHA
    54f9192 View commit details
  3. comments

    bburdette committed Apr 8, 2020
    Copy the full SHA
    555baa8 View commit details
  4. format -> fmt

    bburdette committed Apr 8, 2020
    Copy the full SHA
    8c2bf15 View commit details
  5. indention

    bburdette committed Apr 8, 2020
    Copy the full SHA
    805ffe1 View commit details

Commits on Apr 15, 2020

  1. Copy the full SHA
    adf03b0 View commit details
  2. move implementation to cc

    bburdette committed Apr 15, 2020
    Copy the full SHA
    057e5b6 View commit details

Commits on Apr 16, 2020

  1. Copy the full SHA
    96262e7 View commit details
  2. iomanip no longer needed

    bburdette committed Apr 16, 2020
    Copy the full SHA
    1281480 View commit details

Commits on Apr 22, 2020

  1. Path fetcher: Fix store path name

    (cherry picked from commit c7af247)
    edolstra committed Apr 22, 2020
    Copy the full SHA
    2ea4d45 View commit details
  2. Copy the full SHA
    16e3bf4 View commit details
  3. Don't install error-demo

    edolstra committed Apr 22, 2020
    Copy the full SHA
    7114f08 View commit details
  4. Copy the full SHA
    c9d0cf7 View commit details
Showing with 368 additions and 14 deletions.
  1. +2 −0 .gitignore
  2. +66 −0 src/error-demo/error-demo.cc
  3. +12 −0 src/error-demo/local.mk
  4. +1 −1 src/libfetchers/path.cc
  5. +13 −0 src/libutil/ansicolor.hh
  6. +146 −0 src/libutil/error.cc
  7. +121 −0 src/libutil/error.hh
  8. +6 −4 src/libutil/types.hh
  9. +1 −9 src/libutil/util.hh
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -75,6 +75,8 @@ perl/Makefile.config

/src/nix-copy-closure/nix-copy-closure

/src/error-demo/error-demo

/src/build-remote/build-remote

# /tests/
66 changes: 66 additions & 0 deletions src/error-demo/error-demo.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include "error.hh"
#include "nixexpr.hh"

#include <iostream>
#include <optional>

int main()
{
using namespace nix;

// In each program where errors occur, this has to be set.
ErrorInfo::programName = std::optional("error-demo");

// Error in a program; no hint and no nix code.
printErrorInfo(
ErrorInfo { .level = elError,
.name = "name",
.description = "error description",
});

// Warning with name, description, and hint.
// The hintfmt function makes all the substituted text yellow.
printErrorInfo(
ErrorInfo { .level = elWarning,
.name = "name",
.description = "error description",
.hint = std::optional(
hintfmt("there was a %1%", "warning")),
});


// Warning with nix file, line number, column, and the lines of
// code where a warning occurred.
SymbolTable testTable;
auto problem_file = testTable.create("myfile.nix");

printErrorInfo(
ErrorInfo{
.level = elWarning,
.name = "warning name",
.description = "warning description",
.hint = hintfmt("this hint has %1% templated %2%!!", "yellow", "values"),
.nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13),
.prevLineOfCode = std::nullopt,
.errLineOfCode = "this is the problem line of code",
.nextLineOfCode = std::nullopt
}});

// Error with previous and next lines of code.
printErrorInfo(
ErrorInfo{
.level = elError,
.name = "error name",
.description = "error description",
.hint = hintfmt("this hint has %1% templated %2%!!", "yellow", "values"),
.nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13),
.prevLineOfCode = std::optional("previous line of code"),
.errLineOfCode = "this is the problem line of code",
.nextLineOfCode = std::optional("next line of code"),
}});


return 0;
}
12 changes: 12 additions & 0 deletions src/error-demo/local.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
programs += error-demo

error-demo_DIR := $(d)

error-demo_SOURCES := \
$(wildcard $(d)/*.cc) \

error-demo_CXXFLAGS += -I src/libutil -I src/libexpr

error-demo_LIBS = libutil libexpr

error-demo_LDFLAGS = -pthread $(SODIUM_LIBS) $(EDITLINE_LIBS) $(BOOST_LDFLAGS) -lboost_context -lboost_thread -lboost_system
2 changes: 1 addition & 1 deletion src/libfetchers/path.cc
Original file line number Diff line number Diff line change
@@ -72,7 +72,7 @@ struct PathInput : Input

if (!storePath || storePath->name() != "source" || !store->isValidPath(*storePath))
// FIXME: try to substitute storePath.
storePath = store->addToStore("name", path);
storePath = store->addToStore("source", path);

return
{
13 changes: 13 additions & 0 deletions src/libutil/ansicolor.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#pragma once

namespace nix
{
/* Some ANSI escape sequences. */
#define ANSI_NORMAL "\e[0m"
#define ANSI_BOLD "\e[1m"
#define ANSI_FAINT "\e[2m"
#define ANSI_RED "\e[31;1m"
#define ANSI_GREEN "\e[32;1m"
#define ANSI_YELLOW "\e[33;1m"
#define ANSI_BLUE "\e[34;1m"
}
146 changes: 146 additions & 0 deletions src/libutil/error.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
#include "error.hh"

#include <iostream>
#include <optional>

namespace nix
{

std::optional<string> ErrorInfo::programName = std::nullopt;

std::ostream& operator<<(std::ostream &os, const hintformat &hf)
{
return os << hf.str();
}

string showErrPos(const ErrPos &errPos)
{
if (errPos.column > 0) {
return fmt("(%1%:%2%)", errPos.lineNumber, errPos.column);
} else {
return fmt("(%1%)", errPos.lineNumber);
};
}

void printCodeLines(const string &prefix, const NixCode &nixCode)
{
// previous line of code.
if (nixCode.prevLineOfCode.has_value()) {
std::cout << fmt("%1% %|2$5d|| %3%",
prefix,
(nixCode.errPos.lineNumber - 1),
*nixCode.prevLineOfCode)
<< std::endl;
}

// line of code containing the error.%2$+5d%
std::cout << fmt("%1% %|2$5d|| %3%",
prefix,
(nixCode.errPos.lineNumber),
nixCode.errLineOfCode)
<< std::endl;

// error arrows for the column range.
if (nixCode.errPos.column > 0) {
int start = nixCode.errPos.column;
std::string spaces;
for (int i = 0; i < start; ++i) {
spaces.append(" ");
}

std::string arrows("^");

std::cout << fmt("%1% |%2%" ANSI_RED "%3%" ANSI_NORMAL,
prefix,
spaces,
arrows) << std::endl;
}

// next line of code.
if (nixCode.nextLineOfCode.has_value()) {
std::cout << fmt("%1% %|2$5d|| %3%",
prefix,
(nixCode.errPos.lineNumber + 1),
*nixCode.nextLineOfCode)
<< std::endl;
}
}

void printErrorInfo(const ErrorInfo &einfo)
{
int errwidth = 80;
string prefix = " ";

string levelString;
switch (einfo.level) {
case ErrLevel::elError: {
levelString = ANSI_RED;
levelString += "error:";
levelString += ANSI_NORMAL;
break;
}
case ErrLevel::elWarning: {
levelString = ANSI_YELLOW;
levelString += "warning:";
levelString += ANSI_NORMAL;
break;
}
default: {
levelString = fmt("invalid error level: %1%", einfo.level);
break;
}
}

int ndl = prefix.length() + levelString.length() + 3 + einfo.name.length() + einfo.programName.value_or("").length();
int dashwidth = ndl > (errwidth - 3) ? 3 : errwidth - ndl;

string dashes;
for (int i = 0; i < dashwidth; ++i)
dashes.append("-");

// divider.
std::cout << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL,
prefix,
levelString,
"---",
einfo.name,
dashes,
einfo.programName.value_or(""))
<< std::endl;

// filename.
if (einfo.nixCode.has_value()) {
if (einfo.nixCode->errPos.nixFile != "") {
string eline = einfo.nixCode->errLineOfCode != ""
? string(" ") + showErrPos(einfo.nixCode->errPos)
: "";

std::cout << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL,
prefix,
einfo.nixCode->errPos.nixFile,
eline) << std::endl;
std::cout << prefix << std::endl;
} else {
std::cout << fmt("%1%from command line argument", prefix) << std::endl;
std::cout << prefix << std::endl;
}
}

// description
std::cout << prefix << einfo.description << std::endl;
std::cout << prefix << std::endl;

// lines of code.
if (einfo.nixCode->errLineOfCode != "") {
printCodeLines(prefix, *einfo.nixCode);
std::cout << prefix << std::endl;
}

// hint
if (einfo.hint.has_value()) {
std::cout << prefix << *einfo.hint << std::endl;
std::cout << prefix << std::endl;
}
}

}
121 changes: 121 additions & 0 deletions src/libutil/error.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#ifndef error_hh
#define error_hh

#include "ansicolor.hh"
#include <string>
#include <optional>
#include <iostream>
#include "types.hh"

namespace nix
{

typedef enum {
elWarning,
elError
} ErrLevel;

struct ErrPos
{
int lineNumber;
int column;
string nixFile;

template <class P>
ErrPos& operator=(const P &pos)
{
lineNumber = pos.line;
column = pos.column;
nixFile = pos.file;
return *this;
}

template <class P>
ErrPos(const P &p)
{
*this = p;
}
};

struct NixCode
{
ErrPos errPos;
std::optional<string> prevLineOfCode;
string errLineOfCode;
std::optional<string> nextLineOfCode;
};

// ----------------------------------------------------------------
// format function for hints. same as fmt, except templated values
// are always in yellow.

template <class T>
struct yellowify
{
yellowify(T &s) : value(s) {}
T &value;
};

template <class T>
std::ostream& operator<<(std::ostream &out, const yellowify<T> &y)
{
return out << ANSI_YELLOW << y.value << ANSI_NORMAL;
}

class hintformat
{
public:
hintformat(string format) :fmt(format)
{
fmt.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit);
}
template<class T>
hintformat& operator%(const T &value)
{
fmt % yellowify(value);
return *this;
}

std::string str() const
{
return fmt.str();
}

template <typename U>
friend class AddHint;
private:
format fmt;
};

std::ostream& operator<<(std::ostream &os, const hintformat &hf);

template<typename... Args>
inline hintformat hintfmt(const std::string & fs, const Args & ... args)
{
hintformat f(fs);
formatHelper(f, args...);
return f;
}

// -------------------------------------------------
// ErrorInfo.
struct ErrorInfo
{
ErrLevel level;
string name;
string description;
std::optional<hintformat> hint;
std::optional<NixCode> nixCode;

static std::optional<string> programName;
};

// --------------------------------------------------------
// error printing

// just to cout for now.
void printErrorInfo(const ErrorInfo &einfo);

}

#endif
10 changes: 6 additions & 4 deletions src/libutil/types.hh
Original file line number Diff line number Diff line change
@@ -41,7 +41,8 @@ struct FormatOrString
{
string s;
FormatOrString(const string & s) : s(s) { };
FormatOrString(const format & f) : s(f.str()) { };
template<class F>
FormatOrString(const F & f) : s(f.str()) { };
FormatOrString(const char * s) : s(s) { };
};

@@ -51,12 +52,13 @@ struct FormatOrString
... a_n’. However, ‘fmt(s)’ is equivalent to ‘s’ (so no %-expansion
takes place). */

inline void formatHelper(boost::format & f)
template<class F>
inline void formatHelper(F & f)
{
}

template<typename T, typename... Args>
inline void formatHelper(boost::format & f, const T & x, const Args & ... args)
template<class F, typename T, typename... Args>
inline void formatHelper(F & f, const T & x, const Args & ... args)
{
formatHelper(f % x, args...);
}
10 changes: 1 addition & 9 deletions src/libutil/util.hh
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

#include "types.hh"
#include "logging.hh"
#include "ansicolor.hh"

#include <sys/types.h>
#include <sys/stat.h>
@@ -446,15 +447,6 @@ std::string shellEscape(const std::string & s);
void ignoreException();


/* Some ANSI escape sequences. */
#define ANSI_NORMAL "\e[0m"
#define ANSI_BOLD "\e[1m"
#define ANSI_FAINT "\e[2m"
#define ANSI_RED "\e[31;1m"
#define ANSI_GREEN "\e[32;1m"
#define ANSI_YELLOW "\e[33;1m"
#define ANSI_BLUE "\e[34;1m"


/* Tree formatting. */
constexpr char treeConn[] = "├───";