yannstatic/static/2022/11/02/PACMAN_gestionnaire_de_paquets_archlinux.html

2539 lines
220 KiB
HTML
Raw Normal View History

2024-10-31 20:18:37 +01:00
<!DOCTYPE html><html lang="fr">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>PACMAN gestionnaire de paquets archlinux - YannStatic</title>
<meta name="description" content="Présentation de pacman Configuration Options globales Dépôts Utilisation Synchronisation de la base de paquets Installati...">
<link rel="canonical" href="https://static.rnmkcy.eu/2022/11/02/PACMAN_gestionnaire_de_paquets_archlinux.html"><link rel="alternate" type="application/rss+xml" title="YannStatic" href="/feed.xml">
<!-- - include head/favicon.html - -->
<link rel="shortcut icon" type="image/png" href="/assets/favicon/favicon.png"><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" ><!-- start custom head snippets --><link rel="stylesheet" href="/assets/css/expand.css">
<!-- end custom head snippets --><script>(function() {
window.isArray = function(val) {
return Object.prototype.toString.call(val) === '[object Array]';
};
window.isString = function(val) {
return typeof val === 'string';
};
window.hasEvent = function(event) {
return 'on'.concat(event) in window.document;
};
window.isOverallScroller = function(node) {
return node === document.documentElement || node === document.body || node === window;
};
window.isFormElement = function(node) {
var tagName = node.tagName;
return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
};
window.pageLoad = (function () {
var loaded = false, cbs = [];
window.addEventListener('load', function () {
var i;
loaded = true;
if (cbs.length > 0) {
for (i = 0; i < cbs.length; i++) {
cbs[i]();
}
}
});
return {
then: function(cb) {
cb && (loaded ? cb() : (cbs.push(cb)));
}
};
})();
})();
(function() {
window.throttle = function(func, wait) {
var args, result, thisArg, timeoutId, lastCalled = 0;
function trailingCall() {
lastCalled = new Date;
timeoutId = null;
result = func.apply(thisArg, args);
}
return function() {
var now = new Date,
remaining = wait - (now - lastCalled);
args = arguments;
thisArg = this;
if (remaining <= 0) {
clearTimeout(timeoutId);
timeoutId = null;
lastCalled = now;
result = func.apply(thisArg, args);
} else if (!timeoutId) {
timeoutId = setTimeout(trailingCall, remaining);
}
return result;
};
};
})();
(function() {
var Set = (function() {
var add = function(item) {
var i, data = this._data;
for (i = 0; i < data.length; i++) {
if (data[i] === item) {
return;
}
}
this.size ++;
data.push(item);
return data;
};
var Set = function(data) {
this.size = 0;
this._data = [];
var i;
if (data.length > 0) {
for (i = 0; i < data.length; i++) {
add.call(this, data[i]);
}
}
};
Set.prototype.add = add;
Set.prototype.get = function(index) { return this._data[index]; };
Set.prototype.has = function(item) {
var i, data = this._data;
for (i = 0; i < data.length; i++) {
if (this.get(i) === item) {
return true;
}
}
return false;
};
Set.prototype.is = function(map) {
if (map._data.length !== this._data.length) { return false; }
var i, j, flag, tData = this._data, mData = map._data;
for (i = 0; i < tData.length; i++) {
for (flag = false, j = 0; j < mData.length; j++) {
if (tData[i] === mData[j]) {
flag = true;
break;
}
}
if (!flag) { return false; }
}
return true;
};
Set.prototype.values = function() {
return this._data;
};
return Set;
})();
window.Lazyload = (function(doc) {
var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
var createNode = function(name, attrs) {
var node = doc.createElement(name), attr;
for (attr in attrs) {
if (attrs.hasOwnProperty(attr)) {
node.setAttribute(attr, attrs[attr]);
}
}
return node;
};
var end = function(type, url) {
var s, q, qi, cbs, i, j, cur, val, flag;
if (type === 'js' || type ==='css') {
s = sources[type], q = queue[type];
s[url] = true;
for (i = 0; i < q.length; i++) {
cur = q[i];
if (cur.urls.has(url)) {
qi = cur, val = qi.urls.values();
qi && (cbs = qi.callbacks);
for (flag = true, j = 0; j < val.length; j++) {
cur = val[j];
if (!s[cur]) {
flag = false;
}
}
if (flag && cbs && cbs.length > 0) {
for (j = 0; j < cbs.length; j++) {
cbs[j].call(context);
}
qi.load = true;
}
}
}
}
};
var load = function(type, urls, callback) {
var s, q, qi, node, i, cur,
_urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
if (type === 'js' || type ==='css') {
s = sources[type], q = queue[type];
for (i = 0; i < q.length; i++) {
cur = q[i];
if (_urls.is(cur.urls)) {
qi = cur;
break;
}
}
val = _urls.values();
if (qi) {
callback && (qi.load || qi.callbacks.push(callback));
callback && (qi.load && callback());
} else {
q.push({
urls: _urls,
callbacks: callback ? [callback] : [],
load: false
});
for (i = 0; i < val.length; i++) {
node = null, url = val[i];
if (s[url] === undefined) {
(type === 'js' ) && (node = createNode('script', { src: url }));
(type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
if (node) {
node.onload = (function(type, url) {
return function() {
end(type, url);
};
})(type, url);
(doc.head || doc.body).appendChild(node);
s[url] = false;
}
}
}
}
}
};
return {
js: function(url, callback) {
load('js', url, callback);
},
css: function(url, callback) {
load('css', url, callback);
}
};
})(this.document);
})();
</script><script>
(function() {
var TEXT_VARIABLES = {
version: '2.2.6',
sources: {
font_awesome: 'https://use.fontawesome.com/releases/v5.0.13/css/all.css',
jquery: '/assets/js/jquery.min.js',
leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
gitalk: {
js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
},
valine: 'https://unpkg.com/valine/dist/Valine.min.js'
},
site: {
toc: {
selectors: 'h1,h2,h3'
}
},
paths: {
search_js: '/assets/search.js'
}
};
window.TEXT_VARIABLES = TEXT_VARIABLES;
})();
</script>
</head>
<body>
<div class="root" data-is-touch="false">
<div class="layout--page js-page-root"><!----><div class="page__main js-page-main page__viewport hide-footer has-aside has-aside cell cell--auto">
<div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
<div class="header__title">
<div class="header__brand"><svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="478.9473684210526" viewBox="0, 0, 400,478.9473684210526"><g id="svgg"><path id="path0" d="M308.400 56.805 C 306.970 56.966,303.280 57.385,300.200 57.738 C 290.906 58.803,278.299 59.676,269.200 59.887 L 260.600 60.085 259.400 61.171 C 258.010 62.428,256.198 63.600,255.645 63.600 C 255.070 63.600,252.887 65.897,252.598 66.806 C 252.460 67.243,252.206 67.600,252.034 67.600 C 251.397 67.600,247.206 71.509,247.202 72.107 C 247.201 72.275,246.390 73.190,245.400 74.138 C 243.961 75.517,243.598 76.137,243.592 77.231 C 243.579 79.293,241.785 83.966,240.470 85.364 C 239.176 86.740,238.522 88.365,237.991 91.521 C 237.631 93.665,236.114 97.200,235.554 97.200 C 234.938 97.200,232.737 102.354,232.450 104.472 C 232.158 106.625,230.879 109.226,229.535 110.400 C 228.933 110.926,228.171 113.162,226.434 119.500 C 226.178 120.435,225.795 121.200,225.584 121.200 C 225.373 121.200,225.200 121.476,225.200 121.813 C 225.200 122.149,224.885 122.541,224.500 122.683 C 223.606 123.013,223.214 123.593,223.204 124.600 C 223.183 126.555,220.763 132.911,219.410 134.562 C 218.443 135.742,217.876 136.956,217.599 138.440 C 217.041 141.424,215.177 146.434,214.532 146.681 C 214.240 146.794,214.000 147.055,214.000 147.261 C 214.000 147.467,213.550 148.086,213.000 148.636 C 212.450 149.186,212.000 149.893,212.000 150.208 C 212.000 151.386,208.441 154.450,207.597 153.998 C 206.319 153.315,204.913 150.379,204.633 147.811 C 204.365 145.357,202.848 142.147,201.759 141.729 C 200.967 141.425,199.200 137.451,199.200 135.974 C 199.200 134.629,198.435 133.224,196.660 131.311 C 195.363 129.913,194.572 128.123,193.870 125.000 C 193.623 123.900,193.236 122.793,193.010 122.540 C 190.863 120.133,190.147 118.880,188.978 115.481 C 188.100 112.928,187.151 111.003,186.254 109.955 C 185.358 108.908,184.518 107.204,183.847 105.073 C 183.280 103.273,182.497 101.329,182.108 100.753 C 181.719 100.177,180.904 98.997,180.298 98.131 C 179.693 97.265,178.939 95.576,178.624 94.378 C 178.041 92.159,177.125 90.326,175.023 87.168 C 174.375 86.196,173.619 84.539,173.342 83.486 C 172.800 81.429,171.529 79.567,170.131 78.785 C 169.654 78.517,168.697 77.511,168.006 76.549 C 167.316 75.587,166.594 74.800,166.402 74.800 C 166.210 74.800,164.869 73.633,163.421 72.206 C 160.103 68.936,161.107 69.109,146.550 69.301 C 133.437 69.474,128.581 70.162,126.618 72.124 C 126.248 72.495,125.462 72.904,124.872 73.033 C 124.282 73.163,123.088 73.536,122.219 73.863 C 121.349 74.191,119.028 74.638,117.061 74.858 C 113.514 75.254,109.970 76.350,108.782 77.419 C 107.652 78.436,100.146 80.400,97.388 80.400 C 95.775 80.400,93.167 81.360,91.200 82.679 C 90.430 83.195,89.113 83.804,88.274 84.031 C 85.875 84.681,78.799 90.910,74.400 96.243 L 73.400 97.456 73.455 106.028 C 73.526 117.055,74.527 121.238,77.820 124.263 C 78.919 125.273,80.400 127.902,80.400 128.842 C 80.400 129.202,81.075 130.256,81.900 131.186 C 83.563 133.059,85.497 136.346,86.039 138.216 C 86.233 138.886,87.203 140.207,88.196 141.153 C 89.188 142.098,90.000 143.104,90.000 143.388 C 90.000 144.337,92.129 148.594,92.869 149.123 C 93.271 149.410,93.600 149.831,93.600 150.059 C 93.600 150.286,93.932 150.771,94.337 151.136 C 94.743 151.501,95.598 153.004,96.237 154.475 C 96.877 155.947,97.760 157.351,98.200 157.596 C 98.640 157.841,99.900 159.943,101.000 162.267 C 102.207 164.817,103.327 166.644,103.825 166.876 C 104.278 167.087,105.065 168.101,105.573 169.130 C 107.658 173.348,108.097 174.093,110.006 176.647 C 111.103 178.114,112.000 179.725,112.000 180.227 C 112.000 181.048,113.425 183.163,114.678 184.200 C 115.295 184.711,117.396 188.733,117.720 190.022 C 117.855 190.562,118.603 191.633,119.381 192.402 C 120.160 193.171,121.496 195.258,122.351 197.039 C 123.206 198.820,124.167 200.378,124.487 200.501 C 124.807 200.624,125.953 202.496,127.034 204.662 C 128.114 206.828,129.676 209.299,130.505 210.153 C 131.333 211.007,132.124 212.177,132.262 212.753 C 132.618 214.239,134.291 217.048,136.288 219.5
" href="/">YannStatic</a></div><!--<button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button>--><!-- <li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li> -->
<!-- Champ de recherche -->
<div id="searchbox" class="search search--dark" style="visibility: visible">
<div class="main">
<div class="search__header"></div>
<div class="search-bar">
<div class="search-box js-search-box">
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
<input id="search-input" type="text" />
<!-- <div class="search-box__icon-clear js-icon-clear">
<a><i class="fas fa-times"></i></a>
</div> -->
</div>
</div>
</div>
</div>
<!-- Script pointing to search-script.js -->
<script>/*!
* Simple-Jekyll-Search
* Copyright 2015-2020, Christian Fei
* Licensed under the MIT License.
*/
(function(){
'use strict'
var _$Templater_7 = {
compile: compile,
setOptions: setOptions
}
const options = {}
options.pattern = /\{(.*?)\}/g
options.template = ''
options.middleware = function () {}
function setOptions (_options) {
options.pattern = _options.pattern || options.pattern
options.template = _options.template || options.template
if (typeof _options.middleware === 'function') {
options.middleware = _options.middleware
}
}
function compile (data) {
return options.template.replace(options.pattern, function (match, prop) {
const value = options.middleware(prop, data[prop], options.template)
if (typeof value !== 'undefined') {
return value
}
return data[prop] || match
})
}
'use strict';
function fuzzysearch (needle, haystack) {
var tlen = haystack.length;
var qlen = needle.length;
if (qlen > tlen) {
return false;
}
if (qlen === tlen) {
return needle === haystack;
}
outer: for (var i = 0, j = 0; i < qlen; i++) {
var nch = needle.charCodeAt(i);
while (j < tlen) {
if (haystack.charCodeAt(j++) === nch) {
continue outer;
}
}
return false;
}
return true;
}
var _$fuzzysearch_1 = fuzzysearch;
'use strict'
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
function FuzzySearchStrategy () {
this.matches = function (string, crit) {
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
}
}
'use strict'
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
function LiteralSearchStrategy () {
this.matches = function (str, crit) {
if (!str) return false
str = str.trim().toLowerCase()
crit = crit.trim().toLowerCase()
return crit.split(' ').filter(function (word) {
return str.indexOf(word) >= 0
}).length === crit.split(' ').length
}
}
'use strict'
var _$Repository_4 = {
put: put,
clear: clear,
search: search,
setOptions: __setOptions_4
}
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
function NoSort () {
return 0
}
const data = []
let opt = {}
opt.fuzzy = false
opt.limit = 10
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = NoSort
opt.exclude = []
function put (data) {
if (isObject(data)) {
return addObject(data)
}
if (isArray(data)) {
return addArray(data)
}
return undefined
}
function clear () {
data.length = 0
return data
}
function isObject (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
}
function addObject (_data) {
data.push(_data)
return data
}
function addArray (_data) {
const added = []
clear()
for (let i = 0, len = _data.length; i < len; i++) {
if (isObject(_data[i])) {
added.push(addObject(_data[i]))
}
}
return added
}
function search (crit) {
if (!crit) {
return []
}
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
}
function __setOptions_4 (_opt) {
opt = _opt || {}
opt.fuzzy = _opt.fuzzy || false
opt.limit = _opt.limit || 10
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = _opt.sort || NoSort
opt.exclude = _opt.exclude || []
}
function findMatches (data, crit, strategy, opt) {
const matches = []
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
const match = findMatchesInObject(data[i], crit, strategy, opt)
if (match) {
matches.push(match)
}
}
return matches
}
function findMatchesInObject (obj, crit, strategy, opt) {
for (const key in obj) {
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
return obj
}
}
}
function isExcluded (term, excludedTerms) {
for (let i = 0, len = excludedTerms.length; i < len; i++) {
const excludedTerm = excludedTerms[i]
if (new RegExp(excludedTerm).test(term)) {
return true
}
}
return false
}
/* globals ActiveXObject:false */
'use strict'
var _$JSONLoader_2 = {
load: load
}
function load (location, callback) {
const xhr = getXHR()
xhr.open('GET', location, true)
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
xhr.send()
}
function createStateChangeListener (xhr, callback) {
return function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
callback(null, JSON.parse(xhr.responseText))
} catch (err) {
callback(err, null)
}
}
}
}
function getXHR () {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
}
'use strict'
var _$OptionsValidator_3 = function OptionsValidator (params) {
if (!validateParams(params)) {
throw new Error('-- OptionsValidator: required options missing')
}
if (!(this instanceof OptionsValidator)) {
return new OptionsValidator(params)
}
const requiredOptions = params.required
this.getRequiredOptions = function () {
return requiredOptions
}
this.validate = function (parameters) {
const errors = []
requiredOptions.forEach(function (requiredOptionName) {
if (typeof parameters[requiredOptionName] === 'undefined') {
errors.push(requiredOptionName)
}
})
return errors
}
function validateParams (params) {
if (!params) {
return false
}
return typeof params.required !== 'undefined' && params.required instanceof Array
}
}
'use strict'
var _$utils_9 = {
merge: merge,
isJSON: isJSON
}
function merge (defaultParams, mergeParams) {
const mergedOptions = {}
for (const option in defaultParams) {
mergedOptions[option] = defaultParams[option]
if (typeof mergeParams[option] !== 'undefined') {
mergedOptions[option] = mergeParams[option]
}
}
return mergedOptions
}
function isJSON (json) {
try {
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
return true
}
return false
} catch (err) {
return false
}
}
var _$src_8 = {};
(function (window) {
'use strict'
let options = {
searchInput: null,
resultsContainer: null,
json: [],
success: Function.prototype,
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
templateMiddleware: Function.prototype,
sortMiddleware: function () {
return 0
},
noResultsText: 'No results found',
limit: 10,
fuzzy: false,
debounceTime: null,
exclude: []
}
let debounceTimerHandle
const debounce = function (func, delayMillis) {
if (delayMillis) {
clearTimeout(debounceTimerHandle)
debounceTimerHandle = setTimeout(func, delayMillis)
} else {
func.call()
}
}
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
/* removed: const _$Templater_7 = require('./Templater') */;
/* removed: const _$Repository_4 = require('./Repository') */;
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
const optionsValidator = _$OptionsValidator_3({
required: requiredOptions
})
/* removed: const _$utils_9 = require('./utils') */;
window.SimpleJekyllSearch = function (_options) {
const errors = optionsValidator.validate(_options)
if (errors.length > 0) {
throwError('You must specify the following required options: ' + requiredOptions)
}
options = _$utils_9.merge(options, _options)
_$Templater_7.setOptions({
template: options.searchResultTemplate,
middleware: options.templateMiddleware
})
_$Repository_4.setOptions({
fuzzy: options.fuzzy,
limit: options.limit,
sort: options.sortMiddleware,
exclude: options.exclude
})
if (_$utils_9.isJSON(options.json)) {
initWithJSON(options.json)
} else {
initWithURL(options.json)
}
const rv = {
search: search
}
typeof options.success === 'function' && options.success.call(rv)
return rv
}
function initWithJSON (json) {
_$Repository_4.put(json)
registerInput()
}
function initWithURL (url) {
_$JSONLoader_2.load(url, function (err, json) {
if (err) {
throwError('failed to get JSON (' + url + ')')
}
initWithJSON(json)
})
}
function emptyResultsContainer () {
options.resultsContainer.innerHTML = ''
}
function appendToResultsContainer (text) {
options.resultsContainer.innerHTML += text
}
function registerInput () {
options.searchInput.addEventListener('input', function (e) {
if (isWhitelistedKey(e.which)) {
emptyResultsContainer()
debounce(function () { search(e.target.value) }, options.debounceTime)
}
})
}
function search (query) {
if (isValidQuery(query)) {
emptyResultsContainer()
render(_$Repository_4.search(query), query)
}
}
function render (results, query) {
const len = results.length
if (len === 0) {
return appendToResultsContainer(options.noResultsText)
}
for (let i = 0; i < len; i++) {
results[i].query = query
appendToResultsContainer(_$Templater_7.compile(results[i]))
}
}
function isValidQuery (query) {
return query && query.length > 0
}
function isWhitelistedKey (key) {
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
}
function throwError (message) {
throw new Error('SimpleJekyllSearch --- ' + message)
}
})(window)
}());
</script>
<!-- Configuration -->
<script>
SimpleJekyllSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('results-container'),
json: '/search.json',
//searchResultTemplate: '<li><a href="https://static.rnmkcy.eu{url}">{date}&nbsp;{title}</a></li>'
searchResultTemplate: '<li><a href="{url}">{date}&nbsp;{title}</a></li>'
})
</script>
<!-- Fin déclaration champ de recherche --></div><nav class="navigation">
2024-11-28 11:42:23 +01:00
<ul><li class="navigation__item"><a href="/archive.html">Etiquettes</a></li><li class="navigation__item"><a href="/htmldoc.html">Documents</a></li><li class="navigation__item"><a href="/liens_ttrss.html">Liens</a></li><li class="navigation__item"><a href="/syntaxe-markdown.html">Aide</a></li></ul>
2024-10-31 20:18:37 +01:00
</nav></div>
</header>
</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
<div class="col-main cell cell--auto"><!-- start custom main top snippet --><div id="results-container" class="search-result js-search-result"></div><!-- end custom main top snippet -->
<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1 style="color:Tomato;">PACMAN gestionnaire de paquets archlinux</h1></header></div><meta itemprop="headline" content="PACMAN gestionnaire de paquets archlinux"><div class="article__info clearfix"><ul class="left-col menu"><li>
2024-11-08 14:10:33 +01:00
<a class="button button--secondary button--pill button--sm" style="color:#00FFFF" href="/archive.html?tag=archlinux">archlinux</a>
2024-10-31 20:18:37 +01:00
</li></ul><ul class="right-col menu"><li>
<i class="far fa-calendar-alt"></i>&nbsp;<span title="Création" style="color:#FF00FF">&nbsp;2&nbsp;nov.&nbsp;&nbsp;2022</span>
<span title="Modification" style="color:#00FF7F">&nbsp;3&nbsp;déc.&nbsp;&nbsp;2022</span></li></ul></div><meta itemprop="datePublished" content="2022-12-03T00:00:00+01:00">
<meta itemprop="keywords" content="archlinux"><div class="js-article-content">
<div class="layout--article"><!-- start custom article top snippet -->
<style>
#myBtn {
display: none;
position: fixed;
bottom: 10px;
right: 10px;
z-index: 99;
font-size: 12px;
font-weight: bold;
border: none;
outline: none;
background-color: white;
color: black;
cursor: pointer;
padding: 5px;
border-radius: 4px;
}
#myBtn:hover {
background-color: #555;
}
</style>
<button onclick="topFunction()" id="myBtn" title="Haut de page">&#8679;</button>
<script>
//Get the button
var mybutton = document.getElementById("myBtn");
// When the user scrolls down 20px from the top of the document, show the button
window.onscroll = function() {scrollFunction()};
function scrollFunction() {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
// When the user clicks on the button, scroll to the top of the document
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
<!-- end custom article top snippet -->
<div class="article__content" itemprop="articleBody"><details>
<summary><b>Afficher/cacher Sommaire</b></summary>
<!-- affichage sommaire -->
<div class="toc-aside js-toc-root"></div>
</details><ul>
<li><a href="#présentation-de-pacman">Présentation de pacman</a></li>
<li><a href="#configuration">Configuration</a>
<ul>
<li><a href="#options-globales">Options globales</a></li>
<li><a href="#dépôts">Dépôts</a></li>
</ul>
</li>
<li><a href="#utilisation">Utilisation</a>
<ul>
<li><a href="#synchronisation-de-la-base-de-paquets">Synchronisation de la base de paquets</a></li>
<li><a href="#installation-de-paquets">Installation de paquets</a></li>
<li><a href="#mise-à-jour-des-paquets">Mise à jour des paquets</a></li>
<li><a href="#suppression-de-paquets">Suppression de paquets</a></li>
<li><a href="#recherche">Recherche</a></li>
<li><a href="#rétrograder-des-paquets">Rétrograder des paquets</a></li>
<li><a href="#nettoyer-le-cache-des-paquets">Nettoyer le cache des paquets</a></li>
<li><a href="#modification-de-la-base-de-données">Modification de la base de données</a></li>
<li><a href="#en-vrac">En vrac</a></li>
<li><a href="#une-astuce-totalement-inutile-et-peut-être-indispensable">Une astuce totalement inutile et (peut-être) indispensable…</a></li>
<li><a href="#empêcher-linstallation-de-locales">Empêcher linstallation de locales</a></li>
<li><a href="#récupérer-les-sources-dun-paquet">Récupérer les sources dun paquet</a></li>
<li><a href="#liste-des-paquets-installés">Liste des paquets installés</a></li>
<li><a href="#installer-des-paquets-depuis-une-liste">Installer des paquets depuis une liste</a></li>
</ul>
</li>
<li><a href="#problèmes">Problèmes</a>
<ul>
<li><a href="#crash-de-pacman-durant-une-mise-à-jour">Crash de pacman durant une mise à jour</a></li>
<li><a href="#un-paquet-a-été-mis-à-jour-mais-pacman-dit-que-le-système-est-à-jour">Un paquet a été mis à jour mais pacman dit que le système est à jour</a></li>
<li><a href="#le-paquet-est-introuvable">“Le paquet est introuvable”</a></li>
<li><a href="#un-même-paquet-se-met-à-jour-continuellement">Un même paquet se met à jour continuellement</a></li>
<li><a href="#équivalences-entre-pacman-et-les-autres-gestionnaires-de-paquets">Équivalences entre Pacman et les autres gestionnaires de paquets</a></li>
</ul>
</li>
<li><a href="#pacman-hook">Pacman hook</a>
<ul>
<li><a href="#prérequis-pour-la-création-du-hook-et-des-scripts">Prérequis pour la création du hook et des scripts</a></li>
<li><a href="#hook-pour-les-sauvegardes-timeshift---2-méthodes-dannulation">Hook pour les sauvegardes Timeshift - 2 méthodes dannulation</a>
<ul>
<li><a href="#timeshift-pacman-hook">Timeshift Pacman Hook</a></li>
<li><a href="#script-de-lancement-de-timeshift">Script de lancement de Timeshift</a></li>
<li><a href="#script-killshot">Script Killshot</a></li>
</ul>
</li>
<li><a href="#hook-pour-créer-une-liste-de-tous-les-paquets-installés">Hook pour créer une liste de tous les paquets installés</a></li>
<li><a href="#hook-pour-notifier-les-paquets-orphelins">Hook pour notifier les paquets orphelins</a>
<ul>
<li><a href="#hook-pour-les-paquets-orphelins---v1">Hook pour les paquets orphelins - v.1</a></li>
<li><a href="#hook-pour-notifier-les-paquets-orphelins---v2">Hook pour notifier les paquets orphelins - v.2</a></li>
</ul>
</li>
<li><a href="#hook-pour-vérifier-la-présence-de-fichiers-pacnewpacsave">Hook pour vérifier la présence de fichiers pacnew/pacsave</a></li>
<li><a href="#hook-pour-désactiver-lindexeur-de-fichiers-baloo">Hook pour désactiver lindexeur de fichiers baloo</a></li>
<li><a href="#hook-pour-mettre-à-jour-grublsb-release">Hook pour mettre à jour grub/lsb-release</a></li>
<li><a href="#hook-paccache-qui-supprime-automatiquement-le-cache">Hook paccache qui supprime automatiquement le cache</a></li>
</ul>
</li>
</ul>
<h2 id="présentation-de-pacman">Présentation de pacman</h2>
<p><a href="https://wiki.archlinux.org/title/Pacman_(Fran%C3%A7ais)/Tips_and_tricks_(Fran%C3%A7ais)">Archlinux - pacman Tips and tricks (Français)</a></p>
<p><strong><a href="http://archlinux.org/pacman">pacman</a></strong> est le gestionnaire de paquets
dArchlinux. Il combine un ensemble doutils binaires avec un système
relativement simple pour construire des paquets. (cf
<a href="https://wiki.archlinux.fr/Makepkg">makepkg</a> et <a href="https://wiki.archlinux.fr/Abs">ABS</a>). Le but étant de
facilement gérer les paquets, quils proviennent des dépôts officiels
ou quils soient compilés par lutilisateur.</p>
<p><strong>pacman</strong> permet de garder votre système à jour en synchronisant la
liste des paquets depuis un serveur puis de télécharger/installer les
nouveaux paquets, ainsi que leur dépendances, avec une simple commande.</p>
<h2 id="configuration">Configuration</h2>
<p><strong>pacman</strong> se configure à laide du fichier <strong>/etc/pacman.conf</strong> (cf.
page man:
<a href="http://www.archlinux.org/pacman/pacman.conf.5.html">pacman.conf(5)</a>).</p>
<h3 id="options-globales">Options globales</h3>
<p>Ces options se configurent sous la section <strong>[options]</strong>, quelques
exemples :</p>
<ul>
<li><strong>Architecture</strong> : si elle est définie, <strong>pacman</strong> ninstallera que
les paquets de cette architecture. Elle peut prendre la valeur
<em>auto</em> (larchitecture sera définie par un appel à ). Elle permet
aussi lutilisation de la variable dans
l<a href="http://en.wikipedia.org/wiki/fr:URI">URI</a> dun
<a href="https://wiki.archlinux.fr/Pacman#D.C3.A9p.C3.B4ts">dépôt</a>.</li>
<li><strong>IgnorePkg</strong> : indique à <strong>pacman</strong> les paquets à ne pas mettre à
jour.</li>
<li><strong>IgnoreGroup</strong> : indique à <strong>pacman</strong> les groupes à ne pas mettre à
jour.</li>
<li><strong>UseDelta</strong> : cette option ne prend pas de paramètre et permet
dindiquer à <strong>pacman</strong> de télécharger les deltas de paquets sils
sont disponibles. (cf. <a href="https://wiki.archlinux.fr/Deltas">Utilisation des deltas</a></li>
<li><strong>SigLevel</strong> : Indique à comment gérer les signatures :
<a href="https://wiki.archlinux.fr/Pacman-key">pacman-key</a></li>
<li><strong>Color</strong> : la sortie de pacman en console sera colorisée.</li>
<li><strong>NoExtract</strong> : Indique à de ne pas extraire certains fichiers (ex.
<a href="#Empêcher_l'installation_de_locales" title="wikilink">Empêcher linstallation de
locales</a>)</li>
</ul>
<h3 id="dépôts">Dépôts</h3>
<p>La syntaxe est simple :</p>
<p><code class="language-plaintext highlighter-rouge">[nom_du_depôt]</code><br />
<code class="language-plaintext highlighter-rouge">Server=miroir1_du_depôt</code><br />
<code class="language-plaintext highlighter-rouge">Server=miroir2_du_depôt</code></p>
<p>cf. <a href="https://wiki.archlinux.fr/Depots">Détails des dépôts</a>.</p>
<h2 id="utilisation">Utilisation</h2>
<p>Pour une description complète, merci de vous référer à la page man :
<a href="http://www.archlinux.org/pacman/pacman.8.html">pacman(8)</a>. Certaines
options sont à prendre avec beaucoup de précaution, consultez <a href="https://wiki.archlinux.fr/Enhancing_Arch_Linux_Stability#.C3.89vitez_certaines_commandes_avec_pacman">ces
quelques
conseils</a>
pour utiliser pacman au mieux.</p>
<p>Voici quelques exemples dopérations :</p>
<h3 id="synchronisation-de-la-base-de-paquets">Synchronisation de la base de paquets</h3>
<p>Cette opération met à jour la liste des paquets disponibles sur les
<a href="https://wiki.archlinux.fr/Miroirs">miroirs</a> :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Sy</code></p>
<h3 id="installation-de-paquets">Installation de paquets</h3>
<p>Installation dune liste de paquets :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -S paquet_1 paquet_2</code></p>
<p>Si le paquet existe sous plusieurs dépôts, on peut éventuellement en
préciser un :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -S extra/paquet</code></p>
<p>Si vous avez larchive dun paquet sur votre disque :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -U archive_du_paquet.pkg.tar.xz</code></p>
<p>Ou même si vous avez le lien de larchive, par exemple :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -U </code><a href="https://www.archlinux.org/packages/core/i686/pacman/download/"><code class="language-plaintext highlighter-rouge">https://www.archlinux.org/packages/core/i686/pacman/download/</code></a></p>
<p>Pour linstallation dune liste de paquets depuis un fichier texte (un
paquet par ligne) :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -S - &lt; pkglist.txt</code></p>
<p>Il est possible aussi de faire ainsi si le nombre de paquets nest pas
trop grand :</p>
<p><code class="language-plaintext highlighter-rouge"> pacman -S $(cat pkglist.txt)</code></p>
<h3 id="mise-à-jour-des-paquets">Mise à jour des paquets</h3>
<p>Mise à jour suite à une synchronisation faite précédemment :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Su</code></p>
<p>Synchronisation puis, mise à jour :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Syu</code></p>
<p>Pour installer un nouveau paquet tout en mettant à jour le système :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Syu paquet_1</code></p>
<h3 id="suppression-de-paquets">Suppression de paquets</h3>
<p><code class="language-plaintext highlighter-rouge">pacman -R paquet_1</code></p>
<p>Pour garder un système propre, il faut aussi supprimer les dépendances
qui ne sont plus requises par aucun paquet :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Rs paquet_1</code></p>
<p>Par défaut, les fichiers de configuration modifiés sont sauvegardés avec
lextension <strong>.pacsave</strong>. Pour ne pas les conserver :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Rsn paquet_1</code></p>
<h3 id="recherche">Recherche</h3>
<p>Pour avoir une aide rapide :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Q --help</code><br />
<code class="language-plaintext highlighter-rouge">pacman -S --help</code><br />
<code class="language-plaintext highlighter-rouge">pacman -R --help</code></p>
<p>Recherche dun paquet parmi ceux installés :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Qs paquet</code></p>
<p>Recherche dun paquet dans les dépôts :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Ss paquet</code></p>
<p><strong>pacman</strong> peut effectuer une recherche avec des expressions régulières
:</p>
<p>Informations complètes sur un paquet installé (par exemple pour vérifier
si certaines des dépendances optionnelles peuvent vous apporter des
fonctionnalités supplémentaires):</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Qi paquet</code></p>
<p>ou non:</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Si paquet</code></p>
<p>Liste des fichiers dun paquet installé :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Ql paquet_1</code></p>
<p>Savoir à quel paquet appartient lun des fichiers du système:</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Qo /chemin/vers/le/fichier</code></p>
<p>Liste des paquets nappartenant à aucun dépôt configuré dans
pacman.conf :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Qm</code></p>
<p>Liste des paquets (dépendances) nétant plus requis par le système (le
paquet qui a causé leur installation nest plus présent) :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Qdt</code></p>
<h3 id="rétrograder-des-paquets">Rétrograder des paquets</h3>
<p>Il est parfois nécessaire de revenir temporairement à la version
précédente dun paquet (régression, bug), différents moyens existent:
<a href="https://wiki.archlinux.fr/Downgrade">Downgrade</a>.</p>
<h3 id="nettoyer-le-cache-des-paquets">Nettoyer le cache des paquets</h3>
<p><em>pacman</em> stocke les paquets téléchargés ici et nenlève pas
automatiquement les versions anciennes ou désinstallées. Il faut donc
vider régulièrement ce dossier pour éviter quil ne prenne une taille
démesurée.</p>
<p>La commande suivante de pacman supprime tous les paquest non-installés
du cache (anciennes versions ou non installées sur le système):</p>
<p><code class="language-plaintext highlighter-rouge">pacman -Sc</code></p>
<p>À cause de toutes les restrictions énoncées avant, il est recommandé
dutiliser un script dédié au nettoyage du cache de pacman, afin de
contrôler plus finement les paquets à supprimer:</p>
<ul>
<li>La commande <em>paccache</em>, fourni avec le paquet , supprime par défaut
tous les paquets du cache sauf les trois dernières versions les plus
récentes:</li>
</ul>
<p><code class="language-plaintext highlighter-rouge">paccache -r</code></p>
<p>Cependant, <em>paccache</em> <em>ne</em> vérifiera <em>pas</em> si les paquets sont encore
installés sur le système et laissera donc les paquets non-installés dans
le cache. Pour supprimer du cache toutes les versions des paquets
non-installés, vous devez lancer la commande suivante dans un second
temps :</p>
<p><code class="language-plaintext highlighter-rouge">paccache -ruk0 </code></p>
<p>Voir pour plus doptions.</p>
<ul>
<li>Vous pouvez également installer et utiliser les scripts alternatifs : <a href="https://aur.archlinux.org/packages/pkgcacheclean">pkgcacheclean</a>(écrit en C)… :</li>
</ul>
<p><code class="language-plaintext highlighter-rouge">pkgcacheclean</code></p>
<ul>
<li>…ou <a href="https://aur.archlinux.org/packages/pacleaner">pacleaner</a>(écrit en python) depuis <a href="https://wiki.archlinux.fr/AUR">AUR</a>:</li>
</ul>
<p>Pour vérifier les paquets à supprimer sauf les trois plus récents :</p>
<p><code class="language-plaintext highlighter-rouge">pacleaner -m</code></p>
<p>Pour vérifier les paquets non-installés :</p>
<p><code class="language-plaintext highlighter-rouge">pacleaner -u</code></p>
<p>Utilisez loption delete pour supprimer les paquets :</p>
<p><code class="language-plaintext highlighter-rouge">pacleaner -m --delete</code>
<code class="language-plaintext highlighter-rouge">pacleaner -u --delete </code></p>
<p>Les options par défaut peuvent être modifiées dans un fichier de
configuration (nombre de paquets à conserver, chemin daccès vers le
cache…)</p>
<h3 id="modification-de-la-base-de-données">Modification de la base de données</h3>
<p>Vous pouvez modifier certains éléments de la base de données des paquets
installés, notamment la raison dinstallation dun paquet (installés
en tant que dépendances ou explicitement) :</p>
<p><code class="language-plaintext highlighter-rouge">pacman -D --asexplicit paquet_1 paquet_2</code>
<code class="language-plaintext highlighter-rouge">pacman -D --asdeps paquet_1 paquet_2</code></p>
<h3 id="en-vrac">En vrac</h3>
<ul>
<li>Téléchargement des paquets seulement:</li>
</ul>
<p><code class="language-plaintext highlighter-rouge">pacman -Sw paquet_1 paquet_2</code></p>
<ul>
<li>Vérifier quil ne manque pas de fichiers installés sur lensemble
des paquets:</li>
</ul>
<p><code class="language-plaintext highlighter-rouge">pacman -Qqk</code></p>
<h3 id="une-astuce-totalement-inutile-et-peut-être-indispensable">Une astuce totalement inutile et (peut-être) indispensable…</h3>
<p>Il existe une petite astuce avec Pacman que — jen suis sûr — vous
allez vous empresser de tester. Éditez le fichier
<strong>/etc/pacman.conf</strong>” et ajoutez loption “<strong>ILoveCandy</strong>” dans la
rubrique en dessous de “<strong>[options]</strong>” :</p>
<p><code class="language-plaintext highlighter-rouge">[options]</code>
<code class="language-plaintext highlighter-rouge">ILoveCandy</code></p>
<p>Vous obtiendrez par la suite une sortie de Pacman similaire au jeu du
même nom lorsque vous mettrez votre système à jour.</p>
<h3 id="empêcher-linstallation-de-locales">Empêcher linstallation de locales</h3>
<p>Loption du fichier est très utile si certaines parties de paquets vous
sont inutiles. Les locales sont un cas typique de ce genre de fichiers
dont on pourrait vouloir se passer.</p>
<p>Aucun des fichiers listés dans les règles de loption nest extrait
lors de linstallation dun paquet. Le motif <strong>*** est autorisé pour
désigner un ensemble de fichier (comme on le ferait dans un shell). Par
exemple désigne tous les fichiers dans le dossier ainsi que dans ses
sous-dossiers. Il est possible dinverser le comportement dune règle
en la préfixant dun **!</strong>. Cela annule les règles précedentes sur les
fichiers correspondant.</p>
<p>Donc, si on veut se passer de toutes les locales sauf celles
francofrançaises, on obient les règles suivantes à ajouter dans la
section de .</p>
<p>Les règles peuvent aussi être indiquées sur une seul ligne</p>
<h3 id="récupérer-les-sources-dun-paquet">Récupérer les sources dun paquet</h3>
<p><code class="language-plaintext highlighter-rouge">git clone --branch packages/nom_du_paquet --single-branch </code><a href="https://git.archlinux.org/svntogit/packages.git"><code class="language-plaintext highlighter-rouge">https://git.archlinux.org/svntogit/packages.git</code></a><code class="language-plaintext highlighter-rouge"> nom_du_paquet</code></p>
<h3 id="liste-des-paquets-installés">Liste des paquets installés</h3>
<p>Il peut être utile de conserver la liste de tous les paquets installés explicitement, par exemple pour sauvegarder un système ou une installation plus rapide sur un nouveau système:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>pacman <span class="nt">-Qqe</span> <span class="o">&gt;</span> pkglist.txt
</code></pre></div></div>
<ul>
<li>Avec loption <strong>-t</strong>, les paquets déjà requis par dautres paquets explicitement installés ne seront pas mentionnés. En cas de réinstallation depuis cette liste il seront bien installés, mais seulement en tant que dépendances.</li>
<li>Avec loption <strong>-n</strong>, les paquets étrangers (ex. de AUR) seraient exclus de la liste.</li>
<li>Utiliser <code class="language-plaintext highlighter-rouge">comm -13 &lt;(pacman -Qqdt | sort) &lt;(pacman -Qqdtt | sort) &gt; optdeplist.txt</code> pour créer aussi une liste des dépendances optionnelles installées qui pourront être réinstallées avec loption asdeps.</li>
<li>Utiliser <code class="language-plaintext highlighter-rouge">pacman -Qqem &gt; foreignpkglist.txt</code> pour créer la liste des paquets AUR ou autres paquets étrangers, explicitement installés.</li>
</ul>
<p>Pour garder à jour une liste de paquets installés explicitement (p. ex. en combinaison avec un fichier versionné dans<code class="language-plaintext highlighter-rouge"> /etc/</code>), vous pouvez mettre en place un <strong>hook</strong> de pacman. Exemple:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Trigger]
Operation = Install
Operation = Remove
Type = Package
Target = *
[Action]
When = PostTransaction
Exec = /bin/sh -c '/usr/bin/pacman -Qqe &gt; /etc/pkglist.txt'
</code></pre></div></div>
<h3 id="installer-des-paquets-depuis-une-liste">Installer des paquets depuis une liste</h3>
<p>Pour installer des paquets depuis une sauvegarde antérieure de la liste des paquets, tout en ne réinstallant pas ceux qui sont déjà installés et à jour, lancer:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman -S --needed - &lt; pkglist.txt
</code></pre></div></div>
<p>Cependant, il est probable que des paquets étrangers, tels ceux de AUR ou installés localement, soient présents dans la liste. Pour filtrer à partir de la liste les paquets étrangers, la ligne de commande précédente peut être enrichie comme suit :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman -S --needed $(comm -12 &lt;(pacman -Slq | sort) &lt;(sort pkglist.txt))
</code></pre></div></div>
<p>Finalement, pour sassurer que les paquets installés de votre système correspondent à la liste et supprimer tous les paquets qui ny sont pas mentionnés :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman -Rsu $(comm -23 &lt;(pacman -Qq | sort) &lt;(sort pkglist.txt))
</code></pre></div></div>
<h2 id="problèmes">Problèmes</h2>
<h3 id="crash-de-pacman-durant-une-mise-à-jour">Crash de pacman durant une mise à jour</h3>
<p>Dans le cas où pacman crashe durant une mise à jour, une suppression de
paquet ou encore une réinstallation dun paquet, il faudra faire ces
différentes étapes :</p>
<ul>
<li>Démarrer sur un iso dinstallation ArchLinux</li>
<li>Monter votre système de fichier <strong>racine</strong> (, , , etc., sils
existent)</li>
<li>Mettre à jour votre base de données pacman ainsi que mettre à jour
vos paquets via la commande</li>
<li>Réinstaller le(s) paquet(s) cassé(s) via la commande</li>
</ul>
<h3 id="un-paquet-a-été-mis-à-jour-mais-pacman-dit-que-le-système-est-à-jour">Un paquet a été mis à jour mais pacman dit que le système est à jour</h3>
<p>Les miroirs de pacman ne sont pas directement synchronisé. Il faut
compter environ 24 heures avant de pouvoir recevoir la mise à jour tant
désirée.</p>
<h3 id="le-paquet-est-introuvable">“Le paquet est introuvable”</h3>
<p>Premièrement, assurez vous que le paquet que vous tentez dinstaller
existe réellement. Si ce paquet existe vraiment, vérifiez que
lorthographe est correcte. Il se peut aussi que le paquet existe et
que lorthographe est correcte mais que la liste de vos paquets est
obsolète. Dans ce cas, un simple <strong>pacman -Syyu</strong> fera amplement
laffaire.</p>
<h3 id="un-même-paquet-se-met-à-jour-continuellement">Un même paquet se met à jour continuellement</h3>
<p>Ce problème est du a des entrées dupliquées dans
<strong>/var/lib/pacman/local/</strong> comme sil y avait deux instances de linux.
La commande <strong>pacman -Qi</strong> donne la bonne version et la commande
<strong>pacman -Qu</strong> reconnait la plus vieille version <strong>ET</strong> essaye de la
mettre à jour. La solution est donc deffacer la mauvaise entrée dans
<strong>/var/lib/pacman/local/</strong></p>
<h3 id="équivalences-entre-pacman-et-les-autres-gestionnaires-de-paquets">Équivalences entre Pacman et les autres gestionnaires de paquets</h3>
<p>Si vous avez lhabitude dutiliser Arch, Red Hat/Fedora,
Debian/Ubuntu, SUSE/openSUSE ou encore Gentoo, et que vous rencontrez
des difficultés à prendre en main le gestionnaire de paquets mais que
vous êtes à laise avec un autre, vous pouvez consulter la page <a href="https://wiki.archlinux.org/index.php/Pacman_Rosetta">Pacman
Rosetta (en)</a>, qui donne les commandes
équivalentes entre chacun des gestionnaires de paquets.</p>
<p>Si vous êtes très à laise avec Pacman mais que vous narrivez pas à
prendre dautres gestionnaires de paquets en main,
<a href="https://github.com/icy/pacapt">pacapt</a> est une solution.</p>
<h2 id="pacman-hook">Pacman hook</h2>
<p>Les “hooks” Pacman créés par les utilisateurs</p>
<ul>
<li>Les hooks de Pacman vous permettent dautomatiser toute fonction que vous souhaitez voir exécutée avant ou après une installation/désinstallation ou une mise à jour de Pacman.</li>
<li>Les hooks inclus dans les paquets installés peuvent être trouvés dans /usr/share/libalpm/hooks.</li>
<li>Les hooks créés par lutilisateur doivent être placés dans /etc/pacman.d/hooks/</li>
<li>Tous les scripts associés peuvent être placés dans /etc/pacman.d/hooks.bin/
<ul>
<li>Vous devrez créer ces répertoires, car ils ne sont pas créés automatiquement.</li>
</ul>
</li>
<li>Les noms de fichiers Hooks doivent avoir le suffixe .hook.</li>
<li>Les hooks sont exécutés dans lordre alphanumérique de leur nom de fichier, - les hooks préfixés par un nombre inférieur sont prioritaires).</li>
</ul>
<h3 id="prérequis-pour-la-création-du-hook-et-des-scripts">Prérequis pour la création du hook et des scripts</h3>
<p>Créez des sous-répertoires pour le hook pacman et les scripts liés</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /etc/pacman.d/{hooks,hooks.bin}
</code></pre></div></div>
<h3 id="hook-pour-les-sauvegardes-timeshift---2-méthodes-dannulation">Hook pour les sauvegardes Timeshift - 2 méthodes dannulation</h3>
<h4 id="timeshift-pacman-hook">Timeshift Pacman Hook</h4>
<p>Ce hook déclenche une sauvegarde automatique de Timeshift avant dinstaller une mise à jour du système. Il contient également plusieurs méthodes pour annuler la sauvegarde. Cette version inclut lannulation automatique de la sauvegarde si une autre sauvegarde a été effectuée récemment dans un délai réglable. Elle intègre également une fonction qui permet lannulation de toute sauvegarde avec une fenêtre de compte à rebours de 10 secondes (réglable) via le clavier. Pendant que le compte à rebours est actif, vous pouvez annuler nimporte quelle sauvegarde en appuyant sur la touche ENTER.</p>
<p>Il se peut que vous receviez un message derreur contextuel lorsquun instantané en temps partagé est annulé. Ce message derreur na pas dimportance car il ne fait que notifier léchec de la sauvegarde programmée en temps partagé (ce qui était prévu).</p>
<p>Avec un éditeur de texte capable de gérer lutilisateur root, créez le hook timeshift pacman</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks/50-timeshift.hook
</code></pre></div></div>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#/etc/pacman.d/hooks/50-timeshift.hook</span>
<span class="o">[</span>Trigger]
Operation <span class="o">=</span> Upgrade
Type <span class="o">=</span> Package
Target <span class="o">=</span> <span class="k">*</span>
<span class="o">[</span>Action]
Description <span class="o">=</span> pre-upgrade timeshift snapshot
When <span class="o">=</span> PreTransaction
Exec <span class="o">=</span> /bin/sh <span class="nt">-c</span> <span class="s2">"sudo -Hiu user konsole -e /etc/pacman.d/hooks.bin/killshot.sh | /etc/pacman.d/hooks.bin/timeshift.sh"</span>
</code></pre></div></div>
<p>Il est parfois difficile dutiliser des variables dans les hooks pacman, il y a donc des portions de code dans lesquelles vous devrez insérer vos propres informations spécifiques.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Exec = /bin/sh -c "sudo -Hiu user konsole -e
</code></pre></div></div>
<p>Dans la partie ci-dessus de la ligne “Exec”, remplacez “user” par votre propre nom dutilisateur. Remplacez “ konsole “ par le nom de lémulateur de terminal que vous utilisez sur votre système. Tous les émulateurs de terminal ne se lancent pas correctement en utilisant le paramètre “-e” (execute). Le terminal gnome peut poser des problèmes dexécution automatique avec ce script. Contrairement à de nombreux autres émulateurs de terminal, gnome-terminal naccepte pas le paramètre “-e”. Si quelquun connaît la meilleure méthode pour lancer automatiquement des scripts avec gnome-terminal, merci de poster linfo.</p>
<p>Ce script doit être utilisé avec un émulateur de terminal capable daccepter le paramètre “-e” (execute) au lancement. Je ne sais pas exactement quels terminaux sont capables de cela, mais Yakuake et Konsole semblent bien gérer cette tâche. Vous devrez peut-être expérimenter en utilisant différents terminaux pour trouver la bonne méthode de lancement automatique du script via un hook pacman.</p>
<h4 id="script-de-lancement-de-timeshift">Script de lancement de Timeshift</h4>
<p>Ce script lance une sauvegarde timeshift automatiquement à chaque fois quune mise à jour est lancée. Le script contient également une méthode pour annuler automatiquement toute sauvegarde si un autre instantané a été pris récemment. Cette fonction a pour but de limiter les instantanés répétés dans un court laps de temps. Les snapshots répétés deviennent une gêne importante lorsque vous rencontrez un problème de mise à niveau que vous devez déboguer.</p>
<p>Ce script annulera linstantané si un instantané précédent a été pris dans la fenêtre de temps prédéterminée que vous sélectionnez. Pour modifier le délai, remplacez “-mmin -60” (1 heure) par une autre unité de temps. Si vous préférez que le déclencheur soit fixé à deux heures, il suffit de changer lunité de temps en “-mmin -120”.</p>
<p>Vous devrez remplacer le chemin “/run/media/user/1TB/timeshift/snapshots-ondemand” dans le script par lemplacement réel de votre sauvegarde timeshift. La sauvegarde est stockée dans le sous-répertoire “/snapshots-ondemand” du répertoire principal de timeshift.</p>
<p>Le script déclenche également un petit message dans linterface graphique lorsque la sauvegarde commence.</p>
<p>Créez le script pour lancer (ou annuler automatiquement) le snapshot timeshift</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks.bin/timeshift.s
</code></pre></div></div>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c">#/etc/pacman.d/hooks.bin/timeshift.sh</span>
find /run/media/user/1TB/timeshift/snapshots-ondemand <span class="nt">-mmin</span> <span class="nt">-60</span> | <span class="nb">grep</span> <span class="si">$(</span><span class="nb">date</span> +%Y-%m-%d<span class="si">)</span>
<span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> <span class="nt">-eq</span> 0 <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nb">echo</span> <span class="s2">"timeshift backup canceled, time threshold not met"</span>
<span class="k">else
</span><span class="nb">sudo</span> <span class="nt">-Hiu</span> user /bin/sh <span class="nt">-c</span> <span class="s1">'DISPLAY=:0 notify-send "Timeshift_Backup_Beginning"'</span>
<span class="nb">echo</span> <span class="s2">" "</span>
<span class="nb">echo</span> <span class="s2">"Initiating Pre-Update Timeshift Snapshot"</span>
<span class="nb">echo</span> <span class="s2">" "</span>
<span class="nb">echo</span> <span class="s2">"You have 10 seconds to cancel timeshift snapshot"</span>
/usr/bin/timeshift <span class="nt">--create</span> <span class="nt">--comments</span> <span class="s2">"timeshift-pacman-hook-snapshot"</span>
<span class="k">fi
</span><span class="nb">exit</span>
</code></pre></div></div>
<p>Sauvegardez le script, puis rendez le script exécutable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chmod +x /etc/pacman.d/hooks.bin/timeshift.sh
</code></pre></div></div>
<h4 id="script-killshot">Script Killshot</h4>
<p>Ce script permet dannuler manuellement linstantané de timeshift par une intervention au clavier. Il fournit une fenêtre de compte à rebours de 10 secondes (réglable) pendant laquelle vous pouvez annuler linstantané. Pendant que le compte à rebours est actif, vous pouvez annuler nimporte quelle sauvegarde en appuyant sur la touche ENTER.</p>
<p>Le nombre de secondes pendant lesquelles la fenêtre de compte à rebours est ouverte peut être ajusté dans cette ligne</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>for (( i=9; i&gt;0; i--)); do
</code></pre></div></div>
<p>Si vous souhaitez augmenter la fenêtre de temps pour lannulation à 20 secondes, ajustez-la comme suit</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>for (( i=20; i&gt;0; i--)); do
</code></pre></div></div>
<p>Le script déclenche également un petit message contextuel de linterface graphique lorsque la sauvegarde est interrompue.</p>
<p>Créez le script permettant dannuler linstantané en temps partagé par une intervention au clavier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks.bin/killshot.sh
</code></pre></div></div>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c">#/etc/pacman.d/hooks.bin/killshot.sh</span>
<span class="nb">echo</span> <span class="s2">"press any key to cancel timeshift snapshot"</span>
<span class="nb">sleep </span>1
<span class="k">for</span> <span class="o">((</span> <span class="nv">i</span><span class="o">=</span>9<span class="p">;</span> i&gt;0<span class="p">;</span> i--<span class="o">))</span><span class="p">;</span> <span class="k">do
</span><span class="nb">printf</span> <span class="s2">"</span><span class="se">\n</span><span class="nv">$i</span><span class="s2"> seconds left to cancel snapshot ... hit any key "</span>
<span class="nb">read</span> <span class="nt">-s</span> <span class="nt">-n</span> 1 <span class="nt">-t</span> 1 key
<span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> <span class="nt">-eq</span> 0 <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nb">sudo kill</span> <span class="nt">-2</span> <span class="sb">`</span>ps <span class="nt">-ef</span>|grep <span class="nt">-i</span> timeshift| <span class="nb">grep</span> <span class="nt">-v</span> <span class="nb">grep</span>| <span class="nb">awk</span> <span class="s1">'{print $2}'</span><span class="sb">`</span>
<span class="nb">echo</span> <span class="s2">" "</span>
<span class="nb">echo</span> <span class="s2">"aborting timeshift snapshot"</span>
<span class="nb">echo</span> <span class="s2">" "</span>
<span class="nb">sudo</span> <span class="nt">-Hiu</span> user /bin/sh <span class="nt">-c</span> <span class="s1">'DISPLAY=:0 notify-send "Timeshift_snapshot_aborted"'</span>
<span class="k">fi
done</span>
</code></pre></div></div>
<p>Sauvegardez le script, puis rendez-le exécutable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chmod +x /etc/pacman.d/hooks.bin/killshot.sh
</code></pre></div></div>
<p>Cest plus compliqué à écrire que les autres hooks timeshift, mais bien plus polyvalent</p>
<h3 id="hook-pour-créer-une-liste-de-tous-les-paquets-installés">Hook pour créer une liste de tous les paquets installés</h3>
<p>hook liste de sauvegarde du paquet Pacman :</p>
<p>Ce hook complète bien le hook timeshift ci-dessus dans toute stratégie de sauvegarde. Ce hook sauvegardera une liste de vos paquets natifs et étrangers (AUR) installés. Cela garantit que vous aurez toujours une liste à jour de tous vos paquets que vous pourrez réinstaller.</p>
<p>Pourquoi en avez-vous besoin, me direz-vous (si vous avez une sauvegarde timeshift) ? Si vous souffrez dune panne matérielle catastrophique, vous apprécierez vraiment de pouvoir réinstaller automatiquement tous vos paquets préférés à partir dune sauvegarde.</p>
<p>Créez le hook suivant</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks/50-pacman-list.hook
</code></pre></div></div>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#/etc/pacman.d/hooks/50-pacman-list.hook</span>
<span class="o">[</span>Trigger]
Type <span class="o">=</span> Package
Operation <span class="o">=</span> Install
Operation <span class="o">=</span> Upgrade
Operation <span class="o">=</span> Remove
Target <span class="o">=</span> <span class="k">*</span>
<span class="o">[</span>Action]
Description <span class="o">=</span> Create a backup list of all installed packages
When <span class="o">=</span> PreTransaction
Exec <span class="o">=</span> /bin/sh <span class="nt">-c</span> <span class="s1">'pacman -Qqen &gt; "/home/$USER/.cache/package_lists/$(date +%Y-%m-%d_%H:%M)_native.log"; pacman -Qqem &gt; "/home/$USER/.cache/package_lists/$(date +%Y-%m-%d_%H:%M)_alien.txt" 2&gt; /dev/null; exit'</span>
</code></pre></div></div>
<p>Vous souhaiterez très probablement modifier le chemin où vous stockez vos listes de sauvegarde. Lajout de plusieurs emplacements de sauvegarde est une meilleure assurance en cas de panne matérielle.</p>
<p>(edit) ci-dessous est un exemple de comment vous pourriez sauvegarder dans votre répertoire personnel, et aussi sur un disque de sauvegarde externe dans la même ligne “Exec”</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Exec <span class="o">=</span> /bin/sh <span class="nt">-c</span> <span class="s1">'pacman -Qqen &gt; "/home/$USER/$(date +%Y-%m-%d@%H:%M)_native.log"; pacman -Qqem &gt; "/home/$USER/$(date +%Y-%m-%d@%H:%M)_alien.txt"; pacman -Qqem &gt; "/run/media/$USER/Backup/package_lists/$(date +%Y-%m-%d@%H:%M)_native.log"; pacman -Qqem &gt; "/run/media/$USER/Backup/package_lists/$(date +%Y-%m-%d@%H:%M)_alien.txt " 2&gt; /dev/null; exit'</span>
</code></pre></div></div>
<p>La meilleure pratique consiste souvent à remplacer “$USER” par votre propre nom dutilisateur. Dans la plupart des cas, “$USER” fonctionnera correctement, mais dans certains cas, il peut insérer lutilisateur root plutôt que votre propre nom dutilisateur. Il est donc parfois préférable de sassurer que votre nom dutilisateur correct est inséré en remplacement de “$USER”.</p>
<h3 id="hook-pour-notifier-les-paquets-orphelins">Hook pour notifier les paquets orphelins</h3>
<h4 id="hook-pour-les-paquets-orphelins---v1">Hook pour les paquets orphelins - v.1</h4>
<p>Voici un autre hook très pratique pour le ménage.</p>
<p>Vous pouvez utiliser un hook pacman pour vous avertir lorsque des paquets orphelins sont créés.</p>
<p>Pour lister tous les paquets qui ne sont plus nécessaires comme dépendances, créez le hook suivant</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks/orphans.hook
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#/etc/pacman.d/hooks/orphans.hook
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Package
Target = *
[Action]
Description = Orphaned package notification
When = PostTransaction
Exec = /usr/bin/bash -c "/usr/bin/pacman -Qtd || /usr/bin/echo '=&gt; No orphans found.'"
</code></pre></div></div>
<p>Vous pourriez également faire en sorte que le hook supprime automatiquement les paquets orphelins, mais lautomatisation de cette fonction est un peu trop risquée.</p>
<h4 id="hook-pour-notifier-les-paquets-orphelins---v2">Hook pour notifier les paquets orphelins - v.2</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Package
Target = *
&gt;
&gt;
&gt;
[Action]
Description = Checking for orphaned packages...
Depends = pacman
When = PostTransaction
Exec = /usr/bin/bash -c 'orphans=$(pacman -Qtdq); if [[ -n "$orphans" ]]; then echo -e "\e[1mOrphan packages found:\e[0m\n$orphans\n\e[1mPlease check and remove any no longer needed\e[0m"; fi'
</code></pre></div></div>
<h3 id="hook-pour-vérifier-la-présence-de-fichiers-pacnewpacsave">Hook pour vérifier la présence de fichiers pacnew/pacsave</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Package
Target = *
[Action]
Description = Checking for .pacnew and .pacsave files...
When = PostTransaction
Exec = /usr/bin/bash -c 'pacfiles=$(pacdiff -o); if [[ -n "$pacfiles" ]]; then echo -e "\e[1m.pac* files found:\e[0m\n$pacfiles\n\e[1mPlease check and merge\e[0m"; fi'
</code></pre></div></div>
<h3 id="hook-pour-désactiver-lindexeur-de-fichiers-baloo">Hook pour désactiver lindexeur de fichiers baloo</h3>
<p>La fonction de recherche de fichiers de Baloo a été considérablement améliorée dans KDE. Cependant, ce nest toujours pas mon moteur de recherche préféré et je préférerais quil soit désactivé de façon permanente. Selon lArchWiki, baloo ne peut pas être désinstallé, et il peut être réactivé automatiquement lors dune mise à jour du système. LArchWiki recommande de désactiver baloo après toute mise à jour du système si vous ne voulez pas quil fonctionne.</p>
<p>Jai décidé de créer un hook pacman pour faire cela automatiquement après chaque mise à jour du système.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks/disable-baloo.hook
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Trigger]
Type = Package
Operation = Upgrade
Target = /usr/bin/baloo_file
[Action]
Description = Disable baloo file indexer after every upgrade operation
When = PostTransaction
Exec = /bin/sh -c 'killall baloo_file ; mv /usr/bin/baloo_file /usr/bin/baloo_file.bak ; echo '#!/bin/sh' &gt; /usr/bin/baloo_file'
</code></pre></div></div>
<h3 id="hook-pour-mettre-à-jour-grublsb-release">Hook pour mettre à jour grub/lsb-release</h3>
<p>Jai quelques manjaro sur mon bureau, jutilise un pacman hook de manjaro pour créer de bonnes entrées dans mon grub.
lancer le hook uniquement lorsque le fichier etc/lsb-release est mis à jour</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks/lsb-release.hook
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Trigger]
Operation = Install
Operation = Upgrade
Type = File
Target = etc/lsb-release
[Action]
Description = lsb-release change description for grub
When = PostTransaction
Exec = /usr/bin/sed -i 's/^DISTRIB_DESCRIPTION.*/DISTRIB_DESCRIPTION="Manjaro Cinnamon"/' /etc/lsb-release
</code></pre></div></div>
<h3 id="hook-paccache-qui-supprime-automatiquement-le-cache">Hook paccache qui supprime automatiquement le cache</h3>
<p>Supprimer cache des paquets installés, ne laisser que la dernière version</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/pacman.d/hooks/paccache.hook
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Package
Target = *
[Action]
Description = Cleaning pacman cache...
When = PostTransaction
Exec = /usr/bin/paccache -rk1
</code></pre></div></div>
<p>inclure les paquets désinstallés</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Package
Target = *
[Action]
Description = Cleaning pacman cache...
When = PostTransaction
Exec = /usr/bin/paccache -rk1 ; /usr/bin/paccache -ruk0
</code></pre></div></div>
</div>
<div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2022-11-02T00:00:00+01:00"><!-- start custom article footer snippet -->
<!-- end custom article footer snippet -->
<!--
<div align="right"><a type="application/rss+xml" href="/feed.xml" title="S'abonner"><i class="fa fa-rss fa-2x"></i></a>
&emsp;</div>
-->
</footer>
<div class="article__section-navigator clearfix"><div class="previous"><span>PRÉCÉDENT</span><a href="/2022/10/26/EndeavourOS-Chiffrement-LUKS-LVM.html">TEST VM EndeavourOS avec chiffrement complet du disque LVM sur LUKS</a></div><div class="next"><span>SUIVANT</span><a href="/2022/11/09/Installation-Ruby-via-rbenv+Jekyll-sur-Debian.html">Installation Ruby (via rbenv) + Jekyll (générateur de site statique) sur Debian</a></div></div></div>
</div>
<script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
$(function() {
var $this ,$scroll;
var $articleContent = $('.js-article-content');
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
var scroll = hasSidebar ? '.js-page-main' : 'html, body';
$scroll = $(scroll);
$articleContent.find('.highlight').each(function() {
$this = $(this);
$this.attr('data-lang', $this.find('code').attr('data-lang'));
});
$articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
$this = $(this);
$this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
});
$articleContent.on('click', '.anchor', function() {
$scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
});
});
});
})();
</script>
</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
<!-- end custom main bottom snippet -->
</div>
</div></div></div></div>
</div><script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
var $body = $('body'), $window = $(window);
var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
var activeCount = 0;
function modal(options) {
var $root = this, visible, onChange, hideWhenWindowScroll = false;
var scrollTop;
function setOptions(options) {
var _options = options || {};
visible = _options.initialVisible === undefined ? false : show;
onChange = _options.onChange;
hideWhenWindowScroll = _options.hideWhenWindowScroll;
}
function init() {
setState(visible);
}
function setState(isShow) {
if (isShow === visible) {
return;
}
visible = isShow;
if (visible) {
activeCount++;
scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
$root.addClass('modal--show');
$pageMain.scrollTop(scrollTop);
activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
$window.on('keyup', handleKeyup);
} else {
activeCount > 0 && activeCount--;
$root.removeClass('modal--show');
$window.scrollTop(scrollTop);
activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
$window.off('keyup', handleKeyup);
}
onChange && onChange(visible);
}
function show() {
setState(true);
}
function hide() {
setState(false);
}
function handleKeyup(e) {
// Char Code: 27 ESC
if (e.which === 27) {
hide();
}
}
setOptions(options);
init();
return {
show: show,
hide: hide,
$el: $root
};
}
$.fn.modal = modal;
});
})();
</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
(function () {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
// search panel
var search = (window.search || (window.search = {}));
var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
true : window.useDefaultSearchBox ;
var $searchModal = $('.js-page-search-modal');
var $searchToggle = $('.js-search-toggle');
var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
var modalVisible = false;
search.searchModal = searchModal;
var $searchBox = null;
var $searchInput = null;
var $searchClear = null;
function getModalVisible() {
return modalVisible;
}
search.getModalVisible = getModalVisible;
function handleModalChange(visible) {
modalVisible = visible;
if (visible) {
search.onShow && search.onShow();
useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
} else {
search.onShow && search.onHide();
useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
setTimeout(function() {
useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
search.clear && search.clear();
window.pageAsideAffix && window.pageAsideAffix.refresh();
}, 400);
}
}
$searchToggle.on('click', function() {
modalVisible ? searchModal.hide() : searchModal.show();
});
// Char Code: 83 S, 191 /
$(window).on('keyup', function(e) {
if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
modalVisible || searchModal.show();
}
});
if (useDefaultSearchBox) {
$searchBox = $('.js-search-box');
$searchInput = $searchBox.children('input');
$searchClear = $searchBox.children('.js-icon-clear');
search.getSearchInput = function() {
return $searchInput.get(0);
};
search.getVal = function() {
return $searchInput.val();
};
search.setVal = function(val) {
$searchInput.val(val);
};
$searchInput.on('focus', function() {
$(this).addClass('focus');
});
$searchInput.on('blur', function() {
$(this).removeClass('focus');
});
$searchInput.on('input', window.throttle(function() {
var val = $(this).val();
if (val === '' || typeof val !== 'string') {
search.clear && search.clear();
} else {
$searchBox.addClass('not-empty');
search.onInputNotEmpty && search.onInputNotEmpty(val);
}
}, 400));
$searchClear.on('click', function() {
$searchInput.val(''); $searchBox.removeClass('not-empty');
search.clear && search.clear();
});
}
});
})();
</script><div class="search search--dark">
<div class="main">
<div class="search__header">Recherche</div>
<div class="search-bar">
<div class="search-box js-search-box">
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
<input id="search-input" type="text" />
<div class="search-box__icon-clear js-icon-clear">
<a><i class="fas fa-times"></i></a>
</div>
</div>
<button class="button button--theme-dark button--pill search__cancel js-search-toggle">
Annuler</button>
</div>
<div id="results-container" class="search-result js-search-result"></div>
</div>
</div>
<!-- Script pointing to search-script.js -->
<script>/*!
* Simple-Jekyll-Search
* Copyright 2015-2020, Christian Fei
* Licensed under the MIT License.
*/
(function(){
'use strict'
var _$Templater_7 = {
compile: compile,
setOptions: setOptions
}
const options = {}
options.pattern = /\{(.*?)\}/g
options.template = ''
options.middleware = function () {}
function setOptions (_options) {
options.pattern = _options.pattern || options.pattern
options.template = _options.template || options.template
if (typeof _options.middleware === 'function') {
options.middleware = _options.middleware
}
}
function compile (data) {
return options.template.replace(options.pattern, function (match, prop) {
const value = options.middleware(prop, data[prop], options.template)
if (typeof value !== 'undefined') {
return value
}
return data[prop] || match
})
}
'use strict';
function fuzzysearch (needle, haystack) {
var tlen = haystack.length;
var qlen = needle.length;
if (qlen > tlen) {
return false;
}
if (qlen === tlen) {
return needle === haystack;
}
outer: for (var i = 0, j = 0; i < qlen; i++) {
var nch = needle.charCodeAt(i);
while (j < tlen) {
if (haystack.charCodeAt(j++) === nch) {
continue outer;
}
}
return false;
}
return true;
}
var _$fuzzysearch_1 = fuzzysearch;
'use strict'
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
function FuzzySearchStrategy () {
this.matches = function (string, crit) {
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
}
}
'use strict'
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
function LiteralSearchStrategy () {
this.matches = function (str, crit) {
if (!str) return false
str = str.trim().toLowerCase()
crit = crit.trim().toLowerCase()
return crit.split(' ').filter(function (word) {
return str.indexOf(word) >= 0
}).length === crit.split(' ').length
}
}
'use strict'
var _$Repository_4 = {
put: put,
clear: clear,
search: search,
setOptions: __setOptions_4
}
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
function NoSort () {
return 0
}
const data = []
let opt = {}
opt.fuzzy = false
opt.limit = 10
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = NoSort
opt.exclude = []
function put (data) {
if (isObject(data)) {
return addObject(data)
}
if (isArray(data)) {
return addArray(data)
}
return undefined
}
function clear () {
data.length = 0
return data
}
function isObject (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
}
function addObject (_data) {
data.push(_data)
return data
}
function addArray (_data) {
const added = []
clear()
for (let i = 0, len = _data.length; i < len; i++) {
if (isObject(_data[i])) {
added.push(addObject(_data[i]))
}
}
return added
}
function search (crit) {
if (!crit) {
return []
}
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
}
function __setOptions_4 (_opt) {
opt = _opt || {}
opt.fuzzy = _opt.fuzzy || false
opt.limit = _opt.limit || 10
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = _opt.sort || NoSort
opt.exclude = _opt.exclude || []
}
function findMatches (data, crit, strategy, opt) {
const matches = []
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
const match = findMatchesInObject(data[i], crit, strategy, opt)
if (match) {
matches.push(match)
}
}
return matches
}
function findMatchesInObject (obj, crit, strategy, opt) {
for (const key in obj) {
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
return obj
}
}
}
function isExcluded (term, excludedTerms) {
for (let i = 0, len = excludedTerms.length; i < len; i++) {
const excludedTerm = excludedTerms[i]
if (new RegExp(excludedTerm).test(term)) {
return true
}
}
return false
}
/* globals ActiveXObject:false */
'use strict'
var _$JSONLoader_2 = {
load: load
}
function load (location, callback) {
const xhr = getXHR()
xhr.open('GET', location, true)
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
xhr.send()
}
function createStateChangeListener (xhr, callback) {
return function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
callback(null, JSON.parse(xhr.responseText))
} catch (err) {
callback(err, null)
}
}
}
}
function getXHR () {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
}
'use strict'
var _$OptionsValidator_3 = function OptionsValidator (params) {
if (!validateParams(params)) {
throw new Error('-- OptionsValidator: required options missing')
}
if (!(this instanceof OptionsValidator)) {
return new OptionsValidator(params)
}
const requiredOptions = params.required
this.getRequiredOptions = function () {
return requiredOptions
}
this.validate = function (parameters) {
const errors = []
requiredOptions.forEach(function (requiredOptionName) {
if (typeof parameters[requiredOptionName] === 'undefined') {
errors.push(requiredOptionName)
}
})
return errors
}
function validateParams (params) {
if (!params) {
return false
}
return typeof params.required !== 'undefined' && params.required instanceof Array
}
}
'use strict'
var _$utils_9 = {
merge: merge,
isJSON: isJSON
}
function merge (defaultParams, mergeParams) {
const mergedOptions = {}
for (const option in defaultParams) {
mergedOptions[option] = defaultParams[option]
if (typeof mergeParams[option] !== 'undefined') {
mergedOptions[option] = mergeParams[option]
}
}
return mergedOptions
}
function isJSON (json) {
try {
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
return true
}
return false
} catch (err) {
return false
}
}
var _$src_8 = {};
(function (window) {
'use strict'
let options = {
searchInput: null,
resultsContainer: null,
json: [],
success: Function.prototype,
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
templateMiddleware: Function.prototype,
sortMiddleware: function () {
return 0
},
noResultsText: 'No results found',
limit: 10,
fuzzy: false,
debounceTime: null,
exclude: []
}
let debounceTimerHandle
const debounce = function (func, delayMillis) {
if (delayMillis) {
clearTimeout(debounceTimerHandle)
debounceTimerHandle = setTimeout(func, delayMillis)
} else {
func.call()
}
}
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
/* removed: const _$Templater_7 = require('./Templater') */;
/* removed: const _$Repository_4 = require('./Repository') */;
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
const optionsValidator = _$OptionsValidator_3({
required: requiredOptions
})
/* removed: const _$utils_9 = require('./utils') */;
window.SimpleJekyllSearch = function (_options) {
const errors = optionsValidator.validate(_options)
if (errors.length > 0) {
throwError('You must specify the following required options: ' + requiredOptions)
}
options = _$utils_9.merge(options, _options)
_$Templater_7.setOptions({
template: options.searchResultTemplate,
middleware: options.templateMiddleware
})
_$Repository_4.setOptions({
fuzzy: options.fuzzy,
limit: options.limit,
sort: options.sortMiddleware,
exclude: options.exclude
})
if (_$utils_9.isJSON(options.json)) {
initWithJSON(options.json)
} else {
initWithURL(options.json)
}
const rv = {
search: search
}
typeof options.success === 'function' && options.success.call(rv)
return rv
}
function initWithJSON (json) {
_$Repository_4.put(json)
registerInput()
}
function initWithURL (url) {
_$JSONLoader_2.load(url, function (err, json) {
if (err) {
throwError('failed to get JSON (' + url + ')')
}
initWithJSON(json)
})
}
function emptyResultsContainer () {
options.resultsContainer.innerHTML = ''
}
function appendToResultsContainer (text) {
options.resultsContainer.innerHTML += text
}
function registerInput () {
options.searchInput.addEventListener('input', function (e) {
if (isWhitelistedKey(e.which)) {
emptyResultsContainer()
debounce(function () { search(e.target.value) }, options.debounceTime)
}
})
}
function search (query) {
if (isValidQuery(query)) {
emptyResultsContainer()
render(_$Repository_4.search(query), query)
}
}
function render (results, query) {
const len = results.length
if (len === 0) {
return appendToResultsContainer(options.noResultsText)
}
for (let i = 0; i < len; i++) {
results[i].query = query
appendToResultsContainer(_$Templater_7.compile(results[i]))
}
}
function isValidQuery (query) {
return query && query.length > 0
}
function isWhitelistedKey (key) {
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
}
function throwError (message) {
throw new Error('SimpleJekyllSearch --- ' + message)
}
})(window)
}());
</script>
<!-- Configuration -->
<script>
SimpleJekyllSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('results-container'),
noResultsText: '<p>Aucun résultat!</p>',
json: '/search.json',
searchResultTemplate: '<li><a href="{url}">{date}&nbsp;{title}</a>&nbsp;(Création {create})</li>'
})
</script>
</div></div>
<script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function scrollToAnchor(anchor, duration, callback) {
var $root = this;
$root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
callback && callback();
});
}
$.fn.scrollToAnchor = scrollToAnchor;
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function affix(options) {
var $root = this, $window = $(window), $scrollTarget, $scroll,
offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
hasInit = false, curState;
function setOptions(options) {
var _options = options || {};
_options.offsetBottom && (offsetBottom = _options.offsetBottom);
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
_options.scroll && (scroll = _options.scroll);
_options.disabled !== undefined && (disabled = _options.disabled);
$scrollTarget = $(scrollTarget);
isOverallScroller = window.isOverallScroller($scrollTarget[0]);
$scroll = $(scroll);
}
function preCalc() {
top();
rootHeight = $root.outerHeight();
rootTop = $root.offset().top + (isOverallScroller ? 0 : $scrollTarget.scrollTop());
rootLeft = $root.offset().left;
}
function calc(needPreCalc) {
needPreCalc && preCalc();
scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
rootBottomTop = scrollBottom - rootTop;
}
function top() {
if (curState !== 'top') {
$root.removeClass('fixed').css({
left: 0,
top: 0
});
curState = 'top';
}
}
function fixed() {
if (curState !== 'fixed') {
$root.addClass('fixed').css({
left: rootLeft + 'px',
top: 0
});
curState = 'fixed';
}
}
function bottom() {
if (curState !== 'bottom') {
$root.removeClass('fixed').css({
left: 0,
top: rootBottomTop + 'px'
});
curState = 'bottom';
}
}
function setState() {
var scrollTop = $scrollTarget.scrollTop();
if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
fixed();
} else if (scrollTop < rootTop) {
top();
} else {
bottom();
}
}
function init() {
if(!hasInit) {
var interval, timeout;
calc(true); setState();
// run calc every 100 millisecond
interval = setInterval(function() {
calc();
}, 100);
timeout = setTimeout(function() {
clearInterval(interval);
}, 45000);
window.pageLoad.then(function() {
setTimeout(function() {
clearInterval(interval);
clearTimeout(timeout);
}, 3000);
});
$scrollTarget.on('scroll', function() {
disabled || setState();
});
$window.on('resize', function() {
disabled || (calc(true), setState());
});
hasInit = true;
}
}
setOptions(options);
if (!disabled) {
init();
}
$window.on('resize', window.throttle(function() {
init();
}, 200));
return {
setOptions: setOptions,
refresh: function() {
calc(true, { animation: false }); setState();
}
};
}
$.fn.affix = affix;
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function toc(options) {
var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
headingsPos, scrolling = false, hasRendered = false, hasInit = false;
function setOptions(options) {
var _options = options || {};
_options.selectors && (selectors = _options.selectors);
_options.container && (container = _options.container);
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
_options.scroller && (scroller = _options.scroller);
_options.disabled !== undefined && (disabled = _options.disabled);
$headings = $(container).find(selectors).filter('[id]');
$scrollTarget = $(scrollTarget);
$scroller = $(scroller);
}
function calc() {
headingsPos = [];
$headings.each(function() {
headingsPos.push(Math.floor($(this).position().top));
});
}
function setState(element, disabled) {
var scrollTop = $scrollTarget.scrollTop(), i;
if (disabled || !headingsPos || headingsPos.length < 1) { return; }
if (element) {
$activeCur = element;
} else {
for (i = 0; i < headingsPos.length; i++) {
if (scrollTop >= headingsPos[i]) {
$activeCur = $tocLi.eq(i);
} else {
$activeCur || ($activeCur = $tocLi.eq(i));
break;
}
}
}
$activeLast && $activeLast.removeClass('active');
($activeLast = $activeCur).addClass('active');
}
function render() {
if(!hasRendered) {
$root.append($tocUl);
$headings.each(function() {
var $this = $(this);
$tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
.append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
});
$tocLi = $tocUl.children('li');
$tocUl.on('click', 'a', function(e) {
e.preventDefault();
var $this = $(this);
scrolling = true;
setState($this.parent());
$scroller.scrollToAnchor($this.attr('href'), 400, function() {
scrolling = false;
});
});
}
hasRendered = true;
}
function init() {
var interval, timeout;
if(!hasInit) {
render(); calc(); setState(null, scrolling);
// run calc every 100 millisecond
interval = setInterval(function() {
calc();
}, 100);
timeout = setTimeout(function() {
clearInterval(interval);
}, 45000);
window.pageLoad.then(function() {
setTimeout(function() {
clearInterval(interval);
clearTimeout(timeout);
}, 3000);
});
$scrollTarget.on('scroll', function() {
disabled || setState(null, scrolling);
});
$window.on('resize', window.throttle(function() {
if (!disabled) {
render(); calc(); setState(null, scrolling);
}
}, 100));
}
hasInit = true;
}
setOptions(options);
if (!disabled) {
init();
}
$window.on('resize', window.throttle(function() {
init();
}, 200));
return {
setOptions: setOptions
};
}
$.fn.toc = toc;
});
})();
/*(function () {
})();*/
</script><script>
/* toc must before affix, since affix need to konw toc' height. */(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
window.Lazyload.js(SOURCES.jquery, function() {
var $window = $(window);
var $articleContent = $('.js-article-content');
var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
var toc;
var tocDisabled = false;
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
function disabled() {
return $col2.css('display') === 'none' || !hasToc;
}
tocDisabled = disabled();
toc = $tocRoot.toc({
selectors: TOC_SELECTOR,
container: $articleContent,
scrollTarget: hasSidebar ? '.js-page-main' : null,
scroller: hasSidebar ? '.js-page-main' : null,
disabled: tocDisabled
});
$window.on('resize', window.throttle(function() {
tocDisabled = disabled();
toc && toc.setOptions({
disabled: tocDisabled
});
}, 100));
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
var $window = $(window), $pageFooter = $('.js-page-footer');
var $pageAside = $('.js-page-aside');
var affix;
var tocDisabled = false;
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
affix = $pageAside.affix({
offsetBottom: $pageFooter.outerHeight(),
scrollTarget: hasSidebar ? '.js-page-main' : null,
scroller: hasSidebar ? '.js-page-main' : null,
scroll: hasSidebar ? $('.js-page-main').children() : null,
disabled: tocDisabled
});
$window.on('resize', window.throttle(function() {
affix && affix.setOptions({
disabled: tocDisabled
});
}, 100));
window.pageAsideAffix = affix;
});
})();
</script><!---->
</div>
<script>(function () {
var $root = document.getElementsByClassName('root')[0];
if (window.hasEvent('touchstart')) {
$root.dataset.isTouch = true;
document.addEventListener('touchstart', function(){}, false);
}
})();
</script>
</body>
</html>