;;; create-license.el --- Conveniently create license files -*- lexical-binding: t; -*- ;; Copyright (C) 2024 Tristan Riehs ;; Author: Tristan Riehs ;; Keywords: convenience license ;; Maintainer: Tristan Riehs ;; URL: https://tristanriehs.fr/git/create-license ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; This packages aims at providing a convenient way of creating license ;; files. The core command is `create-license', which you can invoke ;; interactively using M-x `create-license'. ;; Before using this package, you have to download the licenses listed ;; in `create-license-common' using M-x ;; `create-license-download-common'. The licenses are stored in the ;; directory `create-license-directory'. When a license is copied, the ;; new file is named according to the content if ;; `create-license-file-name'. ;;; Code: (defgroup create-license nil "Conveniently create license files." :group 'emacs :prefix "create-license-") (defcustom create-license-file-name "COPYING" "The name of the license file." :group 'create-license :type 'string :safe 'stringp) (defcustom create-license-directory (file-name-as-directory (expand-file-name "licenses" user-emacs-directory)) "Directory where licenses are stored. `create-license' ignores files in this directory whose name start by a dot." :group 'create-license :type 'string) (defun create-license--dired-update () "Revert the current buffer if it is a `dired' buffer." (when (eq major-mode 'dired-mode) (revert-buffer))) (defcustom create-license-hook '(create-license--dired-update) "Hook run after `create-license'. Functions in this hook are called with no arguments." :group 'create-license :type 'hook) (defcustom create-license-common '(("GPL3" . "https://www.gnu.org/licenses/gpl-3.0.txt") ("GPL2" . "https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt") ("Apache2" . "https://www.apache.org/licenses/LICENSE-2.0.txt") ("MPL2" . "https://www.mozilla.org/media/MPL/2.0/index.f75d2927d3c1.txt") ("CC-BY" . "https://creativecommons.org/licenses/by/4.0/legalcode.txt") ("CC-BY-SA" . "https://creativecommons.org/licenses/by-sa/4.0/legalcode.txt") ("FDL" . "https://www.gnu.org/licenses/fdl-1.3.txt")) "Common known licenses. Each member of this list is of the form (NAME . URL)." :group 'create-license :type '(list (cons string string))) (defvar create-license--hist nil "History for `create-license'.") ;;;###autoload (defun create-license (dir name) "Copy the license NAME in DIR. The destination file name under DIR is given by `create-license-file-name'." (interactive (list default-directory (let ((files (directory-files create-license-directory nil "^[^\\.].*"))) (when files (completing-read "License: " files nil 'require-match nil 'create-license--hist (car create-license--hist)))))) (if name (progn (copy-file (expand-file-name name create-license-directory) (expand-file-name create-license-file-name dir)) (run-hooks 'create-license-hook)) (message "No license found in \"%s\", you may want to run \ `create-license-download-common'" create-license-directory))) ;;;###autoload (defun create-license-download-common () "Download licenses listed in `create-license-common'." (interactive) (require 'url-handlers) (make-directory create-license-directory t) (dolist (license create-license-common) (url-copy-file (cdr license) (expand-file-name (car license) create-license-directory)))) (provide 'create-license) ;;; create-license.el ends here