Codebase list golang-github-kyoh86-xdg / fresh-snapshots/main
fresh-snapshots/main

Tree @fresh-snapshots/main (Download .tar.gz)

# xdg

DEPRECATED: we can use "os.UserXXXDir" instead of this package.

Light weight helper functions in golang to get config,
data, cache and some user directories according to
the [XDG Base Directory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) and XDG User Directory Specification.

[![PkgGoDev](https://pkg.go.dev/badge/kyoh86/xdg)](https://pkg.go.dev/kyoh86/xdg)
[![Go Report Card](https://goreportcard.com/badge/github.com/kyoh86/xdg)](https://goreportcard.com/report/github.com/kyoh86/xdg)
[![Coverage Status](https://img.shields.io/codecov/c/github/kyoh86/xdg.svg)](https://codecov.io/gh/kyoh86/xdg)
[![Release](https://github.com/kyoh86/xdg/workflows/Release/badge.svg)](https://github.com/kyoh86/xdg/releases)

## Install

```console
$ go get github.com/kyoh86/xdg
```

## Usage

For example:

```go
package main

import (
	"fmt"
	"os"
	"strings"

	"github.com/kyoh86/xdg"
)

func main() {
	fmt.Println("ConfigHome() will get a user level configuration directory path: ", xdg.ConfigHome())

	os.Setenv(xdg.ConfigHomeEnv, "/.config")
	fmt.Println("...And `XDG_CONFIG_HOME` envar will be supported: ", xdg.ConfigHome())

	fmt.Println(strings.Repeat("-", 48))

	fmt.Println("ConfigDirs() will get system level configuration directories: ", xdg.ConfigDirs())

	os.Setenv(xdg.ConfigDirsEnv, "/.config:/.config2")
	fmt.Println("...And `XDG_CONFIG_DIRS` envar will be able to change it:", xdg.ConfigDirs())

	fmt.Println(strings.Repeat("-", 48))

	fmt.Println("DataHome() will get a user level data directory path: ", xdg.DataHome())

	os.Setenv(xdg.DataHomeEnv, "/.data")
	fmt.Println("...And `XDG_DATA_HOME` envar will be supported: ", xdg.DataHome())

	fmt.Println(strings.Repeat("-", 48))

	fmt.Println("DataDirs() will get system level data directories: ", xdg.DataDirs())

	os.Setenv(xdg.DataDirsEnv, "/.data:/.data2")
	fmt.Println("...And `XDG_DATA_DIRS` envar will be able to change it:", xdg.DataDirs())

	fmt.Println(strings.Repeat("-", 48))

	fmt.Println("CacheHome() will get a cache directory path: ", xdg.CacheHome())

	os.Setenv(xdg.CacheHomeEnv, "/.cache")
	fmt.Println("...And `XDG_CACHE_HOME` envar will be supported: ", xdg.CacheHome())

	fmt.Println(strings.Repeat("-", 48))

	fmt.Println("RuntimeDir() will get a runtime directory path: ", xdg.RuntimeDir())

	os.Setenv(xdg.RuntimeDirEnv, "/.runtime")
	fmt.Println("...And `XDG_RUNTIME_DIR` envar will be supported: ", xdg.RuntimeDir())

	fmt.Println(strings.Repeat("-", 48))

	fmt.Println("DesktopDir() will get a desktop directory path: ", xdg.DesktopDir())
	os.Setenv(xdg.DesktopDirEnv, "/.Desktop")
	fmt.Println("...And `XDG_DESKTOP_DIR` envar will be supported: ", xdg.DesktopDir())

	fmt.Println("DownloadDir() will get a download directory path: ", xdg.DownloadDir())
	os.Setenv(xdg.DownloadDirEnv, "/.Download ")
	fmt.Println("...And `XDG_Download _DIR` envar will be supported: ", xdg.DownloadDir())

	fmt.Println("DocumentsDir() will get a documents directory path: ", xdg.DocumentsDir())
	os.Setenv(xdg.DocumentsDirEnv, "/.Documents ")
	fmt.Println("...And `XDG_Documents _DIR` envar will be supported: ", xdg.DocumentsDir())

	fmt.Println("MusicDir() will get a music directory path: ", xdg.MusicDir())
	os.Setenv(xdg.MusicDirEnv, "/.Music ")
	fmt.Println("...And `XDG_Music _DIR` envar will be supported: ", xdg.MusicDir())

	fmt.Println("PicturesDir() will get a pictures directory path: ", xdg.PicturesDir())
	os.Setenv(xdg.PicturesDirEnv, "/.Pictures ")
	fmt.Println("...And `XDG_Pictures _DIR` envar will be supported: ", xdg.PicturesDir())

	fmt.Println("VideosDir() will get a videos directory path: ", xdg.VideosDir())
	os.Setenv(xdg.VideosDirEnv, "/.Videos ")
	fmt.Println("...And `XDG_Videos _DIR` envar will be supported: ", xdg.VideosDir())

	fmt.Println("TemplatesDir() will get a templates directory path: ", xdg.TemplatesDir())
	os.Setenv(xdg.TemplatesDirEnv, "/.Templates ")
	fmt.Println("...And `XDG_Templates _DIR` envar will be supported: ", xdg.TemplatesDir())

	fmt.Println("PublicShareDir() will get a public share directory path: ", xdg.PublicShareDir())
	os.Setenv(xdg.PublicShareDirEnv, "/.PublicShare ")
	fmt.Println("...And `XDG_PublicShare_DIR` envar will be supported: ", xdg.PublicShareDir())
}
```

And you can run sample easily.

```console
$ make sample
go run -tags=sample ./cmd/xdg-sample/main.go
ConfigHome() will get a user level configuration directory path:  /home/kyoh86/.config/
...And `XDG_CONFIG_HOME` envar will be supported:  /.config
------------------------------------------------
ConfigDirs() will get system level configuration directories:  [/etc/xdg]
...And `XDG_CONFIG_DIRS` envar will be able to change it: [/.config /.config2]
------------------------------------------------
DataHome() will get a user level data directory path:  /home/kyoh86/.local/share
...And `XDG_DATA_HOME` envar will be supported:  /.data
------------------------------------------------
DataDirs() will get system level data directories:  [/usr/local/share /usr/share]
...And `XDG_DATA_DIRS` envar will be able to change it: [/.data /.data2]
------------------------------------------------
CacheHome() will get a cache directory path:  /home/kyoh86/.cache
...And `XDG_CACHE_HOME` envar will be supported:  /.cache
------------------------------------------------
RuntimeDir() will get a runtime directory path:  /run/user/1000
...And `XDG_RUNTIME_DIR` envar will be supported:  /.runtime
------------------------------------------------
DesktopDir() will get a desktop directory path:  /home/kyoh86/Desktop
...And `XDG_DESKTOP_DIR` envar will be supported:  /.Desktop
DownloadDir() will get a download directory path:  /home/kyoh86/Downloads
...And `XDG_Download _DIR` envar will be supported:  /.Download 
DocumentsDir() will get a documents directory path:  /home/kyoh86/Documents
...And `XDG_Documents _DIR` envar will be supported:  /.Documents 
MusicDir() will get a music directory path:  /home/kyoh86/Music
...And `XDG_Music _DIR` envar will be supported:  /.Music 
PicturesDir() will get a pictures directory path:  /home/kyoh86/Pictures
...And `XDG_Pictures _DIR` envar will be supported:  /.Pictures 
VideosDir() will get a videos directory path:  /home/kyoh86/Videos
...And `XDG_Videos _DIR` envar will be supported:  /.Videos 
TemplatesDir() will get a templates directory path:  /home/kyoh86/Templates
...And `XDG_Templates _DIR` envar will be supported:  /.Templates 
PublicShareDir() will get a public share directory path:  /home/kyoh86/Public
...And `XDG_PublicShare_DIR` envar will be supported:  /.PublicShare 
```

## Default path

The package defines defaults for XDG directories.

#### XDG Base Directory

| XDG Variable    | Mac OS                          | Windows                              | Others                           |
| :---            | :-----                          | :---                                 | :---                             |
| XDG_CONFIG_HOME | `~/Library/Preferences`         | `%LOCALAPPDATA%`                     | `~/.config`                      |
| XDG_CONFIG_DIRS | `/Library/Preferences`          | `%PROGRAMDATA%`                      | `/etc/xdg`                       |
| XDG_DATA_HOME   | `~/Library/Application Support` | `%LOCALAPPDATA%`                     | `~/.local/share`                 |
| XDG_DATA_DIRS   | `/Library/Application Support`  | `%APPDATA%\Roaming`, `%PROGRAMDATA%` | `/usr/local/share`, `/usr/share` |
| XDG_CACHE_HOME  | `~/Library/Caches`              | `%LOCALAPPDATA%\cache`               | `~/.cache`                       |
| XDG_RUNTIME_DIR | `~/Library/Application Support` | `%LOCALAPPDATA%`                     | `/run/user/UID`                  |

#### XDG User Directory

| XDG Variable        | Mac OS        | Windows                   | Others        |
| :---                | :-----        | :---                      | :---          |
| XDG_DESKTOP_DIR     | `~/Desktop`   | `%USERPROFILE%/Desktop`   | `~/Desktop`   |
| XDG_DOWNLOAD_DIR    | `~/Downloads` | `%USERPROFILE%/Downloads` | `~/Downloads` |
| XDG_DOCUMENTS_DIR   | `~/Documents` | `%USERPROFILE%/Documents` | `~/Documents` |
| XDG_PICTURES_DIR    | `~/Pictures`  | `%USERPROFILE%/Pictures`  | `~/Pictures`  |
| XDG_MUSIC_DIR       | `~/Music`     | `%USERPROFILE%/Music`     | `~/Music`     |
| XDG_VIDEOS_DIR      | `~/Movies`    | `%USERPROFILE%/Videos`    | `~/Videos`    |
| XDG_TEMPLATES_DIR   | `~/Templates` | `%USERPROFILE%/Templates` | `~/Templates` |
| XDG_PUBLICSHARE_DIR | `~/Public`    | `%PUBLIC%`                | `~/Public`    |

# LICENSE

[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg)](http://www.opensource.org/licenses/MIT)

This is distributed under the [MIT License](http://www.opensource.org/licenses/MIT).