Human Archive Format
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
examples
out
src/archive
test
.gitignore
LICENSE
Makefile
README.md
dub.sdl
harmain.d
test_command_line_tool.d

README.md

HAR - Human Archive Format

A human readable-writeable format for representing multiple files, named after the popular tar format. The format is meant to be simple, intuitive, and copy-pasteable allowing a single block of text (like a forum post) to represent multiple files.

Example:

--- hello.txt
Hello, this is a file currently archived in a HAR file.

--- other.txt
This is another file also archived within the same HAR file.

--- yetanother.txt
This is yet another file also archived within the same HAR file.

--- dir1/
--- dir2/

Format

<delimiter> <single-space> <filename> (<one-or-more-spaces> <property>)* [<extra-delimiters>]
<contents>
<delimiter> <single-space> <filename> (<one-or-more-spaces> <property>)* [<extra-delimiters>]
<contents>
...

What HAR doesn't do

  • Does not support binary files (use tar for that, har is meant for humans)

Details

Directory Separators

HAR only supports the foward slash / as a directory separator, regardless of platform.

Correct:

--- foo/bar.txt

Incorrect:

--- foo\bar.txt

Filenames with Spaces

Use quotes if the filename contains whitespace:

--- "i like spaces/in my filenames"

Note that quoted filenames do not support standard escape sequences (i.e. \\ or \"). If you want to include a special character in your filename, include it. The tradeof is that HAR does not support filenames with quotes or newlines, but any other character will work.

Properties

The format allows files to specify properties, i.e.

--- file1.txt owner=root
A file owed by root

--- file2.txt permissions=0772
A file with custom permissions

Properties may only be separated by 1 or more space characters (ascii 0x20).

Empty Directories

Use a trailing slash in the filename to create an empty directory.

--- mydir/
--- anotherdir/ owner=root
--- dir3/ readonly
--- "dir with spaces/"

Note that this is only necessary for empty directories. All the parent directories for a file do not need to be explicitly declared. i.e. if you have a HAR file like this:

--- foo/bar/baz.d
My cool file

you DO NOT need to include it's parent directories:

--- foo/
--- foo/bar/

Obvious File Breaks

Extra deliimters can be used after a file to help distinguish where files begin/end, i.e.

--- myfile.txt -----------------------------------------
This is my file
...lots of text

--- anotherfile.txt -----------------------------------------
This is another file.  The extra '-' characters after the filename
should make it easier to spot the end/beginning of files.

The only requirement is that these extra characters start with the first character in the delimiter. For example, the following file has an odd delimiter #!ab$, so as soon as a # character is found, the rest of the line is ignored, i.e.

#!ab$ myfile.txt #0a09fa00asdfj

Custom Delimiters

The delimiter is used to mark the end of a file and the beginning of a new one. The standard delimiter is ---, however, any set of characters not containing a spaces or newlines can be used as a delimiter. Also, since a HAR file always begins with a delimiter, there's no need to declare what your delimiter is, simply use it and the parser will pull it from the first line, i.e.

### showCustomBoundary.txt
This file uses a different type of delimiter.
### another.txt
Another file to show that the previous file boundary has worked correctly.

This being said, using the standard delimiter is encouraged to promote uniformity and familiarity with the format.

Newlines

All standard newlines sequences are supported, \n, \r\n or \r.

Which Newlines belong to the file?

All newline characters belong to the line they are terminating. This means that all non-empty files will end with a newline. This rule makes processing har files simpler, because without it, determining which newlines belong to the file would require looking ahead at the next line.

Example:

--- empty_file.txt
--- one_newline_file.txt
this file has one newline
--- two_newlines_file.txt
this file has two newlines

--- another_empty_file.txt

empty_file.txt

EOF

one_newline_file.txt

this file has one newline\n
EOF

two_newlines_file.txt

this file has two newlines\n
\n
EOF

Note that even though this mechanism makes it simpler to process HAR files, it comes at the cost of not being able to represent files without newlines at the end of the file. Since HAR is not meant to support everything (i.e. binary files), not supporting this small number of use cases is a sensible tradeoff for the added simplicity.

Using ".."

HAR doesn't support using .. to create files in parent directories. This guarantees that if you extract a HAR file, it can only create files in the given output directory, it cannot extract files outside of it.

Absolute filenames

Absolute filenames aren't supported, i.e.

--- /myfile.txt
This isn't valid

Double slashes

Double slashes are considered an error, i.e.

--- foo//bar.txt