GithubHelp home page GithubHelp logo

cfgdiff's Introduction

cfgdiff -- diff(1) all your configuration files

Why?

Ever tried comparing MySQL's my.cnf from a Debian and a Gentoo machine with diff(1) without going crazy?

diff(1) is an awesome tool, you use it (or similar implementations like git diff, svn diff etc) every day when dealing with code. But configuration files aren't code. Indentation often does not matter (yeah, there is diff -w and yeah, people use YAML for configs), order of settings does not matter and comments are just beautiful noise.

How?

cfgdiff will try to parse your configuration files, fetching all the relevant keys and values from them and then pretty-printing them in the original format. These results are then diffed and the diff is shown to you.

What?

cfgdiff currently supports the following formats:

  • INI using Python's ConfigParser library
  • JSON using Python's JSON library
  • YAML if the Python YAML library is installed
  • XML if the Python lxml library is installed

cfgdiff's People

Contributors

dependabot[bot] avatar evgeni avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cfgdiff's Issues

Perl module

Cool stuff, just ran across this in Mattias's weekly newsletter. Any chance cfgdiff will be available as a perl mod at some point?

Styling config.

My idea for that is, if you have code which understand config structure and can "sort" or whatever you can make another sub-tool for writing configs after "styling"/sorting. It could help not only to diff in nice way but also to keep the same "style" in different config files for the same application.

Sub-idea could be to make this package as "cfgtools" and inside could be tools like cfgdiff, cfgstyle, cfglint (maybe in the future). What do you think?

error when running setup

I got this error when running setup

user@laptop ~/cgdiff/cfgdiff-master
$ python ./setup.py
/usr/lib/python2.7/site-packages/setuptools/dist.py:342: UserWarning: The version specified ('0.1-git') is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.
"details." % self.metadata.version
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --help

error: no commands supplied

treat absent files as empty

From man diff:

   -N, --new-file
          treat absent files as empty

Example:

% mkdir /tmp/foo/a /tmp/foo/b
% echo bar > /tmp/foo/a/foo
% diff -Nrwu /tmp/foo/a /tmp/foo/b
diff -Nrwu /tmp/foo/a /tmp/foo/b
--- /tmp/foo/a  2014-02-05 08:25:12.861979159 +0100
+++ /tmp/foo/b  1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-r bar
% diff -rwu /tmp/foo/a /tmp/foo/b
Only in /tmp/foo/a: foo

Works also for files that are only in b, obviously.

How to install?

Hey! How about adding instructions on how to easily install this in the README?

(I'm a MacOSX user and a homebrew package would be ๐Ÿฅ‡)

properly handle files that are not parseable by the backends

If one passes a malformed file (or an empty one), most of the parsers will die with a backtrace, instead of producing anything useful:

Traceback (most recent call last):
  File "./cfgdiff", line 180, in <module>
    toini = cls(tofile)
  File "./cfgdiff", line 91, in __init__
    self.parse()
  File "./cfgdiff", line 125, in parse
    self.config = lxml.etree.parse(self.filename, parser)
  File "lxml.etree.pyx", line 3197, in lxml.etree.parse (src/lxml/lxml.etree.c:64726)
  File "parser.pxi", line 1571, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:92363)
  File "parser.pxi", line 1600, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:92647)
  File "parser.pxi", line 1500, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:91710)
  File "parser.pxi", line 1047, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:88610)
  File "parser.pxi", line 577, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:84019)
  File "parser.pxi", line 676, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:85122)
  File "parser.pxi", line 616, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:84445)
lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1

Handling empty files is a matter of try/except, but we should also produce an useful message to the user if the file is actually malformed for us (e.g. MySQL just fine handles a my.cnf with two [mysqld] sections by merging them, configparser chokes on those).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.